Linux 内核文件系统与设备操作流程分析(13) } else if (!cdev_get(p)) ret = -ENXIO; // // 如果有效,则调用 cdev_get() 函数继续判断相应设备结构的内核 // 设备对象是否有效,如果无效则表明此设备仍不可用。 // } else if (!cdev_get(p)) ret = -ENXIO; spin_unlock(&cdev_lock); cdev_put(new); // // 如果到此字符设备还无效的话,则返回错误。 // if (ret) return ret; // // 注意:这里使用 cdev->file_operations 函数操作集来 // 填充的 struct file->f_op 这也是我们注册字符设备驱动 // 时所给出的函数集。 // filp->f_op = fops_get(p->ops); // // 如果 struct file->f_op 无效,那么它所指向的函数集 // 肯定也无效,这样的话直接返回错误。注意:这里有一 // 种可能,那就是调用者虽注册了一个字符设备驱动,但是 // 并没有提供相应的操作集,或许调用者认为没有必要。 // if (!filp->f_op) { cdev_put(p); return -ENXIO; }