diff options
Diffstat (limited to 'include/linux/fs.h')
| -rw-r--r-- | include/linux/fs.h | 121 |
1 files changed, 74 insertions, 47 deletions
diff --git a/include/linux/fs.h b/include/linux/fs.h index 334d68a17108..32b38cd829d3 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -34,9 +34,9 @@ | |||
| 34 | #define SEEK_MAX SEEK_END | 34 | #define SEEK_MAX SEEK_END |
| 35 | 35 | ||
| 36 | struct fstrim_range { | 36 | struct fstrim_range { |
| 37 | uint64_t start; | 37 | __u64 start; |
| 38 | uint64_t len; | 38 | __u64 len; |
| 39 | uint64_t minlen; | 39 | __u64 minlen; |
| 40 | }; | 40 | }; |
| 41 | 41 | ||
| 42 | /* And dynamically-tunable limits and defaults: */ | 42 | /* And dynamically-tunable limits and defaults: */ |
| @@ -242,6 +242,7 @@ struct inodes_stat_t { | |||
| 242 | #define S_SWAPFILE 256 /* Do not truncate: swapon got its bmaps */ | 242 | #define S_SWAPFILE 256 /* Do not truncate: swapon got its bmaps */ |
| 243 | #define S_PRIVATE 512 /* Inode is fs-internal */ | 243 | #define S_PRIVATE 512 /* Inode is fs-internal */ |
| 244 | #define S_IMA 1024 /* Inode has an associated IMA struct */ | 244 | #define S_IMA 1024 /* Inode has an associated IMA struct */ |
| 245 | #define S_AUTOMOUNT 2048 /* Automount/referral quasi-directory */ | ||
| 245 | 246 | ||
| 246 | /* | 247 | /* |
| 247 | * Note that nosuid etc flags are inode-specific: setting some file-system | 248 | * Note that nosuid etc flags are inode-specific: setting some file-system |
| @@ -277,6 +278,7 @@ struct inodes_stat_t { | |||
| 277 | #define IS_SWAPFILE(inode) ((inode)->i_flags & S_SWAPFILE) | 278 | #define IS_SWAPFILE(inode) ((inode)->i_flags & S_SWAPFILE) |
| 278 | #define IS_PRIVATE(inode) ((inode)->i_flags & S_PRIVATE) | 279 | #define IS_PRIVATE(inode) ((inode)->i_flags & S_PRIVATE) |
| 279 | #define IS_IMA(inode) ((inode)->i_flags & S_IMA) | 280 | #define IS_IMA(inode) ((inode)->i_flags & S_IMA) |
| 281 | #define IS_AUTOMOUNT(inode) ((inode)->i_flags & S_AUTOMOUNT) | ||
| 280 | 282 | ||
| 281 | /* the read-only stuff doesn't really belong here, but any other place is | 283 | /* the read-only stuff doesn't really belong here, but any other place is |
| 282 | probably as bad and I don't want to create yet another include file. */ | 284 | probably as bad and I don't want to create yet another include file. */ |
| @@ -382,7 +384,6 @@ struct inodes_stat_t { | |||
| 382 | #include <linux/path.h> | 384 | #include <linux/path.h> |
| 383 | #include <linux/stat.h> | 385 | #include <linux/stat.h> |
| 384 | #include <linux/cache.h> | 386 | #include <linux/cache.h> |
| 385 | #include <linux/kobject.h> | ||
| 386 | #include <linux/list.h> | 387 | #include <linux/list.h> |
| 387 | #include <linux/radix-tree.h> | 388 | #include <linux/radix-tree.h> |
| 388 | #include <linux/prio_tree.h> | 389 | #include <linux/prio_tree.h> |
| @@ -392,6 +393,7 @@ struct inodes_stat_t { | |||
| 392 | #include <linux/capability.h> | 393 | #include <linux/capability.h> |
| 393 | #include <linux/semaphore.h> | 394 | #include <linux/semaphore.h> |
| 394 | #include <linux/fiemap.h> | 395 | #include <linux/fiemap.h> |
| 396 | #include <linux/rculist_bl.h> | ||
| 395 | 397 | ||
| 396 | #include <asm/atomic.h> | 398 | #include <asm/atomic.h> |
| 397 | #include <asm/byteorder.h> | 399 | #include <asm/byteorder.h> |
| @@ -401,6 +403,7 @@ struct hd_geometry; | |||
| 401 | struct iovec; | 403 | struct iovec; |
| 402 | struct nameidata; | 404 | struct nameidata; |
| 403 | struct kiocb; | 405 | struct kiocb; |
| 406 | struct kobject; | ||
| 404 | struct pipe_inode_info; | 407 | struct pipe_inode_info; |
| 405 | struct poll_table_struct; | 408 | struct poll_table_struct; |
| 406 | struct kstatfs; | 409 | struct kstatfs; |
| @@ -602,6 +605,7 @@ struct address_space_operations { | |||
| 602 | sector_t (*bmap)(struct address_space *, sector_t); | 605 | sector_t (*bmap)(struct address_space *, sector_t); |
| 603 | void (*invalidatepage) (struct page *, unsigned long); | 606 | void (*invalidatepage) (struct page *, unsigned long); |
| 604 | int (*releasepage) (struct page *, gfp_t); | 607 | int (*releasepage) (struct page *, gfp_t); |
| 608 | void (*freepage)(struct page *); | ||
| 605 | ssize_t (*direct_IO)(int, struct kiocb *, const struct iovec *iov, | 609 | ssize_t (*direct_IO)(int, struct kiocb *, const struct iovec *iov, |
| 606 | loff_t offset, unsigned long nr_segs); | 610 | loff_t offset, unsigned long nr_segs); |
| 607 | int (*get_xip_mem)(struct address_space *, pgoff_t, int, | 611 | int (*get_xip_mem)(struct address_space *, pgoff_t, int, |
| @@ -662,8 +666,9 @@ struct block_device { | |||
| 662 | void * bd_claiming; | 666 | void * bd_claiming; |
| 663 | void * bd_holder; | 667 | void * bd_holder; |
| 664 | int bd_holders; | 668 | int bd_holders; |
| 669 | bool bd_write_holder; | ||
| 665 | #ifdef CONFIG_SYSFS | 670 | #ifdef CONFIG_SYSFS |
| 666 | struct list_head bd_holder_list; | 671 | struct list_head bd_holder_disks; |
| 667 | #endif | 672 | #endif |
| 668 | struct block_device * bd_contains; | 673 | struct block_device * bd_contains; |
| 669 | unsigned bd_block_size; | 674 | unsigned bd_block_size; |
| @@ -732,16 +737,31 @@ struct posix_acl; | |||
| 732 | #define ACL_NOT_CACHED ((void *)(-1)) | 737 | #define ACL_NOT_CACHED ((void *)(-1)) |
| 733 | 738 | ||
| 734 | struct inode { | 739 | struct inode { |
| 740 | /* RCU path lookup touches following: */ | ||
| 741 | umode_t i_mode; | ||
| 742 | uid_t i_uid; | ||
| 743 | gid_t i_gid; | ||
| 744 | const struct inode_operations *i_op; | ||
| 745 | struct super_block *i_sb; | ||
| 746 | |||
| 747 | spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ | ||
| 748 | unsigned int i_flags; | ||
| 749 | struct mutex i_mutex; | ||
| 750 | |||
| 751 | unsigned long i_state; | ||
| 752 | unsigned long dirtied_when; /* jiffies of first dirtying */ | ||
| 753 | |||
| 735 | struct hlist_node i_hash; | 754 | struct hlist_node i_hash; |
| 736 | struct list_head i_wb_list; /* backing dev IO list */ | 755 | struct list_head i_wb_list; /* backing dev IO list */ |
| 737 | struct list_head i_lru; /* inode LRU list */ | 756 | struct list_head i_lru; /* inode LRU list */ |
| 738 | struct list_head i_sb_list; | 757 | struct list_head i_sb_list; |
| 739 | struct list_head i_dentry; | 758 | union { |
| 759 | struct list_head i_dentry; | ||
| 760 | struct rcu_head i_rcu; | ||
| 761 | }; | ||
| 740 | unsigned long i_ino; | 762 | unsigned long i_ino; |
| 741 | atomic_t i_count; | 763 | atomic_t i_count; |
| 742 | unsigned int i_nlink; | 764 | unsigned int i_nlink; |
| 743 | uid_t i_uid; | ||
| 744 | gid_t i_gid; | ||
| 745 | dev_t i_rdev; | 765 | dev_t i_rdev; |
| 746 | unsigned int i_blkbits; | 766 | unsigned int i_blkbits; |
| 747 | u64 i_version; | 767 | u64 i_version; |
| @@ -754,13 +774,8 @@ struct inode { | |||
| 754 | struct timespec i_ctime; | 774 | struct timespec i_ctime; |
| 755 | blkcnt_t i_blocks; | 775 | blkcnt_t i_blocks; |
| 756 | unsigned short i_bytes; | 776 | unsigned short i_bytes; |
| 757 | umode_t i_mode; | ||
| 758 | spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ | ||
| 759 | struct mutex i_mutex; | ||
| 760 | struct rw_semaphore i_alloc_sem; | 777 | struct rw_semaphore i_alloc_sem; |
| 761 | const struct inode_operations *i_op; | ||
| 762 | const struct file_operations *i_fop; /* former ->i_op->default_file_ops */ | 778 | const struct file_operations *i_fop; /* former ->i_op->default_file_ops */ |
| 763 | struct super_block *i_sb; | ||
| 764 | struct file_lock *i_flock; | 779 | struct file_lock *i_flock; |
| 765 | struct address_space *i_mapping; | 780 | struct address_space *i_mapping; |
| 766 | struct address_space i_data; | 781 | struct address_space i_data; |
| @@ -781,11 +796,6 @@ struct inode { | |||
| 781 | struct hlist_head i_fsnotify_marks; | 796 | struct hlist_head i_fsnotify_marks; |
| 782 | #endif | 797 | #endif |
| 783 | 798 | ||
| 784 | unsigned long i_state; | ||
| 785 | unsigned long dirtied_when; /* jiffies of first dirtying */ | ||
| 786 | |||
| 787 | unsigned int i_flags; | ||
| 788 | |||
| 789 | #ifdef CONFIG_IMA | 799 | #ifdef CONFIG_IMA |
| 790 | /* protected by i_lock */ | 800 | /* protected by i_lock */ |
| 791 | unsigned int i_readcount; /* struct files open RO */ | 801 | unsigned int i_readcount; /* struct files open RO */ |
| @@ -1058,7 +1068,6 @@ struct lock_manager_operations { | |||
| 1058 | int (*fl_grant)(struct file_lock *, struct file_lock *, int); | 1068 | int (*fl_grant)(struct file_lock *, struct file_lock *, int); |
| 1059 | void (*fl_release_private)(struct file_lock *); | 1069 | void (*fl_release_private)(struct file_lock *); |
| 1060 | void (*fl_break)(struct file_lock *); | 1070 | void (*fl_break)(struct file_lock *); |
| 1061 | int (*fl_mylease)(struct file_lock *, struct file_lock *); | ||
| 1062 | int (*fl_change)(struct file_lock **, int); | 1071 | int (*fl_change)(struct file_lock **, int); |
| 1063 | }; | 1072 | }; |
| 1064 | 1073 | ||
| @@ -1371,13 +1380,13 @@ struct super_block { | |||
| 1371 | const struct xattr_handler **s_xattr; | 1380 | const struct xattr_handler **s_xattr; |
| 1372 | 1381 | ||
| 1373 | struct list_head s_inodes; /* all inodes */ | 1382 | struct list_head s_inodes; /* all inodes */ |
| 1374 | struct hlist_head s_anon; /* anonymous dentries for (nfs) exporting */ | 1383 | struct hlist_bl_head s_anon; /* anonymous dentries for (nfs) exporting */ |
| 1375 | #ifdef CONFIG_SMP | 1384 | #ifdef CONFIG_SMP |
| 1376 | struct list_head __percpu *s_files; | 1385 | struct list_head __percpu *s_files; |
| 1377 | #else | 1386 | #else |
| 1378 | struct list_head s_files; | 1387 | struct list_head s_files; |
| 1379 | #endif | 1388 | #endif |
| 1380 | /* s_dentry_lru and s_nr_dentry_unused are protected by dcache_lock */ | 1389 | /* s_dentry_lru, s_nr_dentry_unused protected by dcache.c lru locks */ |
| 1381 | struct list_head s_dentry_lru; /* unused dentry lru */ | 1390 | struct list_head s_dentry_lru; /* unused dentry lru */ |
| 1382 | int s_nr_dentry_unused; /* # of dentry on lru */ | 1391 | int s_nr_dentry_unused; /* # of dentry on lru */ |
| 1383 | 1392 | ||
| @@ -1416,6 +1425,7 @@ struct super_block { | |||
| 1416 | * generic_show_options() | 1425 | * generic_show_options() |
| 1417 | */ | 1426 | */ |
| 1418 | char __rcu *s_options; | 1427 | char __rcu *s_options; |
| 1428 | const struct dentry_operations *s_d_op; /* default d_op for dentries */ | ||
| 1419 | }; | 1429 | }; |
| 1420 | 1430 | ||
| 1421 | extern struct timespec current_fs_time(struct super_block *sb); | 1431 | extern struct timespec current_fs_time(struct super_block *sb); |
| @@ -1473,8 +1483,8 @@ struct fiemap_extent_info { | |||
| 1473 | unsigned int fi_flags; /* Flags as passed from user */ | 1483 | unsigned int fi_flags; /* Flags as passed from user */ |
| 1474 | unsigned int fi_extents_mapped; /* Number of mapped extents */ | 1484 | unsigned int fi_extents_mapped; /* Number of mapped extents */ |
| 1475 | unsigned int fi_extents_max; /* Size of fiemap_extent array */ | 1485 | unsigned int fi_extents_max; /* Size of fiemap_extent array */ |
| 1476 | struct fiemap_extent *fi_extents_start; /* Start of fiemap_extent | 1486 | struct fiemap_extent __user *fi_extents_start; /* Start of |
| 1477 | * array */ | 1487 | fiemap_extent array */ |
| 1478 | }; | 1488 | }; |
| 1479 | int fiemap_fill_next_extent(struct fiemap_extent_info *info, u64 logical, | 1489 | int fiemap_fill_next_extent(struct fiemap_extent_info *info, u64 logical, |
| 1480 | u64 phys, u64 len, u32 flags); | 1490 | u64 phys, u64 len, u32 flags); |
| @@ -1542,11 +1552,22 @@ struct file_operations { | |||
| 1542 | ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); | 1552 | ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); |
| 1543 | ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); | 1553 | ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); |
| 1544 | int (*setlease)(struct file *, long, struct file_lock **); | 1554 | int (*setlease)(struct file *, long, struct file_lock **); |
| 1555 | long (*fallocate)(struct file *file, int mode, loff_t offset, | ||
| 1556 | loff_t len); | ||
| 1545 | }; | 1557 | }; |
| 1546 | 1558 | ||
| 1559 | #define IPERM_FLAG_RCU 0x0001 | ||
| 1560 | |||
| 1547 | struct inode_operations { | 1561 | struct inode_operations { |
| 1548 | int (*create) (struct inode *,struct dentry *,int, struct nameidata *); | ||
| 1549 | struct dentry * (*lookup) (struct inode *,struct dentry *, struct nameidata *); | 1562 | struct dentry * (*lookup) (struct inode *,struct dentry *, struct nameidata *); |
| 1563 | void * (*follow_link) (struct dentry *, struct nameidata *); | ||
| 1564 | int (*permission) (struct inode *, int, unsigned int); | ||
| 1565 | int (*check_acl)(struct inode *, int, unsigned int); | ||
| 1566 | |||
| 1567 | int (*readlink) (struct dentry *, char __user *,int); | ||
| 1568 | void (*put_link) (struct dentry *, struct nameidata *, void *); | ||
| 1569 | |||
| 1570 | int (*create) (struct inode *,struct dentry *,int, struct nameidata *); | ||
| 1550 | int (*link) (struct dentry *,struct inode *,struct dentry *); | 1571 | int (*link) (struct dentry *,struct inode *,struct dentry *); |
| 1551 | int (*unlink) (struct inode *,struct dentry *); | 1572 | int (*unlink) (struct inode *,struct dentry *); |
| 1552 | int (*symlink) (struct inode *,struct dentry *,const char *); | 1573 | int (*symlink) (struct inode *,struct dentry *,const char *); |
| @@ -1555,12 +1576,7 @@ struct inode_operations { | |||
| 1555 | int (*mknod) (struct inode *,struct dentry *,int,dev_t); | 1576 | int (*mknod) (struct inode *,struct dentry *,int,dev_t); |
| 1556 | int (*rename) (struct inode *, struct dentry *, | 1577 | int (*rename) (struct inode *, struct dentry *, |
| 1557 | struct inode *, struct dentry *); | 1578 | struct inode *, struct dentry *); |
| 1558 | int (*readlink) (struct dentry *, char __user *,int); | ||
| 1559 | void * (*follow_link) (struct dentry *, struct nameidata *); | ||
| 1560 | void (*put_link) (struct dentry *, struct nameidata *, void *); | ||
| 1561 | void (*truncate) (struct inode *); | 1579 | void (*truncate) (struct inode *); |
| 1562 | int (*permission) (struct inode *, int); | ||
| 1563 | int (*check_acl)(struct inode *, int); | ||
| 1564 | int (*setattr) (struct dentry *, struct iattr *); | 1580 | int (*setattr) (struct dentry *, struct iattr *); |
| 1565 | int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *); | 1581 | int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *); |
| 1566 | int (*setxattr) (struct dentry *, const char *,const void *,size_t,int); | 1582 | int (*setxattr) (struct dentry *, const char *,const void *,size_t,int); |
| @@ -1568,11 +1584,9 @@ struct inode_operations { | |||
| 1568 | ssize_t (*listxattr) (struct dentry *, char *, size_t); | 1584 | ssize_t (*listxattr) (struct dentry *, char *, size_t); |
| 1569 | int (*removexattr) (struct dentry *, const char *); | 1585 | int (*removexattr) (struct dentry *, const char *); |
| 1570 | void (*truncate_range)(struct inode *, loff_t, loff_t); | 1586 | void (*truncate_range)(struct inode *, loff_t, loff_t); |
| 1571 | long (*fallocate)(struct inode *inode, int mode, loff_t offset, | ||
| 1572 | loff_t len); | ||
| 1573 | int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, | 1587 | int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, |
| 1574 | u64 len); | 1588 | u64 len); |
| 1575 | }; | 1589 | } ____cacheline_aligned; |
| 1576 | 1590 | ||
| 1577 | struct seq_file; | 1591 | struct seq_file; |
| 1578 | 1592 | ||
| @@ -1612,7 +1626,6 @@ struct super_operations { | |||
| 1612 | ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); | 1626 | ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); |
| 1613 | #endif | 1627 | #endif |
| 1614 | int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t); | 1628 | int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t); |
| 1615 | int (*trim_fs) (struct super_block *, struct fstrim_range *); | ||
| 1616 | }; | 1629 | }; |
| 1617 | 1630 | ||
| 1618 | /* | 1631 | /* |
| @@ -1824,7 +1837,9 @@ struct super_block *sget(struct file_system_type *type, | |||
| 1824 | int (*set)(struct super_block *,void *), | 1837 | int (*set)(struct super_block *,void *), |
| 1825 | void *data); | 1838 | void *data); |
| 1826 | extern struct dentry *mount_pseudo(struct file_system_type *, char *, | 1839 | extern struct dentry *mount_pseudo(struct file_system_type *, char *, |
| 1827 | const struct super_operations *ops, unsigned long); | 1840 | const struct super_operations *ops, |
| 1841 | const struct dentry_operations *dops, | ||
| 1842 | unsigned long); | ||
| 1828 | extern void simple_set_mnt(struct vfsmount *mnt, struct super_block *sb); | 1843 | extern void simple_set_mnt(struct vfsmount *mnt, struct super_block *sb); |
| 1829 | 1844 | ||
| 1830 | static inline void sb_mark_dirty(struct super_block *sb) | 1845 | static inline void sb_mark_dirty(struct super_block *sb) |
| @@ -2006,7 +2021,6 @@ extern struct block_device *bdgrab(struct block_device *bdev); | |||
| 2006 | extern void bd_set_size(struct block_device *, loff_t size); | 2021 | extern void bd_set_size(struct block_device *, loff_t size); |
| 2007 | extern void bd_forget(struct inode *inode); | 2022 | extern void bd_forget(struct inode *inode); |
| 2008 | extern void bdput(struct block_device *); | 2023 | extern void bdput(struct block_device *); |
| 2009 | extern struct block_device *open_by_devnum(dev_t, fmode_t); | ||
| 2010 | extern void invalidate_bdev(struct block_device *); | 2024 | extern void invalidate_bdev(struct block_device *); |
| 2011 | extern int sync_blockdev(struct block_device *bdev); | 2025 | extern int sync_blockdev(struct block_device *bdev); |
| 2012 | extern struct super_block *freeze_bdev(struct block_device *); | 2026 | extern struct super_block *freeze_bdev(struct block_device *); |
| @@ -2037,16 +2051,26 @@ extern const struct file_operations def_fifo_fops; | |||
| 2037 | extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long); | 2051 | extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long); |
| 2038 | extern int blkdev_ioctl(struct block_device *, fmode_t, unsigned, unsigned long); | 2052 | extern int blkdev_ioctl(struct block_device *, fmode_t, unsigned, unsigned long); |
| 2039 | extern long compat_blkdev_ioctl(struct file *, unsigned, unsigned long); | 2053 | extern long compat_blkdev_ioctl(struct file *, unsigned, unsigned long); |
| 2040 | extern int blkdev_get(struct block_device *, fmode_t); | 2054 | extern int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder); |
| 2041 | extern int blkdev_put(struct block_device *, fmode_t); | 2055 | extern struct block_device *blkdev_get_by_path(const char *path, fmode_t mode, |
| 2042 | extern int bd_claim(struct block_device *, void *); | 2056 | void *holder); |
| 2043 | extern void bd_release(struct block_device *); | 2057 | extern struct block_device *blkdev_get_by_dev(dev_t dev, fmode_t mode, |
| 2058 | void *holder); | ||
| 2059 | extern int blkdev_put(struct block_device *bdev, fmode_t mode); | ||
| 2044 | #ifdef CONFIG_SYSFS | 2060 | #ifdef CONFIG_SYSFS |
| 2045 | extern int bd_claim_by_disk(struct block_device *, void *, struct gendisk *); | 2061 | extern int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk); |
| 2046 | extern void bd_release_from_disk(struct block_device *, struct gendisk *); | 2062 | extern void bd_unlink_disk_holder(struct block_device *bdev, |
| 2063 | struct gendisk *disk); | ||
| 2047 | #else | 2064 | #else |
| 2048 | #define bd_claim_by_disk(bdev, holder, disk) bd_claim(bdev, holder) | 2065 | static inline int bd_link_disk_holder(struct block_device *bdev, |
| 2049 | #define bd_release_from_disk(bdev, disk) bd_release(bdev) | 2066 | struct gendisk *disk) |
| 2067 | { | ||
| 2068 | return 0; | ||
| 2069 | } | ||
| 2070 | static inline void bd_unlink_disk_holder(struct block_device *bdev, | ||
| 2071 | struct gendisk *disk) | ||
| 2072 | { | ||
| 2073 | } | ||
| 2050 | #endif | 2074 | #endif |
| 2051 | #endif | 2075 | #endif |
| 2052 | 2076 | ||
| @@ -2082,8 +2106,6 @@ static inline void unregister_chrdev(unsigned int major, const char *name) | |||
| 2082 | extern const char *__bdevname(dev_t, char *buffer); | 2106 | extern const char *__bdevname(dev_t, char *buffer); |
| 2083 | extern const char *bdevname(struct block_device *bdev, char *buffer); | 2107 | extern const char *bdevname(struct block_device *bdev, char *buffer); |
| 2084 | extern struct block_device *lookup_bdev(const char *); | 2108 | extern struct block_device *lookup_bdev(const char *); |
| 2085 | extern struct block_device *open_bdev_exclusive(const char *, fmode_t, void *); | ||
| 2086 | extern void close_bdev_exclusive(struct block_device *, fmode_t); | ||
| 2087 | extern void blkdev_show(struct seq_file *,off_t); | 2109 | extern void blkdev_show(struct seq_file *,off_t); |
| 2088 | 2110 | ||
| 2089 | #else | 2111 | #else |
| @@ -2158,8 +2180,8 @@ extern sector_t bmap(struct inode *, sector_t); | |||
| 2158 | #endif | 2180 | #endif |
| 2159 | extern int notify_change(struct dentry *, struct iattr *); | 2181 | extern int notify_change(struct dentry *, struct iattr *); |
| 2160 | extern int inode_permission(struct inode *, int); | 2182 | extern int inode_permission(struct inode *, int); |
| 2161 | extern int generic_permission(struct inode *, int, | 2183 | extern int generic_permission(struct inode *, int, unsigned int, |
| 2162 | int (*check_acl)(struct inode *, int)); | 2184 | int (*check_acl)(struct inode *, int, unsigned int)); |
| 2163 | 2185 | ||
| 2164 | static inline bool execute_ok(struct inode *inode) | 2186 | static inline bool execute_ok(struct inode *inode) |
| 2165 | { | 2187 | { |
| @@ -2230,6 +2252,7 @@ extern void iget_failed(struct inode *); | |||
| 2230 | extern void end_writeback(struct inode *); | 2252 | extern void end_writeback(struct inode *); |
| 2231 | extern void __destroy_inode(struct inode *); | 2253 | extern void __destroy_inode(struct inode *); |
| 2232 | extern struct inode *new_inode(struct super_block *); | 2254 | extern struct inode *new_inode(struct super_block *); |
| 2255 | extern void free_inode_nonrcu(struct inode *inode); | ||
| 2233 | extern int should_remove_suid(struct dentry *); | 2256 | extern int should_remove_suid(struct dentry *); |
| 2234 | extern int file_remove_suid(struct file *); | 2257 | extern int file_remove_suid(struct file *); |
| 2235 | 2258 | ||
| @@ -2446,6 +2469,10 @@ static inline ino_t parent_ino(struct dentry *dentry) | |||
| 2446 | { | 2469 | { |
| 2447 | ino_t res; | 2470 | ino_t res; |
| 2448 | 2471 | ||
| 2472 | /* | ||
| 2473 | * Don't strictly need d_lock here? If the parent ino could change | ||
| 2474 | * then surely we'd have a deeper race in the caller? | ||
| 2475 | */ | ||
| 2449 | spin_lock(&dentry->d_lock); | 2476 | spin_lock(&dentry->d_lock); |
| 2450 | res = dentry->d_parent->d_inode->i_ino; | 2477 | res = dentry->d_parent->d_inode->i_ino; |
| 2451 | spin_unlock(&dentry->d_lock); | 2478 | spin_unlock(&dentry->d_lock); |
