Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 核心 2.6.38+ 移除 open_by_devnum:改用 blkdev_get_by_dev 遷移指南

編輯:Linux 教學

Linux 核心 2.6.37 起移除 open_by_devnum(),模組編譯會報錯。官方以 blkdev_get_by_dev() 取代,功能相同但介面更完整。本文說明遷移方法與相關核心提交內容。

錯誤現象


error: implicit declaration of function 'open_by_devnum'
error: 'open_by_devnum' undeclared

遷移對照

舊介面 (已移除)新介面 (2.6.37+)說明
open_by_devnum(dev_t dev, fmode_t mode)blkdev_get_by_dev(dev_t dev, fmode_t mode, void *holder)功能相同,新增 holder 參數
open_bdev_exclusive(...)blkdev_get_by_path(const char *path, fmode_t mode, void *holder)以路徑而非 dev_t 開啟

核心提交摘要 (commit 7/5)

  • blkdev_get_by_dev() 完全對應 open_by_devnum()
  • blkdev_get_by_path() 差異:不自動加入 FMODE_EXCL 到 mode
  • 所有核心內部呼叫端已同步遷移 (btrfs, gfs2, nilfs2, mount_bdev 等)
  • 新增 WARN_ON_ONCE() 檢查 sb->s_mode 必含 FMODE_EXCL
  • 完整 DocBook 註解文件化

模組碼修改範例


// 舊碼
struct block_device *bdev = open_by_devnum(dev, FMODE_READ | FMODE_WRITE);

// 新碼
struct block_device *bdev = blkdev_get_by_dev(dev, FMODE_READ | FMODE_WRITE, NULL);
// holder 傳 NULL 即可,若需持有者追蹤可傳 this_module 或裝置指標

注意事項

  • 引入標頭:#include
  • 配對釋放:blkdev_put(bdev, mode) (對應舊 blkdev_put)
  • 若模組需支援舊核心 (≤2.6.36) 可用巨集判斷:
    #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)

同步核心 API 變更,確保模組長期可維護。

Copyright © Windows教程網 All Rights Reserved