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 開啟 |
blkdev_get_by_dev() 完全對應 open_by_devnum()blkdev_get_by_path() 差異:不自動加入 FMODE_EXCL 到 modeWARN_ON_ONCE() 檢查 sb->s_mode 必含 FMODE_EXCL
// 舊碼
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)#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)同步核心 API 變更,確保模組長期可維護。