hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
kernel/fs/udf/lowlevel.c
....@@ -27,41 +27,38 @@
2727
2828 unsigned int udf_get_last_session(struct super_block *sb)
2929 {
30
+ struct cdrom_device_info *cdi = disk_to_cdi(sb->s_bdev->bd_disk);
3031 struct cdrom_multisession ms_info;
31
- unsigned int vol_desc_start;
32
- struct block_device *bdev = sb->s_bdev;
33
- int i;
3432
35
- vol_desc_start = 0;
33
+ if (!cdi) {
34
+ udf_debug("CDROMMULTISESSION not supported.\n");
35
+ return 0;
36
+ }
37
+
3638 ms_info.addr_format = CDROM_LBA;
37
- i = ioctl_by_bdev(bdev, CDROMMULTISESSION, (unsigned long)&ms_info);
38
-
39
- if (i == 0) {
39
+ if (cdrom_multisession(cdi, &ms_info) == 0) {
4040 udf_debug("XA disk: %s, vol_desc_start=%d\n",
4141 ms_info.xa_flag ? "yes" : "no", ms_info.addr.lba);
4242 if (ms_info.xa_flag) /* necessary for a valid ms_info.addr */
43
- vol_desc_start = ms_info.addr.lba;
44
- } else {
45
- udf_debug("CDROMMULTISESSION not supported: rc=%d\n", i);
43
+ return ms_info.addr.lba;
4644 }
47
- return vol_desc_start;
45
+ return 0;
4846 }
4947
5048 unsigned long udf_get_last_block(struct super_block *sb)
5149 {
5250 struct block_device *bdev = sb->s_bdev;
51
+ struct cdrom_device_info *cdi = disk_to_cdi(bdev->bd_disk);
5352 unsigned long lblock = 0;
5453
5554 /*
56
- * ioctl failed or returned obviously bogus value?
55
+ * The cdrom layer call failed or returned obviously bogus value?
5756 * Try using the device size...
5857 */
59
- if (ioctl_by_bdev(bdev, CDROM_LAST_WRITTEN, (unsigned long) &lblock) ||
60
- lblock == 0)
58
+ if (!cdi || cdrom_get_last_written(cdi, &lblock) || lblock == 0)
6159 lblock = i_size_read(bdev->bd_inode) >> sb->s_blocksize_bits;
6260
6361 if (lblock)
6462 return lblock - 1;
65
- else
66
- return 0;
63
+ return 0;
6764 }