hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/fs/hfsplus/wrapper.c
....@@ -127,31 +127,34 @@
127127 static int hfsplus_get_last_session(struct super_block *sb,
128128 sector_t *start, sector_t *size)
129129 {
130
- struct cdrom_multisession ms_info;
131
- struct cdrom_tocentry te;
132
- int res;
130
+ struct cdrom_device_info *cdi = disk_to_cdi(sb->s_bdev->bd_disk);
133131
134132 /* default values */
135133 *start = 0;
136134 *size = i_size_read(sb->s_bdev->bd_inode) >> 9;
137135
138136 if (HFSPLUS_SB(sb)->session >= 0) {
137
+ struct cdrom_tocentry te;
138
+
139
+ if (!cdi)
140
+ return -EINVAL;
141
+
139142 te.cdte_track = HFSPLUS_SB(sb)->session;
140143 te.cdte_format = CDROM_LBA;
141
- res = ioctl_by_bdev(sb->s_bdev,
142
- CDROMREADTOCENTRY, (unsigned long)&te);
143
- if (!res && (te.cdte_ctrl & CDROM_DATA_TRACK) == 4) {
144
- *start = (sector_t)te.cdte_addr.lba << 2;
145
- return 0;
144
+ if (cdrom_read_tocentry(cdi, &te) ||
145
+ (te.cdte_ctrl & CDROM_DATA_TRACK) != 4) {
146
+ pr_err("invalid session number or type of track\n");
147
+ return -EINVAL;
146148 }
147
- pr_err("invalid session number or type of track\n");
148
- return -EINVAL;
149
+ *start = (sector_t)te.cdte_addr.lba << 2;
150
+ } else if (cdi) {
151
+ struct cdrom_multisession ms_info;
152
+
153
+ ms_info.addr_format = CDROM_LBA;
154
+ if (cdrom_multisession(cdi, &ms_info) == 0 && ms_info.xa_flag)
155
+ *start = (sector_t)ms_info.addr.lba << 2;
149156 }
150
- ms_info.addr_format = CDROM_LBA;
151
- res = ioctl_by_bdev(sb->s_bdev, CDROMMULTISESSION,
152
- (unsigned long)&ms_info);
153
- if (!res && ms_info.xa_flag)
154
- *start = (sector_t)ms_info.addr.lba << 2;
157
+
155158 return 0;
156159 }
157160
....@@ -192,7 +195,7 @@
192195 switch (sbi->s_vhdr->signature) {
193196 case cpu_to_be16(HFSPLUS_VOLHEAD_SIGX):
194197 set_bit(HFSPLUS_SB_HFSX, &sbi->flags);
195
- /*FALLTHRU*/
198
+ fallthrough;
196199 case cpu_to_be16(HFSPLUS_VOLHEAD_SIG):
197200 break;
198201 case cpu_to_be16(HFSP_WRAP_MAGIC):