.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* |
---|
2 | 3 | * linux/fs/isofs/inode.c |
---|
3 | 4 | * |
---|
.. | .. |
---|
28 | 29 | |
---|
29 | 30 | #include "isofs.h" |
---|
30 | 31 | #include "zisofs.h" |
---|
| 32 | + |
---|
| 33 | +/* max tz offset is 13 hours */ |
---|
| 34 | +#define MAX_TZ_OFFSET (52*15*60) |
---|
31 | 35 | |
---|
32 | 36 | #define BEQUIET |
---|
33 | 37 | |
---|
.. | .. |
---|
72 | 76 | return &ei->vfs_inode; |
---|
73 | 77 | } |
---|
74 | 78 | |
---|
75 | | -static void isofs_i_callback(struct rcu_head *head) |
---|
| 79 | +static void isofs_free_inode(struct inode *inode) |
---|
76 | 80 | { |
---|
77 | | - struct inode *inode = container_of(head, struct inode, i_rcu); |
---|
78 | 81 | 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); |
---|
84 | 82 | } |
---|
85 | 83 | |
---|
86 | 84 | static void init_once(void *foo) |
---|
.. | .. |
---|
122 | 120 | |
---|
123 | 121 | static const struct super_operations isofs_sops = { |
---|
124 | 122 | .alloc_inode = isofs_alloc_inode, |
---|
125 | | - .destroy_inode = isofs_destroy_inode, |
---|
| 123 | + .free_inode = isofs_free_inode, |
---|
126 | 124 | .put_super = isofs_put_super, |
---|
127 | 125 | .statfs = isofs_statfs, |
---|
128 | 126 | .remount_fs = isofs_remount, |
---|
.. | .. |
---|
547 | 545 | |
---|
548 | 546 | static unsigned int isofs_get_last_session(struct super_block *sb, s32 session) |
---|
549 | 547 | { |
---|
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; |
---|
554 | 550 | |
---|
555 | | - vol_desc_start=0; |
---|
556 | | - ms_info.addr_format=CDROM_LBA; |
---|
557 | 551 | 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) { |
---|
563 | 560 | 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; |
---|
568 | 565 | } |
---|
569 | 566 | |
---|
570 | 567 | printk(KERN_ERR "ISOFS: Invalid session number or type of track\n"); |
---|
571 | 568 | } |
---|
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) { |
---|
583 | 575 | #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) |
---|
585 | 578 | #endif |
---|
586 | | - vol_desc_start=ms_info.addr.lba; |
---|
| 579 | + vol_desc_start = ms_info.addr.lba; |
---|
| 580 | + } |
---|
| 581 | + } |
---|
| 582 | + |
---|
587 | 583 | return vol_desc_start; |
---|
588 | 584 | } |
---|
589 | 585 | |
---|
.. | .. |
---|
617 | 613 | |
---|
618 | 614 | /* |
---|
619 | 615 | * 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. |
---|
623 | 616 | */ |
---|
624 | 617 | static int isofs_fill_super(struct super_block *s, void *data, int silent) |
---|
625 | 618 | { |
---|
.. | .. |
---|
806 | 799 | * size of a file system, which is 8 TB. |
---|
807 | 800 | */ |
---|
808 | 801 | 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; |
---|
809 | 806 | |
---|
810 | 807 | /* Set this for reference. Its not currently used except on write |
---|
811 | 808 | which we don't have .. */ |
---|
.. | .. |
---|
1040 | 1037 | buf->f_bavail = 0; |
---|
1041 | 1038 | buf->f_files = ISOFS_SB(sb)->s_ninodes; |
---|
1042 | 1039 | 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); |
---|
1045 | 1041 | buf->f_namelen = NAME_MAX; |
---|
1046 | 1042 | return 0; |
---|
1047 | 1043 | } |
---|
.. | .. |
---|
1182 | 1178 | return mpage_readpage(page, isofs_get_block); |
---|
1183 | 1179 | } |
---|
1184 | 1180 | |
---|
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) |
---|
1187 | 1182 | { |
---|
1188 | | - return mpage_readpages(mapping, pages, nr_pages, isofs_get_block); |
---|
| 1183 | + mpage_readahead(rac, isofs_get_block); |
---|
1189 | 1184 | } |
---|
1190 | 1185 | |
---|
1191 | 1186 | static sector_t _isofs_bmap(struct address_space *mapping, sector_t block) |
---|
.. | .. |
---|
1195 | 1190 | |
---|
1196 | 1191 | static const struct address_space_operations isofs_aops = { |
---|
1197 | 1192 | .readpage = isofs_readpage, |
---|
1198 | | - .readpages = isofs_readpages, |
---|
| 1193 | + .readahead = isofs_readahead, |
---|
1199 | 1194 | .bmap = _isofs_bmap |
---|
1200 | 1195 | }; |
---|
1201 | 1196 | |
---|
.. | .. |
---|
1617 | 1612 | module_init(init_iso9660_fs) |
---|
1618 | 1613 | module_exit(exit_iso9660_fs) |
---|
1619 | 1614 | MODULE_LICENSE("GPL"); |
---|
| 1615 | +MODULE_IMPORT_NS(ANDROID_GKI_VFS_EXPORT_ONLY); |
---|