hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/fs/hfs/mdb.c
....@@ -32,29 +32,35 @@
3232 static int hfs_get_last_session(struct super_block *sb,
3333 sector_t *start, sector_t *size)
3434 {
35
- struct cdrom_multisession ms_info;
36
- struct cdrom_tocentry te;
37
- int res;
35
+ struct cdrom_device_info *cdi = disk_to_cdi(sb->s_bdev->bd_disk);
3836
3937 /* default values */
4038 *start = 0;
4139 *size = i_size_read(sb->s_bdev->bd_inode) >> 9;
4240
4341 if (HFS_SB(sb)->session >= 0) {
42
+ struct cdrom_tocentry te;
43
+
44
+ if (!cdi)
45
+ return -EINVAL;
46
+
4447 te.cdte_track = HFS_SB(sb)->session;
4548 te.cdte_format = CDROM_LBA;
46
- res = ioctl_by_bdev(sb->s_bdev, CDROMREADTOCENTRY, (unsigned long)&te);
47
- if (!res && (te.cdte_ctrl & CDROM_DATA_TRACK) == 4) {
48
- *start = (sector_t)te.cdte_addr.lba << 2;
49
- return 0;
49
+ if (cdrom_read_tocentry(cdi, &te) ||
50
+ (te.cdte_ctrl & CDROM_DATA_TRACK) != 4) {
51
+ pr_err("invalid session number or type of track\n");
52
+ return -EINVAL;
5053 }
51
- pr_err("invalid session number or type of track\n");
52
- return -EINVAL;
54
+
55
+ *start = (sector_t)te.cdte_addr.lba << 2;
56
+ } else if (cdi) {
57
+ struct cdrom_multisession ms_info;
58
+
59
+ ms_info.addr_format = CDROM_LBA;
60
+ if (cdrom_multisession(cdi, &ms_info) == 0 && ms_info.xa_flag)
61
+ *start = (sector_t)ms_info.addr.lba << 2;
5362 }
54
- ms_info.addr_format = CDROM_LBA;
55
- res = ioctl_by_bdev(sb->s_bdev, CDROMMULTISESSION, (unsigned long)&ms_info);
56
- if (!res && ms_info.xa_flag)
57
- *start = (sector_t)ms_info.addr.lba << 2;
63
+
5864 return 0;
5965 }
6066