hc
2024-02-20 e636c8d336489bf3eed5878299e6cc045bbad077
kernel/fs/isofs/inode.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * linux/fs/isofs/inode.c
34 *
....@@ -28,6 +29,9 @@
2829
2930 #include "isofs.h"
3031 #include "zisofs.h"
32
+
33
+/* max tz offset is 13 hours */
34
+#define MAX_TZ_OFFSET (52*15*60)
3135
3236 #define BEQUIET
3337
....@@ -72,15 +76,9 @@
7276 return &ei->vfs_inode;
7377 }
7478
75
-static void isofs_i_callback(struct rcu_head *head)
79
+static void isofs_free_inode(struct inode *inode)
7680 {
77
- struct inode *inode = container_of(head, struct inode, i_rcu);
7881 kmem_cache_free(isofs_inode_cachep, ISOFS_I(inode));
79
-}
80
-
81
-static void isofs_destroy_inode(struct inode *inode)
82
-{
83
- call_rcu(&inode->i_rcu, isofs_i_callback);
8482 }
8583
8684 static void init_once(void *foo)
....@@ -122,7 +120,7 @@
122120
123121 static const struct super_operations isofs_sops = {
124122 .alloc_inode = isofs_alloc_inode,
125
- .destroy_inode = isofs_destroy_inode,
123
+ .free_inode = isofs_free_inode,
126124 .put_super = isofs_put_super,
127125 .statfs = isofs_statfs,
128126 .remount_fs = isofs_remount,
....@@ -547,43 +545,41 @@
547545
548546 static unsigned int isofs_get_last_session(struct super_block *sb, s32 session)
549547 {
550
- struct cdrom_multisession ms_info;
551
- unsigned int vol_desc_start;
552
- struct block_device *bdev = sb->s_bdev;
553
- int i;
548
+ struct cdrom_device_info *cdi = disk_to_cdi(sb->s_bdev->bd_disk);
549
+ unsigned int vol_desc_start = 0;
554550
555
- vol_desc_start=0;
556
- ms_info.addr_format=CDROM_LBA;
557551 if (session > 0) {
558
- struct cdrom_tocentry Te;
559
- Te.cdte_track=session;
560
- Te.cdte_format=CDROM_LBA;
561
- i = ioctl_by_bdev(bdev, CDROMREADTOCENTRY, (unsigned long) &Te);
562
- if (!i) {
552
+ struct cdrom_tocentry te;
553
+
554
+ if (!cdi)
555
+ return 0;
556
+
557
+ te.cdte_track = session;
558
+ te.cdte_format = CDROM_LBA;
559
+ if (cdrom_read_tocentry(cdi, &te) == 0) {
563560 printk(KERN_DEBUG "ISOFS: Session %d start %d type %d\n",
564
- session, Te.cdte_addr.lba,
565
- Te.cdte_ctrl&CDROM_DATA_TRACK);
566
- if ((Te.cdte_ctrl&CDROM_DATA_TRACK) == 4)
567
- return Te.cdte_addr.lba;
561
+ session, te.cdte_addr.lba,
562
+ te.cdte_ctrl & CDROM_DATA_TRACK);
563
+ if ((te.cdte_ctrl & CDROM_DATA_TRACK) == 4)
564
+ return te.cdte_addr.lba;
568565 }
569566
570567 printk(KERN_ERR "ISOFS: Invalid session number or type of track\n");
571568 }
572
- i = ioctl_by_bdev(bdev, CDROMMULTISESSION, (unsigned long) &ms_info);
573
- if (session > 0)
574
- printk(KERN_ERR "ISOFS: Invalid session number\n");
575
-#if 0
576
- printk(KERN_DEBUG "isofs.inode: CDROMMULTISESSION: rc=%d\n",i);
577
- if (i==0) {
578
- printk(KERN_DEBUG "isofs.inode: XA disk: %s\n",ms_info.xa_flag?"yes":"no");
579
- printk(KERN_DEBUG "isofs.inode: vol_desc_start = %d\n", ms_info.addr.lba);
580
- }
581
-#endif
582
- if (i==0)
569
+
570
+ if (cdi) {
571
+ struct cdrom_multisession ms_info;
572
+
573
+ ms_info.addr_format = CDROM_LBA;
574
+ if (cdrom_multisession(cdi, &ms_info) == 0) {
583575 #if WE_OBEY_THE_WRITTEN_STANDARDS
584
- if (ms_info.xa_flag) /* necessary for a valid ms_info.addr */
576
+ /* necessary for a valid ms_info.addr */
577
+ if (ms_info.xa_flag)
585578 #endif
586
- vol_desc_start=ms_info.addr.lba;
579
+ vol_desc_start = ms_info.addr.lba;
580
+ }
581
+ }
582
+
587583 return vol_desc_start;
588584 }
589585
....@@ -617,9 +613,6 @@
617613
618614 /*
619615 * Initialize the superblock and read the root inode.
620
- *
621
- * Note: a check_disk_change() has been done immediately prior
622
- * to this call, so we don't need to check again.
623616 */
624617 static int isofs_fill_super(struct super_block *s, void *data, int silent)
625618 {
....@@ -806,6 +799,10 @@
806799 * size of a file system, which is 8 TB.
807800 */
808801 s->s_maxbytes = 0x80000000000LL;
802
+
803
+ /* ECMA-119 timestamp from 1900/1/1 with tz offset */
804
+ s->s_time_min = mktime64(1900, 1, 1, 0, 0, 0) - MAX_TZ_OFFSET;
805
+ s->s_time_max = mktime64(U8_MAX+1900, 12, 31, 23, 59, 59) + MAX_TZ_OFFSET;
809806
810807 /* Set this for reference. Its not currently used except on write
811808 which we don't have .. */
....@@ -1040,8 +1037,7 @@
10401037 buf->f_bavail = 0;
10411038 buf->f_files = ISOFS_SB(sb)->s_ninodes;
10421039 buf->f_ffree = 0;
1043
- buf->f_fsid.val[0] = (u32)id;
1044
- buf->f_fsid.val[1] = (u32)(id >> 32);
1040
+ buf->f_fsid = u64_to_fsid(id);
10451041 buf->f_namelen = NAME_MAX;
10461042 return 0;
10471043 }
....@@ -1182,10 +1178,9 @@
11821178 return mpage_readpage(page, isofs_get_block);
11831179 }
11841180
1185
-static int isofs_readpages(struct file *file, struct address_space *mapping,
1186
- struct list_head *pages, unsigned nr_pages)
1181
+static void isofs_readahead(struct readahead_control *rac)
11871182 {
1188
- return mpage_readpages(mapping, pages, nr_pages, isofs_get_block);
1183
+ mpage_readahead(rac, isofs_get_block);
11891184 }
11901185
11911186 static sector_t _isofs_bmap(struct address_space *mapping, sector_t block)
....@@ -1195,7 +1190,7 @@
11951190
11961191 static const struct address_space_operations isofs_aops = {
11971192 .readpage = isofs_readpage,
1198
- .readpages = isofs_readpages,
1193
+ .readahead = isofs_readahead,
11991194 .bmap = _isofs_bmap
12001195 };
12011196
....@@ -1617,3 +1612,4 @@
16171612 module_init(init_iso9660_fs)
16181613 module_exit(exit_iso9660_fs)
16191614 MODULE_LICENSE("GPL");
1615
+MODULE_IMPORT_NS(ANDROID_GKI_VFS_EXPORT_ONLY);