|
@@ -528,58 +528,12 @@ static int ide_driver_proc_open(struct inode *inode, struct file *file)
|
|
|
return single_open(file, ide_driver_proc_show, PDE_DATA(inode));
|
|
|
}
|
|
|
|
|
|
-static int ide_replace_subdriver(ide_drive_t *drive, const char *driver)
|
|
|
-{
|
|
|
- struct device *dev = &drive->gendev;
|
|
|
- int ret = 1;
|
|
|
- int err;
|
|
|
-
|
|
|
- device_release_driver(dev);
|
|
|
- /* FIXME: device can still be in use by previous driver */
|
|
|
- strlcpy(drive->driver_req, driver, sizeof(drive->driver_req));
|
|
|
- err = device_attach(dev);
|
|
|
- if (err < 0)
|
|
|
- printk(KERN_WARNING "IDE: %s: device_attach error: %d\n",
|
|
|
- __func__, err);
|
|
|
- drive->driver_req[0] = 0;
|
|
|
- if (dev->driver == NULL) {
|
|
|
- err = device_attach(dev);
|
|
|
- if (err < 0)
|
|
|
- printk(KERN_WARNING
|
|
|
- "IDE: %s: device_attach(2) error: %d\n",
|
|
|
- __func__, err);
|
|
|
- }
|
|
|
- if (dev->driver && !strcmp(dev->driver->name, driver))
|
|
|
- ret = 0;
|
|
|
-
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
-static ssize_t ide_driver_proc_write(struct file *file, const char __user *buffer,
|
|
|
- size_t count, loff_t *pos)
|
|
|
-{
|
|
|
- ide_drive_t *drive = PDE_DATA(file_inode(file));
|
|
|
- char name[32];
|
|
|
-
|
|
|
- if (!capable(CAP_SYS_ADMIN))
|
|
|
- return -EACCES;
|
|
|
- if (count > 31)
|
|
|
- count = 31;
|
|
|
- if (copy_from_user(name, buffer, count))
|
|
|
- return -EFAULT;
|
|
|
- name[count] = '\0';
|
|
|
- if (ide_replace_subdriver(drive, name))
|
|
|
- return -EINVAL;
|
|
|
- return count;
|
|
|
-}
|
|
|
-
|
|
|
static const struct file_operations ide_driver_proc_fops = {
|
|
|
.owner = THIS_MODULE,
|
|
|
.open = ide_driver_proc_open,
|
|
|
.read = seq_read,
|
|
|
.llseek = seq_lseek,
|
|
|
.release = single_release,
|
|
|
- .write = ide_driver_proc_write,
|
|
|
};
|
|
|
|
|
|
static int ide_media_proc_show(struct seq_file *m, void *v)
|