Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next
[openwrt/staging/blogic.git] / drivers / cdrom / cdrom.c
index e3bbe108eb542fc953bbcea544e0bd944ffe272c..a0a7ae705de87e850e165f2069a9179fad1589a5 100644 (file)
@@ -586,7 +586,7 @@ static int cdrom_mrw_set_lba_space(struct cdrom_device_info *cdi, int space)
        return 0;
 }
 
-int register_cdrom(struct cdrom_device_info *cdi)
+int register_cdrom(struct gendisk *disk, struct cdrom_device_info *cdi)
 {
        static char banner_printed;
        const struct cdrom_device_ops *cdo = cdi->ops;
@@ -601,6 +601,9 @@ int register_cdrom(struct cdrom_device_info *cdi)
                cdrom_sysctl_register();
        }
 
+       cdi->disk = disk;
+       disk->cdi = cdi;
+
        ENSURE(cdo, drive_status, CDC_DRIVE_STATUS);
        if (cdo->check_events == NULL && cdo->media_changed == NULL)
                WARN_ON_ONCE(cdo->capability & (CDC_MEDIA_CHANGED | CDC_SELECT_DISC));
@@ -2292,37 +2295,46 @@ retry:
        return cdrom_read_cdda_old(cdi, ubuf, lba, nframes);    
 }
 
-static int cdrom_ioctl_multisession(struct cdrom_device_info *cdi,
-               void __user *argp)
+int cdrom_multisession(struct cdrom_device_info *cdi,
+               struct cdrom_multisession *info)
 {
-       struct cdrom_multisession ms_info;
        u8 requested_format;
        int ret;
 
-       cd_dbg(CD_DO_IOCTL, "entering CDROMMULTISESSION\n");
-
        if (!(cdi->ops->capability & CDC_MULTI_SESSION))
                return -ENOSYS;
 
-       if (copy_from_user(&ms_info, argp, sizeof(ms_info)))
-               return -EFAULT;
-
-       requested_format = ms_info.addr_format;
+       requested_format = info->addr_format;
        if (requested_format != CDROM_MSF && requested_format != CDROM_LBA)
                return -EINVAL;
-       ms_info.addr_format = CDROM_LBA;
+       info->addr_format = CDROM_LBA;
 
-       ret = cdi->ops->get_last_session(cdi, &ms_info);
-       if (ret)
-               return ret;
+       ret = cdi->ops->get_last_session(cdi, info);
+       if (!ret)
+               sanitize_format(&info->addr, &info->addr_format,
+                               requested_format);
+       return ret;
+}
+EXPORT_SYMBOL_GPL(cdrom_multisession);
 
-       sanitize_format(&ms_info.addr, &ms_info.addr_format, requested_format);
+static int cdrom_ioctl_multisession(struct cdrom_device_info *cdi,
+               void __user *argp)
+{
+       struct cdrom_multisession info;
+       int ret;
+
+       cd_dbg(CD_DO_IOCTL, "entering CDROMMULTISESSION\n");
 
-       if (copy_to_user(argp, &ms_info, sizeof(ms_info)))
+       if (copy_from_user(&info, argp, sizeof(info)))
+               return -EFAULT;
+       ret = cdrom_multisession(cdi, &info);
+       if (ret)
+               return ret;
+       if (copy_to_user(argp, &info, sizeof(info)))
                return -EFAULT;
 
        cd_dbg(CD_DO_IOCTL, "CDROMMULTISESSION successful\n");
-       return 0;
+       return ret;
 }
 
 static int cdrom_ioctl_eject(struct cdrom_device_info *cdi)
@@ -2663,32 +2675,37 @@ static int cdrom_ioctl_read_tochdr(struct cdrom_device_info *cdi,
        return 0;
 }
 
+int cdrom_read_tocentry(struct cdrom_device_info *cdi,
+               struct cdrom_tocentry *entry)
+{
+       u8 requested_format = entry->cdte_format;
+       int ret;
+
+       if (requested_format != CDROM_MSF && requested_format != CDROM_LBA)
+               return -EINVAL;
+
+       /* make interface to low-level uniform */
+       entry->cdte_format = CDROM_MSF;
+       ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, entry);
+       if (!ret)
+               sanitize_format(&entry->cdte_addr, &entry->cdte_format,
+                               requested_format);
+       return ret;
+}
+EXPORT_SYMBOL_GPL(cdrom_read_tocentry);
+
 static int cdrom_ioctl_read_tocentry(struct cdrom_device_info *cdi,
                void __user *argp)
 {
        struct cdrom_tocentry entry;
-       u8 requested_format;
        int ret;
 
-       /* cd_dbg(CD_DO_IOCTL, "entering CDROMREADTOCENTRY\n"); */
-
        if (copy_from_user(&entry, argp, sizeof(entry)))
                return -EFAULT;
-
-       requested_format = entry.cdte_format;
-       if (requested_format != CDROM_MSF && requested_format != CDROM_LBA)
-               return -EINVAL;
-       /* make interface to low-level uniform */
-       entry.cdte_format = CDROM_MSF;
-       ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &entry);
-       if (ret)
-               return ret;
-       sanitize_format(&entry.cdte_addr, &entry.cdte_format, requested_format);
-
-       if (copy_to_user(argp, &entry, sizeof(entry)))
+       ret = cdrom_read_tocentry(cdi, &entry);
+       if (!ret && copy_to_user(argp, &entry, sizeof(entry)))
                return -EFAULT;
-       /* cd_dbg(CD_DO_IOCTL, "CDROMREADTOCENTRY successful\n"); */
-       return 0;
+       return ret;
 }
 
 static int cdrom_ioctl_play_msf(struct cdrom_device_info *cdi,