diff options
58 files changed, 456 insertions, 823 deletions
diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index 229d7b7c50a3..18b9d0ca0630 100644 --- a/Documentation/filesystems/Locking +++ b/Documentation/filesystems/Locking | |||
| @@ -109,27 +109,28 @@ prototypes: | |||
| 109 | 109 | ||
| 110 | locking rules: | 110 | locking rules: |
| 111 | All may block. | 111 | All may block. |
| 112 | BKL s_lock s_umount | 112 | None have BKL |
| 113 | alloc_inode: no no no | 113 | s_umount |
| 114 | destroy_inode: no | 114 | alloc_inode: |
| 115 | dirty_inode: no (must not sleep) | 115 | destroy_inode: |
| 116 | write_inode: no | 116 | dirty_inode: (must not sleep) |
| 117 | drop_inode: no !!!inode_lock!!! | 117 | write_inode: |
| 118 | delete_inode: no | 118 | drop_inode: !!!inode_lock!!! |
| 119 | put_super: yes yes no | 119 | delete_inode: |
| 120 | write_super: no yes read | 120 | put_super: write |
| 121 | sync_fs: no no read | 121 | write_super: read |
| 122 | freeze_fs: ? | 122 | sync_fs: read |
| 123 | unfreeze_fs: ? | 123 | freeze_fs: read |
| 124 | statfs: no no no | 124 | unfreeze_fs: read |
| 125 | remount_fs: yes yes maybe (see below) | 125 | statfs: no |
| 126 | clear_inode: no | 126 | remount_fs: maybe (see below) |
| 127 | umount_begin: yes no no | 127 | clear_inode: |
| 128 | show_options: no (vfsmount->sem) | 128 | umount_begin: no |
| 129 | quota_read: no no no (see below) | 129 | show_options: no (namespace_sem) |
| 130 | quota_write: no no no (see below) | 130 | quota_read: no (see below) |
| 131 | 131 | quota_write: no (see below) | |
| 132 | ->remount_fs() will have the s_umount lock if it's already mounted. | 132 | |
| 133 | ->remount_fs() will have the s_umount exclusive lock if it's already mounted. | ||
| 133 | When called from get_sb_single, it does NOT have the s_umount lock. | 134 | When called from get_sb_single, it does NOT have the s_umount lock. |
| 134 | ->quota_read() and ->quota_write() functions are both guaranteed to | 135 | ->quota_read() and ->quota_write() functions are both guaranteed to |
| 135 | be the only ones operating on the quota file by the quota code (via | 136 | be the only ones operating on the quota file by the quota code (via |
diff --git a/fs/btrfs/acl.c b/fs/btrfs/acl.c index 603972576f0f..f128427b995b 100644 --- a/fs/btrfs/acl.c +++ b/fs/btrfs/acl.c | |||
| @@ -29,51 +29,28 @@ | |||
| 29 | 29 | ||
| 30 | #ifdef CONFIG_FS_POSIX_ACL | 30 | #ifdef CONFIG_FS_POSIX_ACL |
| 31 | 31 | ||
| 32 | static void btrfs_update_cached_acl(struct inode *inode, | ||
| 33 | struct posix_acl **p_acl, | ||
| 34 | struct posix_acl *acl) | ||
| 35 | { | ||
| 36 | spin_lock(&inode->i_lock); | ||
| 37 | if (*p_acl && *p_acl != BTRFS_ACL_NOT_CACHED) | ||
| 38 | posix_acl_release(*p_acl); | ||
| 39 | *p_acl = posix_acl_dup(acl); | ||
| 40 | spin_unlock(&inode->i_lock); | ||
| 41 | } | ||
| 42 | |||
| 43 | static struct posix_acl *btrfs_get_acl(struct inode *inode, int type) | 32 | static struct posix_acl *btrfs_get_acl(struct inode *inode, int type) |
| 44 | { | 33 | { |
| 45 | int size; | 34 | int size; |
| 46 | const char *name; | 35 | const char *name; |
| 47 | char *value = NULL; | 36 | char *value = NULL; |
| 48 | struct posix_acl *acl = NULL, **p_acl; | 37 | struct posix_acl *acl; |
| 38 | |||
| 39 | acl = get_cached_acl(inode, type); | ||
| 40 | if (acl != ACL_NOT_CACHED) | ||
| 41 | return acl; | ||
| 49 | 42 | ||
| 50 | switch (type) { | 43 | switch (type) { |
| 51 | case ACL_TYPE_ACCESS: | 44 | case ACL_TYPE_ACCESS: |
| 52 | name = POSIX_ACL_XATTR_ACCESS; | 45 | name = POSIX_ACL_XATTR_ACCESS; |
| 53 | p_acl = &BTRFS_I(inode)->i_acl; | ||
| 54 | break; | 46 | break; |
| 55 | case ACL_TYPE_DEFAULT: | 47 | case ACL_TYPE_DEFAULT: |
| 56 | name = POSIX_ACL_XATTR_DEFAULT; | 48 | name = POSIX_ACL_XATTR_DEFAULT; |
| 57 | p_acl = &BTRFS_I(inode)->i_default_acl; | ||
| 58 | break; | 49 | break; |
| 59 | default: | 50 | default: |
| 60 | return ERR_PTR(-EINVAL); | 51 | BUG(); |
| 61 | } | 52 | } |
| 62 | 53 | ||
| 63 | /* Handle the cached NULL acl case without locking */ | ||
| 64 | acl = ACCESS_ONCE(*p_acl); | ||
| 65 | if (!acl) | ||
| 66 | return acl; | ||
| 67 | |||
| 68 | spin_lock(&inode->i_lock); | ||
| 69 | acl = *p_acl; | ||
| 70 | if (acl != BTRFS_ACL_NOT_CACHED) | ||
| 71 | acl = posix_acl_dup(acl); | ||
| 72 | spin_unlock(&inode->i_lock); | ||
| 73 | |||
| 74 | if (acl != BTRFS_ACL_NOT_CACHED) | ||
| 75 | return acl; | ||
| 76 | |||
| 77 | size = __btrfs_getxattr(inode, name, "", 0); | 54 | size = __btrfs_getxattr(inode, name, "", 0); |
| 78 | if (size > 0) { | 55 | if (size > 0) { |
| 79 | value = kzalloc(size, GFP_NOFS); | 56 | value = kzalloc(size, GFP_NOFS); |
| @@ -82,13 +59,13 @@ static struct posix_acl *btrfs_get_acl(struct inode *inode, int type) | |||
| 82 | size = __btrfs_getxattr(inode, name, value, size); | 59 | size = __btrfs_getxattr(inode, name, value, size); |
| 83 | if (size > 0) { | 60 | if (size > 0) { |
| 84 | acl = posix_acl_from_xattr(value, size); | 61 | acl = posix_acl_from_xattr(value, size); |
| 85 | btrfs_update_cached_acl(inode, p_acl, acl); | 62 | set_cached_acl(inode, type, acl); |
| 86 | } | 63 | } |
| 87 | kfree(value); | 64 | kfree(value); |
| 88 | } else if (size == -ENOENT || size == -ENODATA || size == 0) { | 65 | } else if (size == -ENOENT || size == -ENODATA || size == 0) { |
| 89 | /* FIXME, who returns -ENOENT? I think nobody */ | 66 | /* FIXME, who returns -ENOENT? I think nobody */ |
| 90 | acl = NULL; | 67 | acl = NULL; |
| 91 | btrfs_update_cached_acl(inode, p_acl, acl); | 68 | set_cached_acl(inode, type, acl); |
| 92 | } else { | 69 | } else { |
| 93 | acl = ERR_PTR(-EIO); | 70 | acl = ERR_PTR(-EIO); |
| 94 | } | 71 | } |
| @@ -121,7 +98,6 @@ static int btrfs_set_acl(struct inode *inode, struct posix_acl *acl, int type) | |||
| 121 | { | 98 | { |
| 122 | int ret, size = 0; | 99 | int ret, size = 0; |
| 123 | const char *name; | 100 | const char *name; |
| 124 | struct posix_acl **p_acl; | ||
| 125 | char *value = NULL; | 101 | char *value = NULL; |
| 126 | mode_t mode; | 102 | mode_t mode; |
| 127 | 103 | ||
| @@ -141,13 +117,11 @@ static int btrfs_set_acl(struct inode *inode, struct posix_acl *acl, int type) | |||
| 141 | ret = 0; | 117 | ret = 0; |
| 142 | inode->i_mode = mode; | 118 | inode->i_mode = mode; |
| 143 | name = POSIX_ACL_XATTR_ACCESS; | 119 | name = POSIX_ACL_XATTR_ACCESS; |
| 144 | p_acl = &BTRFS_I(inode)->i_acl; | ||
| 145 | break; | 120 | break; |
| 146 | case ACL_TYPE_DEFAULT: | 121 | case ACL_TYPE_DEFAULT: |
| 147 | if (!S_ISDIR(inode->i_mode)) | 122 | if (!S_ISDIR(inode->i_mode)) |
| 148 | return acl ? -EINVAL : 0; | 123 | return acl ? -EINVAL : 0; |
| 149 | name = POSIX_ACL_XATTR_DEFAULT; | 124 | name = POSIX_ACL_XATTR_DEFAULT; |
| 150 | p_acl = &BTRFS_I(inode)->i_default_acl; | ||
| 151 | break; | 125 | break; |
| 152 | default: | 126 | default: |
| 153 | return -EINVAL; | 127 | return -EINVAL; |
| @@ -172,7 +146,7 @@ out: | |||
| 172 | kfree(value); | 146 | kfree(value); |
| 173 | 147 | ||
| 174 | if (!ret) | 148 | if (!ret) |
| 175 | btrfs_update_cached_acl(inode, p_acl, acl); | 149 | set_cached_acl(inode, type, acl); |
| 176 | 150 | ||
| 177 | return ret; | 151 | return ret; |
| 178 | } | 152 | } |
diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h index acb4f3517582..ea1ea0af8c0e 100644 --- a/fs/btrfs/btrfs_inode.h +++ b/fs/btrfs/btrfs_inode.h | |||
| @@ -53,10 +53,6 @@ struct btrfs_inode { | |||
| 53 | /* used to order data wrt metadata */ | 53 | /* used to order data wrt metadata */ |
| 54 | struct btrfs_ordered_inode_tree ordered_tree; | 54 | struct btrfs_ordered_inode_tree ordered_tree; |
| 55 | 55 | ||
| 56 | /* standard acl pointers */ | ||
| 57 | struct posix_acl *i_acl; | ||
| 58 | struct posix_acl *i_default_acl; | ||
| 59 | |||
| 60 | /* for keeping track of orphaned inodes */ | 56 | /* for keeping track of orphaned inodes */ |
| 61 | struct list_head i_orphan; | 57 | struct list_head i_orphan; |
| 62 | 58 | ||
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 03441a99ea38..2779c2f5360a 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
| @@ -41,8 +41,6 @@ struct btrfs_ordered_sum; | |||
| 41 | 41 | ||
| 42 | #define BTRFS_MAGIC "_BHRfS_M" | 42 | #define BTRFS_MAGIC "_BHRfS_M" |
| 43 | 43 | ||
| 44 | #define BTRFS_ACL_NOT_CACHED ((void *)-1) | ||
| 45 | |||
| 46 | #define BTRFS_MAX_LEVEL 8 | 44 | #define BTRFS_MAX_LEVEL 8 |
| 47 | 45 | ||
| 48 | #define BTRFS_COMPAT_EXTENT_TREE_V0 | 46 | #define BTRFS_COMPAT_EXTENT_TREE_V0 |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 8612b3a09811..78ad38ddd01f 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -2123,8 +2123,8 @@ static void btrfs_read_locked_inode(struct inode *inode) | |||
| 2123 | */ | 2123 | */ |
| 2124 | maybe_acls = acls_after_inode_item(leaf, path->slots[0], inode->i_ino); | 2124 | maybe_acls = acls_after_inode_item(leaf, path->slots[0], inode->i_ino); |
| 2125 | if (!maybe_acls) { | 2125 | if (!maybe_acls) { |
| 2126 | BTRFS_I(inode)->i_acl = NULL; | 2126 | inode->i_acl = NULL; |
| 2127 | BTRFS_I(inode)->i_default_acl = NULL; | 2127 | inode->i_default_acl = NULL; |
| 2128 | } | 2128 | } |
| 2129 | 2129 | ||
| 2130 | BTRFS_I(inode)->block_group = btrfs_find_block_group(root, 0, | 2130 | BTRFS_I(inode)->block_group = btrfs_find_block_group(root, 0, |
| @@ -3141,9 +3141,6 @@ static noinline void init_btrfs_i(struct inode *inode) | |||
| 3141 | { | 3141 | { |
| 3142 | struct btrfs_inode *bi = BTRFS_I(inode); | 3142 | struct btrfs_inode *bi = BTRFS_I(inode); |
| 3143 | 3143 | ||
| 3144 | bi->i_acl = BTRFS_ACL_NOT_CACHED; | ||
| 3145 | bi->i_default_acl = BTRFS_ACL_NOT_CACHED; | ||
| 3146 | |||
| 3147 | bi->generation = 0; | 3144 | bi->generation = 0; |
| 3148 | bi->sequence = 0; | 3145 | bi->sequence = 0; |
| 3149 | bi->last_trans = 0; | 3146 | bi->last_trans = 0; |
| @@ -4640,8 +4637,6 @@ struct inode *btrfs_alloc_inode(struct super_block *sb) | |||
| 4640 | ei->last_trans = 0; | 4637 | ei->last_trans = 0; |
| 4641 | ei->logged_trans = 0; | 4638 | ei->logged_trans = 0; |
| 4642 | btrfs_ordered_inode_tree_init(&ei->ordered_tree); | 4639 | btrfs_ordered_inode_tree_init(&ei->ordered_tree); |
| 4643 | ei->i_acl = BTRFS_ACL_NOT_CACHED; | ||
| 4644 | ei->i_default_acl = BTRFS_ACL_NOT_CACHED; | ||
| 4645 | INIT_LIST_HEAD(&ei->i_orphan); | 4640 | INIT_LIST_HEAD(&ei->i_orphan); |
| 4646 | INIT_LIST_HEAD(&ei->ordered_operations); | 4641 | INIT_LIST_HEAD(&ei->ordered_operations); |
| 4647 | return &ei->vfs_inode; | 4642 | return &ei->vfs_inode; |
| @@ -4655,13 +4650,6 @@ void btrfs_destroy_inode(struct inode *inode) | |||
| 4655 | WARN_ON(!list_empty(&inode->i_dentry)); | 4650 | WARN_ON(!list_empty(&inode->i_dentry)); |
| 4656 | WARN_ON(inode->i_data.nrpages); | 4651 | WARN_ON(inode->i_data.nrpages); |
| 4657 | 4652 | ||
| 4658 | if (BTRFS_I(inode)->i_acl && | ||
| 4659 | BTRFS_I(inode)->i_acl != BTRFS_ACL_NOT_CACHED) | ||
| 4660 | posix_acl_release(BTRFS_I(inode)->i_acl); | ||
| 4661 | if (BTRFS_I(inode)->i_default_acl && | ||
| 4662 | BTRFS_I(inode)->i_default_acl != BTRFS_ACL_NOT_CACHED) | ||
| 4663 | posix_acl_release(BTRFS_I(inode)->i_default_acl); | ||
| 4664 | |||
| 4665 | /* | 4653 | /* |
| 4666 | * Make sure we're properly removed from the ordered operation | 4654 | * Make sure we're properly removed from the ordered operation |
| 4667 | * lists. | 4655 | * lists. |
diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c index c135202c38b3..626c7483b4de 100644 --- a/fs/compat_ioctl.c +++ b/fs/compat_ioctl.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include <linux/skbuff.h> | 31 | #include <linux/skbuff.h> |
| 32 | #include <linux/netlink.h> | 32 | #include <linux/netlink.h> |
| 33 | #include <linux/vt.h> | 33 | #include <linux/vt.h> |
| 34 | #include <linux/falloc.h> | ||
| 34 | #include <linux/fs.h> | 35 | #include <linux/fs.h> |
| 35 | #include <linux/file.h> | 36 | #include <linux/file.h> |
| 36 | #include <linux/ppp_defs.h> | 37 | #include <linux/ppp_defs.h> |
| @@ -1779,6 +1780,41 @@ lp_timeout_trans(unsigned int fd, unsigned int cmd, unsigned long arg) | |||
| 1779 | return sys_ioctl(fd, cmd, (unsigned long)tn); | 1780 | return sys_ioctl(fd, cmd, (unsigned long)tn); |
| 1780 | } | 1781 | } |
| 1781 | 1782 | ||
| 1783 | /* on ia32 l_start is on a 32-bit boundary */ | ||
| 1784 | #if defined(CONFIG_IA64) || defined(CONFIG_X86_64) | ||
| 1785 | struct space_resv_32 { | ||
| 1786 | __s16 l_type; | ||
| 1787 | __s16 l_whence; | ||
| 1788 | __s64 l_start __attribute__((packed)); | ||
| 1789 | /* len == 0 means until end of file */ | ||
| 1790 | __s64 l_len __attribute__((packed)); | ||
| 1791 | __s32 l_sysid; | ||
| 1792 | __u32 l_pid; | ||
| 1793 | __s32 l_pad[4]; /* reserve area */ | ||
| 1794 | }; | ||
| 1795 | |||
| 1796 | #define FS_IOC_RESVSP_32 _IOW ('X', 40, struct space_resv_32) | ||
| 1797 | #define FS_IOC_RESVSP64_32 _IOW ('X', 42, struct space_resv_32) | ||
| 1798 | |||
| 1799 | /* just account for different alignment */ | ||
| 1800 | static int compat_ioctl_preallocate(struct file *file, unsigned long arg) | ||
| 1801 | { | ||
| 1802 | struct space_resv_32 __user *p32 = (void __user *)arg; | ||
| 1803 | struct space_resv __user *p = compat_alloc_user_space(sizeof(*p)); | ||
| 1804 | |||
| 1805 | if (copy_in_user(&p->l_type, &p32->l_type, sizeof(s16)) || | ||
| 1806 | copy_in_user(&p->l_whence, &p32->l_whence, sizeof(s16)) || | ||
| 1807 | copy_in_user(&p->l_start, &p32->l_start, sizeof(s64)) || | ||
| 1808 | copy_in_user(&p->l_len, &p32->l_len, sizeof(s64)) || | ||
| 1809 | copy_in_user(&p->l_sysid, &p32->l_sysid, sizeof(s32)) || | ||
| 1810 | copy_in_user(&p->l_pid, &p32->l_pid, sizeof(u32)) || | ||
| 1811 | copy_in_user(&p->l_pad, &p32->l_pad, 4*sizeof(u32))) | ||
| 1812 | return -EFAULT; | ||
| 1813 | |||
| 1814 | return ioctl_preallocate(file, p); | ||
| 1815 | } | ||
| 1816 | #endif | ||
| 1817 | |||
| 1782 | 1818 | ||
| 1783 | typedef int (*ioctl_trans_handler_t)(unsigned int, unsigned int, | 1819 | typedef int (*ioctl_trans_handler_t)(unsigned int, unsigned int, |
| 1784 | unsigned long, struct file *); | 1820 | unsigned long, struct file *); |
| @@ -2756,6 +2792,18 @@ asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd, | |||
| 2756 | case FIOQSIZE: | 2792 | case FIOQSIZE: |
| 2757 | break; | 2793 | break; |
| 2758 | 2794 | ||
| 2795 | #if defined(CONFIG_IA64) || defined(CONFIG_X86_64) | ||
| 2796 | case FS_IOC_RESVSP_32: | ||
| 2797 | case FS_IOC_RESVSP64_32: | ||
| 2798 | error = compat_ioctl_preallocate(filp, arg); | ||
| 2799 | goto out_fput; | ||
| 2800 | #else | ||
| 2801 | case FS_IOC_RESVSP: | ||
| 2802 | case FS_IOC_RESVSP64: | ||
| 2803 | error = ioctl_preallocate(filp, (void __user *)arg); | ||
| 2804 | goto out_fput; | ||
| 2805 | #endif | ||
| 2806 | |||
| 2759 | case FIBMAP: | 2807 | case FIBMAP: |
| 2760 | case FIGETBSZ: | 2808 | case FIGETBSZ: |
| 2761 | case FIONREAD: | 2809 | case FIONREAD: |
diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c index 9b1d285f9fe6..75efb028974b 100644 --- a/fs/devpts/inode.c +++ b/fs/devpts/inode.c | |||
| @@ -423,7 +423,6 @@ static void devpts_kill_sb(struct super_block *sb) | |||
| 423 | } | 423 | } |
| 424 | 424 | ||
| 425 | static struct file_system_type devpts_fs_type = { | 425 | static struct file_system_type devpts_fs_type = { |
| 426 | .owner = THIS_MODULE, | ||
| 427 | .name = "devpts", | 426 | .name = "devpts", |
| 428 | .get_sb = devpts_get_sb, | 427 | .get_sb = devpts_get_sb, |
| 429 | .kill_sb = devpts_kill_sb, | 428 | .kill_sb = devpts_kill_sb, |
| @@ -564,13 +563,4 @@ static int __init init_devpts_fs(void) | |||
| 564 | } | 563 | } |
| 565 | return err; | 564 | return err; |
| 566 | } | 565 | } |
| 567 | |||
| 568 | static void __exit exit_devpts_fs(void) | ||
| 569 | { | ||
| 570 | unregister_filesystem(&devpts_fs_type); | ||
| 571 | mntput(devpts_mnt); | ||
| 572 | } | ||
| 573 | |||
| 574 | module_init(init_devpts_fs) | 566 | module_init(init_devpts_fs) |
| 575 | module_exit(exit_devpts_fs) | ||
| 576 | MODULE_LICENSE("GPL"); | ||
diff --git a/fs/ext2/acl.c b/fs/ext2/acl.c index d46e38cb85c5..d636e1297cad 100644 --- a/fs/ext2/acl.c +++ b/fs/ext2/acl.c | |||
| @@ -125,37 +125,12 @@ fail: | |||
| 125 | return ERR_PTR(-EINVAL); | 125 | return ERR_PTR(-EINVAL); |
| 126 | } | 126 | } |
| 127 | 127 | ||
| 128 | static inline struct posix_acl * | ||
| 129 | ext2_iget_acl(struct inode *inode, struct posix_acl **i_acl) | ||
| 130 | { | ||
| 131 | struct posix_acl *acl = EXT2_ACL_NOT_CACHED; | ||
| 132 | |||
| 133 | spin_lock(&inode->i_lock); | ||
| 134 | if (*i_acl != EXT2_ACL_NOT_CACHED) | ||
| 135 | acl = posix_acl_dup(*i_acl); | ||
| 136 | spin_unlock(&inode->i_lock); | ||
| 137 | |||
| 138 | return acl; | ||
| 139 | } | ||
| 140 | |||
| 141 | static inline void | ||
| 142 | ext2_iset_acl(struct inode *inode, struct posix_acl **i_acl, | ||
| 143 | struct posix_acl *acl) | ||
| 144 | { | ||
| 145 | spin_lock(&inode->i_lock); | ||
| 146 | if (*i_acl != EXT2_ACL_NOT_CACHED) | ||
| 147 | posix_acl_release(*i_acl); | ||
| 148 | *i_acl = posix_acl_dup(acl); | ||
| 149 | spin_unlock(&inode->i_lock); | ||
| 150 | } | ||
| 151 | |||
| 152 | /* | 128 | /* |
| 153 | * inode->i_mutex: don't care | 129 | * inode->i_mutex: don't care |
| 154 | */ | 130 | */ |
| 155 | static struct posix_acl * | 131 | static struct posix_acl * |
| 156 | ext2_get_acl(struct inode *inode, int type) | 132 | ext2_get_acl(struct inode *inode, int type) |
| 157 | { | 133 | { |
| 158 | struct ext2_inode_info *ei = EXT2_I(inode); | ||
| 159 | int name_index; | 134 | int name_index; |
| 160 | char *value = NULL; | 135 | char *value = NULL; |
| 161 | struct posix_acl *acl; | 136 | struct posix_acl *acl; |
| @@ -164,23 +139,19 @@ ext2_get_acl(struct inode *inode, int type) | |||
| 164 | if (!test_opt(inode->i_sb, POSIX_ACL)) | 139 | if (!test_opt(inode->i_sb, POSIX_ACL)) |
| 165 | return NULL; | 140 | return NULL; |
| 166 | 141 | ||
| 167 | switch(type) { | 142 | acl = get_cached_acl(inode, type); |
| 168 | case ACL_TYPE_ACCESS: | 143 | if (acl != ACL_NOT_CACHED) |
| 169 | acl = ext2_iget_acl(inode, &ei->i_acl); | 144 | return acl; |
| 170 | if (acl != EXT2_ACL_NOT_CACHED) | 145 | |
| 171 | return acl; | 146 | switch (type) { |
| 172 | name_index = EXT2_XATTR_INDEX_POSIX_ACL_ACCESS; | 147 | case ACL_TYPE_ACCESS: |
| 173 | break; | 148 | name_index = EXT2_XATTR_INDEX_POSIX_ACL_ACCESS; |
| 174 | 149 | break; | |
| 175 | case ACL_TYPE_DEFAULT: | 150 | case ACL_TYPE_DEFAULT: |
| 176 | acl = ext2_iget_acl(inode, &ei->i_default_acl); | 151 | name_index = EXT2_XATTR_INDEX_POSIX_ACL_DEFAULT; |
| 177 | if (acl != EXT2_ACL_NOT_CACHED) | 152 | break; |
| 178 | return acl; | 153 | default: |
| 179 | name_index = EXT2_XATTR_INDEX_POSIX_ACL_DEFAULT; | 154 | BUG(); |
| 180 | break; | ||
| 181 | |||
| 182 | default: | ||
| 183 | return ERR_PTR(-EINVAL); | ||
| 184 | } | 155 | } |
| 185 | retval = ext2_xattr_get(inode, name_index, "", NULL, 0); | 156 | retval = ext2_xattr_get(inode, name_index, "", NULL, 0); |
| 186 | if (retval > 0) { | 157 | if (retval > 0) { |
| @@ -197,17 +168,9 @@ ext2_get_acl(struct inode *inode, int type) | |||
| 197 | acl = ERR_PTR(retval); | 168 | acl = ERR_PTR(retval); |
| 198 | kfree(value); | 169 | kfree(value); |
| 199 | 170 | ||
| 200 | if (!IS_ERR(acl)) { | 171 | if (!IS_ERR(acl)) |
| 201 | switch(type) { | 172 | set_cached_acl(inode, type, acl); |
| 202 | case ACL_TYPE_ACCESS: | ||
| 203 | ext2_iset_acl(inode, &ei->i_acl, acl); | ||
| 204 | break; | ||
| 205 | 173 | ||
| 206 | case ACL_TYPE_DEFAULT: | ||
| 207 | ext2_iset_acl(inode, &ei->i_default_acl, acl); | ||
| 208 | break; | ||
| 209 | } | ||
| 210 | } | ||
| 211 | return acl; | 174 | return acl; |
| 212 | } | 175 | } |
| 213 | 176 | ||
| @@ -217,7 +180,6 @@ ext2_get_acl(struct inode *inode, int type) | |||
| 217 | static int | 180 | static int |
| 218 | ext2_set_acl(struct inode *inode, int type, struct posix_acl *acl) | 181 | ext2_set_acl(struct inode *inode, int type, struct posix_acl *acl) |
| 219 | { | 182 | { |
| 220 | struct ext2_inode_info *ei = EXT2_I(inode); | ||
| 221 | int name_index; | 183 | int name_index; |
| 222 | void *value = NULL; | 184 | void *value = NULL; |
| 223 | size_t size = 0; | 185 | size_t size = 0; |
| @@ -263,17 +225,8 @@ ext2_set_acl(struct inode *inode, int type, struct posix_acl *acl) | |||
| 263 | error = ext2_xattr_set(inode, name_index, "", value, size, 0); | 225 | error = ext2_xattr_set(inode, name_index, "", value, size, 0); |
| 264 | 226 | ||
| 265 | kfree(value); | 227 | kfree(value); |
| 266 | if (!error) { | 228 | if (!error) |
| 267 | switch(type) { | 229 | set_cached_acl(inode, type, acl); |
| 268 | case ACL_TYPE_ACCESS: | ||
| 269 | ext2_iset_acl(inode, &ei->i_acl, acl); | ||
| 270 | break; | ||
| 271 | |||
| 272 | case ACL_TYPE_DEFAULT: | ||
| 273 | ext2_iset_acl(inode, &ei->i_default_acl, acl); | ||
| 274 | break; | ||
| 275 | } | ||
| 276 | } | ||
| 277 | return error; | 230 | return error; |
| 278 | } | 231 | } |
| 279 | 232 | ||
diff --git a/fs/ext2/acl.h b/fs/ext2/acl.h index b42cf578554b..ecefe478898f 100644 --- a/fs/ext2/acl.h +++ b/fs/ext2/acl.h | |||
| @@ -53,10 +53,6 @@ static inline int ext2_acl_count(size_t size) | |||
| 53 | 53 | ||
| 54 | #ifdef CONFIG_EXT2_FS_POSIX_ACL | 54 | #ifdef CONFIG_EXT2_FS_POSIX_ACL |
| 55 | 55 | ||
| 56 | /* Value for inode->u.ext2_i.i_acl and inode->u.ext2_i.i_default_acl | ||
| 57 | if the ACL has not been cached */ | ||
| 58 | #define EXT2_ACL_NOT_CACHED ((void *)-1) | ||
| 59 | |||
| 60 | /* acl.c */ | 56 | /* acl.c */ |
| 61 | extern int ext2_permission (struct inode *, int); | 57 | extern int ext2_permission (struct inode *, int); |
| 62 | extern int ext2_acl_chmod (struct inode *); | 58 | extern int ext2_acl_chmod (struct inode *); |
diff --git a/fs/ext2/ext2.h b/fs/ext2/ext2.h index d988a718aedb..9a8a8e27a063 100644 --- a/fs/ext2/ext2.h +++ b/fs/ext2/ext2.h | |||
| @@ -47,10 +47,6 @@ struct ext2_inode_info { | |||
| 47 | */ | 47 | */ |
| 48 | struct rw_semaphore xattr_sem; | 48 | struct rw_semaphore xattr_sem; |
| 49 | #endif | 49 | #endif |
| 50 | #ifdef CONFIG_EXT2_FS_POSIX_ACL | ||
| 51 | struct posix_acl *i_acl; | ||
| 52 | struct posix_acl *i_default_acl; | ||
| 53 | #endif | ||
| 54 | rwlock_t i_meta_lock; | 50 | rwlock_t i_meta_lock; |
| 55 | 51 | ||
| 56 | /* | 52 | /* |
diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 29ed682061f6..e27130341d4f 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c | |||
| @@ -1224,10 +1224,6 @@ struct inode *ext2_iget (struct super_block *sb, unsigned long ino) | |||
| 1224 | return inode; | 1224 | return inode; |
| 1225 | 1225 | ||
| 1226 | ei = EXT2_I(inode); | 1226 | ei = EXT2_I(inode); |
| 1227 | #ifdef CONFIG_EXT2_FS_POSIX_ACL | ||
| 1228 | ei->i_acl = EXT2_ACL_NOT_CACHED; | ||
| 1229 | ei->i_default_acl = EXT2_ACL_NOT_CACHED; | ||
| 1230 | #endif | ||
| 1231 | ei->i_block_alloc_info = NULL; | 1227 | ei->i_block_alloc_info = NULL; |
| 1232 | 1228 | ||
| 1233 | raw_inode = ext2_get_inode(inode->i_sb, ino, &bh); | 1229 | raw_inode = ext2_get_inode(inode->i_sb, ino, &bh); |
diff --git a/fs/ext2/super.c b/fs/ext2/super.c index 458999638c3d..1a9ffee47d56 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c | |||
| @@ -152,10 +152,6 @@ static struct inode *ext2_alloc_inode(struct super_block *sb) | |||
| 152 | ei = (struct ext2_inode_info *)kmem_cache_alloc(ext2_inode_cachep, GFP_KERNEL); | 152 | ei = (struct ext2_inode_info *)kmem_cache_alloc(ext2_inode_cachep, GFP_KERNEL); |
| 153 | if (!ei) | 153 | if (!ei) |
| 154 | return NULL; | 154 | return NULL; |
| 155 | #ifdef CONFIG_EXT2_FS_POSIX_ACL | ||
| 156 | ei->i_acl = EXT2_ACL_NOT_CACHED; | ||
| 157 | ei->i_default_acl = EXT2_ACL_NOT_CACHED; | ||
| 158 | #endif | ||
| 159 | ei->i_block_alloc_info = NULL; | 155 | ei->i_block_alloc_info = NULL; |
| 160 | ei->vfs_inode.i_version = 1; | 156 | ei->vfs_inode.i_version = 1; |
| 161 | return &ei->vfs_inode; | 157 | return &ei->vfs_inode; |
| @@ -198,18 +194,6 @@ static void destroy_inodecache(void) | |||
| 198 | static void ext2_clear_inode(struct inode *inode) | 194 | static void ext2_clear_inode(struct inode *inode) |
| 199 | { | 195 | { |
| 200 | struct ext2_block_alloc_info *rsv = EXT2_I(inode)->i_block_alloc_info; | 196 | struct ext2_block_alloc_info *rsv = EXT2_I(inode)->i_block_alloc_info; |
| 201 | #ifdef CONFIG_EXT2_FS_POSIX_ACL | ||
| 202 | struct ext2_inode_info *ei = EXT2_I(inode); | ||
| 203 | |||
| 204 | if (ei->i_acl && ei->i_acl != EXT2_ACL_NOT_CACHED) { | ||
| 205 | posix_acl_release(ei->i_acl); | ||
| 206 | ei->i_acl = EXT2_ACL_NOT_CACHED; | ||
| 207 | } | ||
| 208 | if (ei->i_default_acl && ei->i_default_acl != EXT2_ACL_NOT_CACHED) { | ||
| 209 | posix_acl_release(ei->i_default_acl); | ||
| 210 | ei->i_default_acl = EXT2_ACL_NOT_CACHED; | ||
| 211 | } | ||
| 212 | #endif | ||
| 213 | ext2_discard_reservation(inode); | 197 | ext2_discard_reservation(inode); |
| 214 | EXT2_I(inode)->i_block_alloc_info = NULL; | 198 | EXT2_I(inode)->i_block_alloc_info = NULL; |
| 215 | if (unlikely(rsv)) | 199 | if (unlikely(rsv)) |
diff --git a/fs/ext3/acl.c b/fs/ext3/acl.c index e0c745451715..e167bae37ef0 100644 --- a/fs/ext3/acl.c +++ b/fs/ext3/acl.c | |||
| @@ -126,33 +126,6 @@ fail: | |||
| 126 | return ERR_PTR(-EINVAL); | 126 | return ERR_PTR(-EINVAL); |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | static inline struct posix_acl * | ||
| 130 | ext3_iget_acl(struct inode *inode, struct posix_acl **i_acl) | ||
| 131 | { | ||
| 132 | struct posix_acl *acl = ACCESS_ONCE(*i_acl); | ||
| 133 | |||
| 134 | if (acl) { | ||
| 135 | spin_lock(&inode->i_lock); | ||
| 136 | acl = *i_acl; | ||
| 137 | if (acl != EXT3_ACL_NOT_CACHED) | ||
| 138 | acl = posix_acl_dup(acl); | ||
| 139 | spin_unlock(&inode->i_lock); | ||
| 140 | } | ||
| 141 | |||
| 142 | return acl; | ||
| 143 | } | ||
| 144 | |||
| 145 | static inline void | ||
| 146 | ext3_iset_acl(struct inode *inode, struct posix_acl **i_acl, | ||
| 147 | struct posix_acl *acl) | ||
| 148 | { | ||
| 149 | spin_lock(&inode->i_lock); | ||
| 150 | if (*i_acl != EXT3_ACL_NOT_CACHED) | ||
| 151 | posix_acl_release(*i_acl); | ||
| 152 | *i_acl = posix_acl_dup(acl); | ||
| 153 | spin_unlock(&inode->i_lock); | ||
| 154 | } | ||
| 155 | |||
| 156 | /* | 129 | /* |
| 157 | * Inode operation get_posix_acl(). | 130 | * Inode operation get_posix_acl(). |
| 158 | * | 131 | * |
| @@ -161,7 +134,6 @@ ext3_iset_acl(struct inode *inode, struct posix_acl **i_acl, | |||
| 161 | static struct posix_acl * | 134 | static struct posix_acl * |
| 162 | ext3_get_acl(struct inode *inode, int type) | 135 | ext3_get_acl(struct inode *inode, int type) |
| 163 | { | 136 | { |
| 164 | struct ext3_inode_info *ei = EXT3_I(inode); | ||
| 165 | int name_index; | 137 | int name_index; |
| 166 | char *value = NULL; | 138 | char *value = NULL; |
| 167 | struct posix_acl *acl; | 139 | struct posix_acl *acl; |
| @@ -170,24 +142,21 @@ ext3_get_acl(struct inode *inode, int type) | |||
| 170 | if (!test_opt(inode->i_sb, POSIX_ACL)) | 142 | if (!test_opt(inode->i_sb, POSIX_ACL)) |
| 171 | return NULL; | 143 | return NULL; |
| 172 | 144 | ||
| 173 | switch(type) { | 145 | acl = get_cached_acl(inode, type); |
| 174 | case ACL_TYPE_ACCESS: | 146 | if (acl != ACL_NOT_CACHED) |
| 175 | acl = ext3_iget_acl(inode, &ei->i_acl); | 147 | return acl; |
| 176 | if (acl != EXT3_ACL_NOT_CACHED) | 148 | |
| 177 | return acl; | 149 | switch (type) { |
| 178 | name_index = EXT3_XATTR_INDEX_POSIX_ACL_ACCESS; | 150 | case ACL_TYPE_ACCESS: |
| 179 | break; | 151 | name_index = EXT3_XATTR_INDEX_POSIX_ACL_ACCESS; |
| 180 | 152 | break; | |
| 181 | case ACL_TYPE_DEFAULT: | 153 | case ACL_TYPE_DEFAULT: |
| 182 | acl = ext3_iget_acl(inode, &ei->i_default_acl); | 154 | name_index = EXT3_XATTR_INDEX_POSIX_ACL_DEFAULT; |
| 183 | if (acl != EXT3_ACL_NOT_CACHED) | 155 | break; |
| 184 | return acl; | 156 | default: |
| 185 | name_index = EXT3_XATTR_INDEX_POSIX_ACL_DEFAULT; | 157 | BUG(); |
| 186 | break; | ||
| 187 | |||
| 188 | default: | ||
| 189 | return ERR_PTR(-EINVAL); | ||
| 190 | } | 158 | } |
| 159 | |||
| 191 | retval = ext3_xattr_get(inode, name_index, "", NULL, 0); | 160 | retval = ext3_xattr_get(inode, name_index, "", NULL, 0); |
| 192 | if (retval > 0) { | 161 | if (retval > 0) { |
| 193 | value = kmalloc(retval, GFP_NOFS); | 162 | value = kmalloc(retval, GFP_NOFS); |
| @@ -203,17 +172,9 @@ ext3_get_acl(struct inode *inode, int type) | |||
| 203 | acl = ERR_PTR(retval); | 172 | acl = ERR_PTR(retval); |
| 204 | kfree(value); | 173 | kfree(value); |
| 205 | 174 | ||
| 206 | if (!IS_ERR(acl)) { | 175 | if (!IS_ERR(acl)) |
| 207 | switch(type) { | 176 | set_cached_acl(inode, type, acl); |
| 208 | case ACL_TYPE_ACCESS: | ||
| 209 | ext3_iset_acl(inode, &ei->i_acl, acl); | ||
| 210 | break; | ||
| 211 | 177 | ||
| 212 | case ACL_TYPE_DEFAULT: | ||
| 213 | ext3_iset_acl(inode, &ei->i_default_acl, acl); | ||
| 214 | break; | ||
| 215 | } | ||
| 216 | } | ||
| 217 | return acl; | 178 | return acl; |
| 218 | } | 179 | } |
| 219 | 180 | ||
| @@ -226,7 +187,6 @@ static int | |||
| 226 | ext3_set_acl(handle_t *handle, struct inode *inode, int type, | 187 | ext3_set_acl(handle_t *handle, struct inode *inode, int type, |
| 227 | struct posix_acl *acl) | 188 | struct posix_acl *acl) |
| 228 | { | 189 | { |
| 229 | struct ext3_inode_info *ei = EXT3_I(inode); | ||
| 230 | int name_index; | 190 | int name_index; |
| 231 | void *value = NULL; | 191 | void *value = NULL; |
| 232 | size_t size = 0; | 192 | size_t size = 0; |
| @@ -271,17 +231,10 @@ ext3_set_acl(handle_t *handle, struct inode *inode, int type, | |||
| 271 | value, size, 0); | 231 | value, size, 0); |
| 272 | 232 | ||
| 273 | kfree(value); | 233 | kfree(value); |
| 274 | if (!error) { | ||
| 275 | switch(type) { | ||
| 276 | case ACL_TYPE_ACCESS: | ||
| 277 | ext3_iset_acl(inode, &ei->i_acl, acl); | ||
| 278 | break; | ||
| 279 | 234 | ||
| 280 | case ACL_TYPE_DEFAULT: | 235 | if (!error) |
| 281 | ext3_iset_acl(inode, &ei->i_default_acl, acl); | 236 | set_cached_acl(inode, type, acl); |
| 282 | break; | 237 | |
| 283 | } | ||
| 284 | } | ||
| 285 | return error; | 238 | return error; |
| 286 | } | 239 | } |
| 287 | 240 | ||
diff --git a/fs/ext3/acl.h b/fs/ext3/acl.h index 42da16b8cac0..07d15a3a5969 100644 --- a/fs/ext3/acl.h +++ b/fs/ext3/acl.h | |||
| @@ -53,10 +53,6 @@ static inline int ext3_acl_count(size_t size) | |||
| 53 | 53 | ||
| 54 | #ifdef CONFIG_EXT3_FS_POSIX_ACL | 54 | #ifdef CONFIG_EXT3_FS_POSIX_ACL |
| 55 | 55 | ||
| 56 | /* Value for inode->u.ext3_i.i_acl and inode->u.ext3_i.i_default_acl | ||
| 57 | if the ACL has not been cached */ | ||
| 58 | #define EXT3_ACL_NOT_CACHED ((void *)-1) | ||
| 59 | |||
| 60 | /* acl.c */ | 56 | /* acl.c */ |
| 61 | extern int ext3_permission (struct inode *, int); | 57 | extern int ext3_permission (struct inode *, int); |
| 62 | extern int ext3_acl_chmod (struct inode *); | 58 | extern int ext3_acl_chmod (struct inode *); |
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index 05dea8132fc0..5f51fed5c750 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c | |||
| @@ -2752,10 +2752,6 @@ struct inode *ext3_iget(struct super_block *sb, unsigned long ino) | |||
| 2752 | return inode; | 2752 | return inode; |
| 2753 | 2753 | ||
| 2754 | ei = EXT3_I(inode); | 2754 | ei = EXT3_I(inode); |
| 2755 | #ifdef CONFIG_EXT3_FS_POSIX_ACL | ||
| 2756 | ei->i_acl = EXT3_ACL_NOT_CACHED; | ||
| 2757 | ei->i_default_acl = EXT3_ACL_NOT_CACHED; | ||
| 2758 | #endif | ||
| 2759 | ei->i_block_alloc_info = NULL; | 2755 | ei->i_block_alloc_info = NULL; |
| 2760 | 2756 | ||
| 2761 | ret = __ext3_get_inode_loc(inode, &iloc, 0); | 2757 | ret = __ext3_get_inode_loc(inode, &iloc, 0); |
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 601e881e6105..524b349c6299 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
| @@ -464,10 +464,6 @@ static struct inode *ext3_alloc_inode(struct super_block *sb) | |||
| 464 | ei = kmem_cache_alloc(ext3_inode_cachep, GFP_NOFS); | 464 | ei = kmem_cache_alloc(ext3_inode_cachep, GFP_NOFS); |
| 465 | if (!ei) | 465 | if (!ei) |
| 466 | return NULL; | 466 | return NULL; |
| 467 | #ifdef CONFIG_EXT3_FS_POSIX_ACL | ||
| 468 | ei->i_acl = EXT3_ACL_NOT_CACHED; | ||
| 469 | ei->i_default_acl = EXT3_ACL_NOT_CACHED; | ||
| 470 | #endif | ||
| 471 | ei->i_block_alloc_info = NULL; | 467 | ei->i_block_alloc_info = NULL; |
| 472 | ei->vfs_inode.i_version = 1; | 468 | ei->vfs_inode.i_version = 1; |
| 473 | return &ei->vfs_inode; | 469 | return &ei->vfs_inode; |
| @@ -518,18 +514,6 @@ static void destroy_inodecache(void) | |||
| 518 | static void ext3_clear_inode(struct inode *inode) | 514 | static void ext3_clear_inode(struct inode *inode) |
| 519 | { | 515 | { |
| 520 | struct ext3_block_alloc_info *rsv = EXT3_I(inode)->i_block_alloc_info; | 516 | struct ext3_block_alloc_info *rsv = EXT3_I(inode)->i_block_alloc_info; |
| 521 | #ifdef CONFIG_EXT3_FS_POSIX_ACL | ||
| 522 | if (EXT3_I(inode)->i_acl && | ||
| 523 | EXT3_I(inode)->i_acl != EXT3_ACL_NOT_CACHED) { | ||
| 524 | posix_acl_release(EXT3_I(inode)->i_acl); | ||
| 525 | EXT3_I(inode)->i_acl = EXT3_ACL_NOT_CACHED; | ||
| 526 | } | ||
| 527 | if (EXT3_I(inode)->i_default_acl && | ||
| 528 | EXT3_I(inode)->i_default_acl != EXT3_ACL_NOT_CACHED) { | ||
| 529 | posix_acl_release(EXT3_I(inode)->i_default_acl); | ||
| 530 | EXT3_I(inode)->i_default_acl = EXT3_ACL_NOT_CACHED; | ||
| 531 | } | ||
| 532 | #endif | ||
| 533 | ext3_discard_reservation(inode); | 517 | ext3_discard_reservation(inode); |
| 534 | EXT3_I(inode)->i_block_alloc_info = NULL; | 518 | EXT3_I(inode)->i_block_alloc_info = NULL; |
| 535 | if (unlikely(rsv)) | 519 | if (unlikely(rsv)) |
diff --git a/fs/ext4/acl.c b/fs/ext4/acl.c index 605aeed96d68..f6d8967149ca 100644 --- a/fs/ext4/acl.c +++ b/fs/ext4/acl.c | |||
| @@ -126,33 +126,6 @@ fail: | |||
| 126 | return ERR_PTR(-EINVAL); | 126 | return ERR_PTR(-EINVAL); |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | static inline struct posix_acl * | ||
| 130 | ext4_iget_acl(struct inode *inode, struct posix_acl **i_acl) | ||
| 131 | { | ||
| 132 | struct posix_acl *acl = ACCESS_ONCE(*i_acl); | ||
| 133 | |||
| 134 | if (acl) { | ||
| 135 | spin_lock(&inode->i_lock); | ||
| 136 | acl = *i_acl; | ||
| 137 | if (acl != EXT4_ACL_NOT_CACHED) | ||
| 138 | acl = posix_acl_dup(acl); | ||
| 139 | spin_unlock(&inode->i_lock); | ||
| 140 | } | ||
| 141 | |||
| 142 | return acl; | ||
| 143 | } | ||
| 144 | |||
| 145 | static inline void | ||
| 146 | ext4_iset_acl(struct inode *inode, struct posix_acl **i_acl, | ||
| 147 | struct posix_acl *acl) | ||
| 148 | { | ||
| 149 | spin_lock(&inode->i_lock); | ||
| 150 | if (*i_acl != EXT4_ACL_NOT_CACHED) | ||
| 151 | posix_acl_release(*i_acl); | ||
| 152 | *i_acl = posix_acl_dup(acl); | ||
| 153 | spin_unlock(&inode->i_lock); | ||
| 154 | } | ||
| 155 | |||
| 156 | /* | 129 | /* |
| 157 | * Inode operation get_posix_acl(). | 130 | * Inode operation get_posix_acl(). |
| 158 | * | 131 | * |
| @@ -161,7 +134,6 @@ ext4_iset_acl(struct inode *inode, struct posix_acl **i_acl, | |||
| 161 | static struct posix_acl * | 134 | static struct posix_acl * |
| 162 | ext4_get_acl(struct inode *inode, int type) | 135 | ext4_get_acl(struct inode *inode, int type) |
| 163 | { | 136 | { |
| 164 | struct ext4_inode_info *ei = EXT4_I(inode); | ||
| 165 | int name_index; | 137 | int name_index; |
| 166 | char *value = NULL; | 138 | char *value = NULL; |
| 167 | struct posix_acl *acl; | 139 | struct posix_acl *acl; |
| @@ -170,23 +142,19 @@ ext4_get_acl(struct inode *inode, int type) | |||
| 170 | if (!test_opt(inode->i_sb, POSIX_ACL)) | 142 | if (!test_opt(inode->i_sb, POSIX_ACL)) |
| 171 | return NULL; | 143 | return NULL; |
| 172 | 144 | ||
| 145 | acl = get_cached_acl(inode, type); | ||
| 146 | if (acl != ACL_NOT_CACHED) | ||
| 147 | return acl; | ||
| 148 | |||
| 173 | switch (type) { | 149 | switch (type) { |
| 174 | case ACL_TYPE_ACCESS: | 150 | case ACL_TYPE_ACCESS: |
| 175 | acl = ext4_iget_acl(inode, &ei->i_acl); | ||
| 176 | if (acl != EXT4_ACL_NOT_CACHED) | ||
| 177 | return acl; | ||
| 178 | name_index = EXT4_XATTR_INDEX_POSIX_ACL_ACCESS; | 151 | name_index = EXT4_XATTR_INDEX_POSIX_ACL_ACCESS; |
| 179 | break; | 152 | break; |
| 180 | |||
| 181 | case ACL_TYPE_DEFAULT: | 153 | case ACL_TYPE_DEFAULT: |
| 182 | acl = ext4_iget_acl(inode, &ei->i_default_acl); | ||
| 183 | if (acl != EXT4_ACL_NOT_CACHED) | ||
| 184 | return acl; | ||
| 185 | name_index = EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT; | 154 | name_index = EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT; |
| 186 | break; | 155 | break; |
| 187 | |||
| 188 | default: | 156 | default: |
| 189 | return ERR_PTR(-EINVAL); | 157 | BUG(); |
| 190 | } | 158 | } |
| 191 | retval = ext4_xattr_get(inode, name_index, "", NULL, 0); | 159 | retval = ext4_xattr_get(inode, name_index, "", NULL, 0); |
| 192 | if (retval > 0) { | 160 | if (retval > 0) { |
| @@ -203,17 +171,9 @@ ext4_get_acl(struct inode *inode, int type) | |||
| 203 | acl = ERR_PTR(retval); | 171 | acl = ERR_PTR(retval); |
| 204 | kfree(value); | 172 | kfree(value); |
| 205 | 173 | ||
| 206 | if (!IS_ERR(acl)) { | 174 | if (!IS_ERR(acl)) |
| 207 | switch (type) { | 175 | set_cached_acl(inode, type, acl); |
| 208 | case ACL_TYPE_ACCESS: | ||
| 209 | ext4_iset_acl(inode, &ei->i_acl, acl); | ||
| 210 | break; | ||
| 211 | 176 | ||
| 212 | case ACL_TYPE_DEFAULT: | ||
| 213 | ext4_iset_acl(inode, &ei->i_default_acl, acl); | ||
| 214 | break; | ||
| 215 | } | ||
| 216 | } | ||
| 217 | return acl; | 177 | return acl; |
| 218 | } | 178 | } |
| 219 | 179 | ||
| @@ -226,7 +186,6 @@ static int | |||
| 226 | ext4_set_acl(handle_t *handle, struct inode *inode, int type, | 186 | ext4_set_acl(handle_t *handle, struct inode *inode, int type, |
| 227 | struct posix_acl *acl) | 187 | struct posix_acl *acl) |
| 228 | { | 188 | { |
| 229 | struct ext4_inode_info *ei = EXT4_I(inode); | ||
| 230 | int name_index; | 189 | int name_index; |
| 231 | void *value = NULL; | 190 | void *value = NULL; |
| 232 | size_t size = 0; | 191 | size_t size = 0; |
| @@ -271,17 +230,9 @@ ext4_set_acl(handle_t *handle, struct inode *inode, int type, | |||
| 271 | value, size, 0); | 230 | value, size, 0); |
| 272 | 231 | ||
| 273 | kfree(value); | 232 | kfree(value); |
| 274 | if (!error) { | 233 | if (!error) |
| 275 | switch (type) { | 234 | set_cached_acl(inode, type, acl); |
| 276 | case ACL_TYPE_ACCESS: | ||
| 277 | ext4_iset_acl(inode, &ei->i_acl, acl); | ||
| 278 | break; | ||
| 279 | 235 | ||
| 280 | case ACL_TYPE_DEFAULT: | ||
| 281 | ext4_iset_acl(inode, &ei->i_default_acl, acl); | ||
| 282 | break; | ||
| 283 | } | ||
| 284 | } | ||
| 285 | return error; | 236 | return error; |
| 286 | } | 237 | } |
| 287 | 238 | ||
diff --git a/fs/ext4/acl.h b/fs/ext4/acl.h index cb45257a246e..949789d2bba6 100644 --- a/fs/ext4/acl.h +++ b/fs/ext4/acl.h | |||
| @@ -53,10 +53,6 @@ static inline int ext4_acl_count(size_t size) | |||
| 53 | 53 | ||
| 54 | #ifdef CONFIG_EXT4_FS_POSIX_ACL | 54 | #ifdef CONFIG_EXT4_FS_POSIX_ACL |
| 55 | 55 | ||
| 56 | /* Value for inode->u.ext4_i.i_acl and inode->u.ext4_i.i_default_acl | ||
| 57 | if the ACL has not been cached */ | ||
| 58 | #define EXT4_ACL_NOT_CACHED ((void *)-1) | ||
| 59 | |||
| 60 | /* acl.c */ | 56 | /* acl.c */ |
| 61 | extern int ext4_permission(struct inode *, int); | 57 | extern int ext4_permission(struct inode *, int); |
| 62 | extern int ext4_acl_chmod(struct inode *); | 58 | extern int ext4_acl_chmod(struct inode *); |
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 17b9998680e3..0ddf7e55abe1 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
| @@ -595,10 +595,6 @@ struct ext4_inode_info { | |||
| 595 | */ | 595 | */ |
| 596 | struct rw_semaphore xattr_sem; | 596 | struct rw_semaphore xattr_sem; |
| 597 | #endif | 597 | #endif |
| 598 | #ifdef CONFIG_EXT4_FS_POSIX_ACL | ||
| 599 | struct posix_acl *i_acl; | ||
| 600 | struct posix_acl *i_default_acl; | ||
| 601 | #endif | ||
| 602 | 598 | ||
| 603 | struct list_head i_orphan; /* unlinked but open inodes */ | 599 | struct list_head i_orphan; /* unlinked but open inodes */ |
| 604 | 600 | ||
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 7c17ae275af4..60a26f3a6f8b 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
| @@ -4453,10 +4453,6 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | |||
| 4453 | return inode; | 4453 | return inode; |
| 4454 | 4454 | ||
| 4455 | ei = EXT4_I(inode); | 4455 | ei = EXT4_I(inode); |
| 4456 | #ifdef CONFIG_EXT4_FS_POSIX_ACL | ||
| 4457 | ei->i_acl = EXT4_ACL_NOT_CACHED; | ||
| 4458 | ei->i_default_acl = EXT4_ACL_NOT_CACHED; | ||
| 4459 | #endif | ||
| 4460 | 4456 | ||
| 4461 | ret = __ext4_get_inode_loc(inode, &iloc, 0); | 4457 | ret = __ext4_get_inode_loc(inode, &iloc, 0); |
| 4462 | if (ret < 0) | 4458 | if (ret < 0) |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 8bb9e2d3e4b8..8f4f079e6b9a 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
| @@ -666,10 +666,6 @@ static struct inode *ext4_alloc_inode(struct super_block *sb) | |||
| 666 | if (!ei) | 666 | if (!ei) |
| 667 | return NULL; | 667 | return NULL; |
| 668 | 668 | ||
| 669 | #ifdef CONFIG_EXT4_FS_POSIX_ACL | ||
| 670 | ei->i_acl = EXT4_ACL_NOT_CACHED; | ||
| 671 | ei->i_default_acl = EXT4_ACL_NOT_CACHED; | ||
| 672 | #endif | ||
| 673 | ei->vfs_inode.i_version = 1; | 669 | ei->vfs_inode.i_version = 1; |
| 674 | ei->vfs_inode.i_data.writeback_index = 0; | 670 | ei->vfs_inode.i_data.writeback_index = 0; |
| 675 | memset(&ei->i_cached_extent, 0, sizeof(struct ext4_ext_cache)); | 671 | memset(&ei->i_cached_extent, 0, sizeof(struct ext4_ext_cache)); |
| @@ -735,18 +731,6 @@ static void destroy_inodecache(void) | |||
| 735 | 731 | ||
| 736 | static void ext4_clear_inode(struct inode *inode) | 732 | static void ext4_clear_inode(struct inode *inode) |
| 737 | { | 733 | { |
| 738 | #ifdef CONFIG_EXT4_FS_POSIX_ACL | ||
| 739 | if (EXT4_I(inode)->i_acl && | ||
| 740 | EXT4_I(inode)->i_acl != EXT4_ACL_NOT_CACHED) { | ||
| 741 | posix_acl_release(EXT4_I(inode)->i_acl); | ||
| 742 | EXT4_I(inode)->i_acl = EXT4_ACL_NOT_CACHED; | ||
| 743 | } | ||
| 744 | if (EXT4_I(inode)->i_default_acl && | ||
| 745 | EXT4_I(inode)->i_default_acl != EXT4_ACL_NOT_CACHED) { | ||
| 746 | posix_acl_release(EXT4_I(inode)->i_default_acl); | ||
| 747 | EXT4_I(inode)->i_default_acl = EXT4_ACL_NOT_CACHED; | ||
| 748 | } | ||
| 749 | #endif | ||
| 750 | ext4_discard_preallocations(inode); | 734 | ext4_discard_preallocations(inode); |
| 751 | if (EXT4_JOURNAL(inode)) | 735 | if (EXT4_JOURNAL(inode)) |
| 752 | jbd2_journal_release_jbd_inode(EXT4_SB(inode->i_sb)->s_journal, | 736 | jbd2_journal_release_jbd_inode(EXT4_SB(inode->i_sb)->s_journal, |
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index caf049146ca2..c54226be5294 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c | |||
| @@ -278,7 +278,26 @@ int sb_has_dirty_inodes(struct super_block *sb) | |||
| 278 | EXPORT_SYMBOL(sb_has_dirty_inodes); | 278 | EXPORT_SYMBOL(sb_has_dirty_inodes); |
| 279 | 279 | ||
| 280 | /* | 280 | /* |
| 281 | * Write a single inode's dirty pages and inode data out to disk. | 281 | * Wait for writeback on an inode to complete. |
| 282 | */ | ||
| 283 | static void inode_wait_for_writeback(struct inode *inode) | ||
| 284 | { | ||
| 285 | DEFINE_WAIT_BIT(wq, &inode->i_state, __I_SYNC); | ||
| 286 | wait_queue_head_t *wqh; | ||
| 287 | |||
| 288 | wqh = bit_waitqueue(&inode->i_state, __I_SYNC); | ||
| 289 | do { | ||
| 290 | spin_unlock(&inode_lock); | ||
| 291 | __wait_on_bit(wqh, &wq, inode_wait, TASK_UNINTERRUPTIBLE); | ||
| 292 | spin_lock(&inode_lock); | ||
| 293 | } while (inode->i_state & I_SYNC); | ||
| 294 | } | ||
| 295 | |||
| 296 | /* | ||
| 297 | * Write out an inode's dirty pages. Called under inode_lock. Either the | ||
| 298 | * caller has ref on the inode (either via __iget or via syscall against an fd) | ||
| 299 | * or the inode has I_WILL_FREE set (via generic_forget_inode) | ||
| 300 | * | ||
| 282 | * If `wait' is set, wait on the writeout. | 301 | * If `wait' is set, wait on the writeout. |
| 283 | * | 302 | * |
| 284 | * The whole writeout design is quite complex and fragile. We want to avoid | 303 | * The whole writeout design is quite complex and fragile. We want to avoid |
| @@ -288,13 +307,38 @@ EXPORT_SYMBOL(sb_has_dirty_inodes); | |||
| 288 | * Called under inode_lock. | 307 | * Called under inode_lock. |
| 289 | */ | 308 | */ |
| 290 | static int | 309 | static int |
| 291 | __sync_single_inode(struct inode *inode, struct writeback_control *wbc) | 310 | writeback_single_inode(struct inode *inode, struct writeback_control *wbc) |
| 292 | { | 311 | { |
| 293 | unsigned dirty; | ||
| 294 | struct address_space *mapping = inode->i_mapping; | 312 | struct address_space *mapping = inode->i_mapping; |
| 295 | int wait = wbc->sync_mode == WB_SYNC_ALL; | 313 | int wait = wbc->sync_mode == WB_SYNC_ALL; |
| 314 | unsigned dirty; | ||
| 296 | int ret; | 315 | int ret; |
| 297 | 316 | ||
| 317 | if (!atomic_read(&inode->i_count)) | ||
| 318 | WARN_ON(!(inode->i_state & (I_WILL_FREE|I_FREEING))); | ||
| 319 | else | ||
| 320 | WARN_ON(inode->i_state & I_WILL_FREE); | ||
| 321 | |||
| 322 | if (inode->i_state & I_SYNC) { | ||
| 323 | /* | ||
| 324 | * If this inode is locked for writeback and we are not doing | ||
| 325 | * writeback-for-data-integrity, move it to s_more_io so that | ||
| 326 | * writeback can proceed with the other inodes on s_io. | ||
| 327 | * | ||
| 328 | * We'll have another go at writing back this inode when we | ||
| 329 | * completed a full scan of s_io. | ||
| 330 | */ | ||
| 331 | if (!wait) { | ||
| 332 | requeue_io(inode); | ||
| 333 | return 0; | ||
| 334 | } | ||
| 335 | |||
| 336 | /* | ||
| 337 | * It's a data-integrity sync. We must wait. | ||
| 338 | */ | ||
| 339 | inode_wait_for_writeback(inode); | ||
| 340 | } | ||
| 341 | |||
| 298 | BUG_ON(inode->i_state & I_SYNC); | 342 | BUG_ON(inode->i_state & I_SYNC); |
| 299 | 343 | ||
| 300 | /* Set I_SYNC, reset I_DIRTY */ | 344 | /* Set I_SYNC, reset I_DIRTY */ |
| @@ -390,50 +434,6 @@ __sync_single_inode(struct inode *inode, struct writeback_control *wbc) | |||
| 390 | } | 434 | } |
| 391 | 435 | ||
| 392 | /* | 436 | /* |
| 393 | * Write out an inode's dirty pages. Called under inode_lock. Either the | ||
| 394 | * caller has ref on the inode (either via __iget or via syscall against an fd) | ||
| 395 | * or the inode has I_WILL_FREE set (via generic_forget_inode) | ||
| 396 | */ | ||
| 397 | static int | ||
| 398 | __writeback_single_inode(struct inode *inode, struct writeback_control *wbc) | ||
| 399 | { | ||
| 400 | wait_queue_head_t *wqh; | ||
| 401 | |||
| 402 | if (!atomic_read(&inode->i_count)) | ||
| 403 | WARN_ON(!(inode->i_state & (I_WILL_FREE|I_FREEING))); | ||
| 404 | else | ||
| 405 | WARN_ON(inode->i_state & I_WILL_FREE); | ||
| 406 | |||
| 407 | if ((wbc->sync_mode != WB_SYNC_ALL) && (inode->i_state & I_SYNC)) { | ||
| 408 | /* | ||
| 409 | * We're skipping this inode because it's locked, and we're not | ||
| 410 | * doing writeback-for-data-integrity. Move it to s_more_io so | ||
| 411 | * that writeback can proceed with the other inodes on s_io. | ||
| 412 | * We'll have another go at writing back this inode when we | ||
| 413 | * completed a full scan of s_io. | ||
| 414 | */ | ||
| 415 | requeue_io(inode); | ||
| 416 | return 0; | ||
| 417 | } | ||
| 418 | |||
| 419 | /* | ||
| 420 | * It's a data-integrity sync. We must wait. | ||
| 421 | */ | ||
| 422 | if (inode->i_state & I_SYNC) { | ||
| 423 | DEFINE_WAIT_BIT(wq, &inode->i_state, __I_SYNC); | ||
| 424 | |||
| 425 | wqh = bit_waitqueue(&inode->i_state, __I_SYNC); | ||
| 426 | do { | ||
| 427 | spin_unlock(&inode_lock); | ||
| 428 | __wait_on_bit(wqh, &wq, inode_wait, | ||
| 429 | TASK_UNINTERRUPTIBLE); | ||
| 430 | spin_lock(&inode_lock); | ||
| 431 | } while (inode->i_state & I_SYNC); | ||
| 432 | } | ||
| 433 | return __sync_single_inode(inode, wbc); | ||
| 434 | } | ||
| 435 | |||
| 436 | /* | ||
| 437 | * Write out a superblock's list of dirty inodes. A wait will be performed | 437 | * Write out a superblock's list of dirty inodes. A wait will be performed |
| 438 | * upon no inodes, all inodes or the final one, depending upon sync_mode. | 438 | * upon no inodes, all inodes or the final one, depending upon sync_mode. |
| 439 | * | 439 | * |
| @@ -526,7 +526,7 @@ void generic_sync_sb_inodes(struct super_block *sb, | |||
| 526 | BUG_ON(inode->i_state & (I_FREEING | I_CLEAR)); | 526 | BUG_ON(inode->i_state & (I_FREEING | I_CLEAR)); |
| 527 | __iget(inode); | 527 | __iget(inode); |
| 528 | pages_skipped = wbc->pages_skipped; | 528 | pages_skipped = wbc->pages_skipped; |
| 529 | __writeback_single_inode(inode, wbc); | 529 | writeback_single_inode(inode, wbc); |
| 530 | if (current_is_pdflush()) | 530 | if (current_is_pdflush()) |
| 531 | writeback_release(bdi); | 531 | writeback_release(bdi); |
| 532 | if (wbc->pages_skipped != pages_skipped) { | 532 | if (wbc->pages_skipped != pages_skipped) { |
| @@ -708,7 +708,7 @@ int write_inode_now(struct inode *inode, int sync) | |||
| 708 | 708 | ||
| 709 | might_sleep(); | 709 | might_sleep(); |
| 710 | spin_lock(&inode_lock); | 710 | spin_lock(&inode_lock); |
| 711 | ret = __writeback_single_inode(inode, &wbc); | 711 | ret = writeback_single_inode(inode, &wbc); |
| 712 | spin_unlock(&inode_lock); | 712 | spin_unlock(&inode_lock); |
| 713 | if (sync) | 713 | if (sync) |
| 714 | inode_sync_wait(inode); | 714 | inode_sync_wait(inode); |
| @@ -732,7 +732,7 @@ int sync_inode(struct inode *inode, struct writeback_control *wbc) | |||
| 732 | int ret; | 732 | int ret; |
| 733 | 733 | ||
| 734 | spin_lock(&inode_lock); | 734 | spin_lock(&inode_lock); |
| 735 | ret = __writeback_single_inode(inode, wbc); | 735 | ret = writeback_single_inode(inode, wbc); |
| 736 | spin_unlock(&inode_lock); | 736 | spin_unlock(&inode_lock); |
| 737 | return ret; | 737 | return ret; |
| 738 | } | 738 | } |
diff --git a/fs/inode.c b/fs/inode.c index 04c785bb63c3..901bad1e5f12 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <linux/fsnotify.h> | 25 | #include <linux/fsnotify.h> |
| 26 | #include <linux/mount.h> | 26 | #include <linux/mount.h> |
| 27 | #include <linux/async.h> | 27 | #include <linux/async.h> |
| 28 | #include <linux/posix_acl.h> | ||
| 28 | 29 | ||
| 29 | /* | 30 | /* |
| 30 | * This is needed for the following functions: | 31 | * This is needed for the following functions: |
| @@ -189,6 +190,9 @@ struct inode *inode_init_always(struct super_block *sb, struct inode *inode) | |||
| 189 | } | 190 | } |
| 190 | inode->i_private = NULL; | 191 | inode->i_private = NULL; |
| 191 | inode->i_mapping = mapping; | 192 | inode->i_mapping = mapping; |
| 193 | #ifdef CONFIG_FS_POSIX_ACL | ||
| 194 | inode->i_acl = inode->i_default_acl = ACL_NOT_CACHED; | ||
| 195 | #endif | ||
| 192 | 196 | ||
| 193 | #ifdef CONFIG_FSNOTIFY | 197 | #ifdef CONFIG_FSNOTIFY |
| 194 | inode->i_fsnotify_mask = 0; | 198 | inode->i_fsnotify_mask = 0; |
| @@ -227,6 +231,12 @@ void destroy_inode(struct inode *inode) | |||
| 227 | ima_inode_free(inode); | 231 | ima_inode_free(inode); |
| 228 | security_inode_free(inode); | 232 | security_inode_free(inode); |
| 229 | fsnotify_inode_delete(inode); | 233 | fsnotify_inode_delete(inode); |
| 234 | #ifdef CONFIG_FS_POSIX_ACL | ||
| 235 | if (inode->i_acl && inode->i_acl != ACL_NOT_CACHED) | ||
| 236 | posix_acl_release(inode->i_acl); | ||
| 237 | if (inode->i_default_acl && inode->i_default_acl != ACL_NOT_CACHED) | ||
| 238 | posix_acl_release(inode->i_default_acl); | ||
| 239 | #endif | ||
| 230 | if (inode->i_sb->s_op->destroy_inode) | 240 | if (inode->i_sb->s_op->destroy_inode) |
| 231 | inode->i_sb->s_op->destroy_inode(inode); | 241 | inode->i_sb->s_op->destroy_inode(inode); |
| 232 | else | 242 | else |
diff --git a/fs/ioctl.c b/fs/ioctl.c index 001f8d3118f2..5612880fcbe7 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <linux/uaccess.h> | 15 | #include <linux/uaccess.h> |
| 16 | #include <linux/writeback.h> | 16 | #include <linux/writeback.h> |
| 17 | #include <linux/buffer_head.h> | 17 | #include <linux/buffer_head.h> |
| 18 | #include <linux/falloc.h> | ||
| 18 | 19 | ||
| 19 | #include <asm/ioctls.h> | 20 | #include <asm/ioctls.h> |
| 20 | 21 | ||
| @@ -403,6 +404,37 @@ EXPORT_SYMBOL(generic_block_fiemap); | |||
| 403 | 404 | ||
| 404 | #endif /* CONFIG_BLOCK */ | 405 | #endif /* CONFIG_BLOCK */ |
| 405 | 406 | ||
| 407 | /* | ||
| 408 | * This provides compatibility with legacy XFS pre-allocation ioctls | ||
| 409 | * which predate the fallocate syscall. | ||
| 410 | * | ||
| 411 | * Only the l_start, l_len and l_whence fields of the 'struct space_resv' | ||
| 412 | * are used here, rest are ignored. | ||
| 413 | */ | ||
| 414 | int ioctl_preallocate(struct file *filp, void __user *argp) | ||
| 415 | { | ||
| 416 | struct inode *inode = filp->f_path.dentry->d_inode; | ||
| 417 | struct space_resv sr; | ||
| 418 | |||
| 419 | if (copy_from_user(&sr, argp, sizeof(sr))) | ||
| 420 | return -EFAULT; | ||
| 421 | |||
| 422 | switch (sr.l_whence) { | ||
| 423 | case SEEK_SET: | ||
| 424 | break; | ||
| 425 | case SEEK_CUR: | ||
| 426 | sr.l_start += filp->f_pos; | ||
| 427 | break; | ||
| 428 | case SEEK_END: | ||
| 429 | sr.l_start += i_size_read(inode); | ||
| 430 | break; | ||
| 431 | default: | ||
| 432 | return -EINVAL; | ||
| 433 | } | ||
| 434 | |||
| 435 | return do_fallocate(filp, FALLOC_FL_KEEP_SIZE, sr.l_start, sr.l_len); | ||
| 436 | } | ||
| 437 | |||
| 406 | static int file_ioctl(struct file *filp, unsigned int cmd, | 438 | static int file_ioctl(struct file *filp, unsigned int cmd, |
| 407 | unsigned long arg) | 439 | unsigned long arg) |
| 408 | { | 440 | { |
| @@ -414,6 +446,9 @@ static int file_ioctl(struct file *filp, unsigned int cmd, | |||
| 414 | return ioctl_fibmap(filp, p); | 446 | return ioctl_fibmap(filp, p); |
| 415 | case FIONREAD: | 447 | case FIONREAD: |
| 416 | return put_user(i_size_read(inode) - filp->f_pos, p); | 448 | return put_user(i_size_read(inode) - filp->f_pos, p); |
| 449 | case FS_IOC_RESVSP: | ||
| 450 | case FS_IOC_RESVSP64: | ||
| 451 | return ioctl_preallocate(filp, p); | ||
| 417 | } | 452 | } |
| 418 | 453 | ||
| 419 | return vfs_ioctl(filp, cmd, arg); | 454 | return vfs_ioctl(filp, cmd, arg); |
diff --git a/fs/jffs2/acl.c b/fs/jffs2/acl.c index 043740dde20c..edd2ad6416d8 100644 --- a/fs/jffs2/acl.c +++ b/fs/jffs2/acl.c | |||
| @@ -156,48 +156,25 @@ static void *jffs2_acl_to_medium(const struct posix_acl *acl, size_t *size) | |||
| 156 | return ERR_PTR(-EINVAL); | 156 | return ERR_PTR(-EINVAL); |
| 157 | } | 157 | } |
| 158 | 158 | ||
| 159 | static struct posix_acl *jffs2_iget_acl(struct inode *inode, struct posix_acl **i_acl) | ||
| 160 | { | ||
| 161 | struct posix_acl *acl = JFFS2_ACL_NOT_CACHED; | ||
| 162 | |||
| 163 | spin_lock(&inode->i_lock); | ||
| 164 | if (*i_acl != JFFS2_ACL_NOT_CACHED) | ||
| 165 | acl = posix_acl_dup(*i_acl); | ||
| 166 | spin_unlock(&inode->i_lock); | ||
| 167 | return acl; | ||
| 168 | } | ||
| 169 | |||
| 170 | static void jffs2_iset_acl(struct inode *inode, struct posix_acl **i_acl, struct posix_acl *acl) | ||
| 171 | { | ||
| 172 | spin_lock(&inode->i_lock); | ||
| 173 | if (*i_acl != JFFS2_ACL_NOT_CACHED) | ||
| 174 | posix_acl_release(*i_acl); | ||
| 175 | *i_acl = posix_acl_dup(acl); | ||
| 176 | spin_unlock(&inode->i_lock); | ||
| 177 | } | ||
| 178 | |||
| 179 | static struct posix_acl *jffs2_get_acl(struct inode *inode, int type) | 159 | static struct posix_acl *jffs2_get_acl(struct inode *inode, int type) |
| 180 | { | 160 | { |
| 181 | struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); | ||
| 182 | struct posix_acl *acl; | 161 | struct posix_acl *acl; |
| 183 | char *value = NULL; | 162 | char *value = NULL; |
| 184 | int rc, xprefix; | 163 | int rc, xprefix; |
| 185 | 164 | ||
| 165 | acl = get_cached_acl(inode, type); | ||
| 166 | if (acl != ACL_NOT_CACHED) | ||
| 167 | return acl; | ||
| 168 | |||
| 186 | switch (type) { | 169 | switch (type) { |
| 187 | case ACL_TYPE_ACCESS: | 170 | case ACL_TYPE_ACCESS: |
| 188 | acl = jffs2_iget_acl(inode, &f->i_acl_access); | ||
| 189 | if (acl != JFFS2_ACL_NOT_CACHED) | ||
| 190 | return acl; | ||
| 191 | xprefix = JFFS2_XPREFIX_ACL_ACCESS; | 171 | xprefix = JFFS2_XPREFIX_ACL_ACCESS; |
| 192 | break; | 172 | break; |
| 193 | case ACL_TYPE_DEFAULT: | 173 | case ACL_TYPE_DEFAULT: |
| 194 | acl = jffs2_iget_acl(inode, &f->i_acl_default); | ||
| 195 | if (acl != JFFS2_ACL_NOT_CACHED) | ||
| 196 | return acl; | ||
| 197 | xprefix = JFFS2_XPREFIX_ACL_DEFAULT; | 174 | xprefix = JFFS2_XPREFIX_ACL_DEFAULT; |
| 198 | break; | 175 | break; |
| 199 | default: | 176 | default: |
| 200 | return ERR_PTR(-EINVAL); | 177 | BUG(); |
| 201 | } | 178 | } |
| 202 | rc = do_jffs2_getxattr(inode, xprefix, "", NULL, 0); | 179 | rc = do_jffs2_getxattr(inode, xprefix, "", NULL, 0); |
| 203 | if (rc > 0) { | 180 | if (rc > 0) { |
| @@ -215,16 +192,8 @@ static struct posix_acl *jffs2_get_acl(struct inode *inode, int type) | |||
| 215 | } | 192 | } |
| 216 | if (value) | 193 | if (value) |
| 217 | kfree(value); | 194 | kfree(value); |
| 218 | if (!IS_ERR(acl)) { | 195 | if (!IS_ERR(acl)) |
| 219 | switch (type) { | 196 | set_cached_acl(inode, type, acl); |
| 220 | case ACL_TYPE_ACCESS: | ||
| 221 | jffs2_iset_acl(inode, &f->i_acl_access, acl); | ||
| 222 | break; | ||
| 223 | case ACL_TYPE_DEFAULT: | ||
| 224 | jffs2_iset_acl(inode, &f->i_acl_default, acl); | ||
| 225 | break; | ||
| 226 | } | ||
| 227 | } | ||
| 228 | return acl; | 197 | return acl; |
| 229 | } | 198 | } |
| 230 | 199 | ||
| @@ -249,7 +218,6 @@ static int __jffs2_set_acl(struct inode *inode, int xprefix, struct posix_acl *a | |||
| 249 | 218 | ||
| 250 | static int jffs2_set_acl(struct inode *inode, int type, struct posix_acl *acl) | 219 | static int jffs2_set_acl(struct inode *inode, int type, struct posix_acl *acl) |
| 251 | { | 220 | { |
| 252 | struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); | ||
| 253 | int rc, xprefix; | 221 | int rc, xprefix; |
| 254 | 222 | ||
| 255 | if (S_ISLNK(inode->i_mode)) | 223 | if (S_ISLNK(inode->i_mode)) |
| @@ -285,16 +253,8 @@ static int jffs2_set_acl(struct inode *inode, int type, struct posix_acl *acl) | |||
| 285 | return -EINVAL; | 253 | return -EINVAL; |
| 286 | } | 254 | } |
| 287 | rc = __jffs2_set_acl(inode, xprefix, acl); | 255 | rc = __jffs2_set_acl(inode, xprefix, acl); |
| 288 | if (!rc) { | 256 | if (!rc) |
| 289 | switch(type) { | 257 | set_cached_acl(inode, type, acl); |
| 290 | case ACL_TYPE_ACCESS: | ||
| 291 | jffs2_iset_acl(inode, &f->i_acl_access, acl); | ||
| 292 | break; | ||
| 293 | case ACL_TYPE_DEFAULT: | ||
| 294 | jffs2_iset_acl(inode, &f->i_acl_default, acl); | ||
| 295 | break; | ||
| 296 | } | ||
| 297 | } | ||
| 298 | return rc; | 258 | return rc; |
| 299 | } | 259 | } |
| 300 | 260 | ||
| @@ -321,12 +281,11 @@ int jffs2_permission(struct inode *inode, int mask) | |||
| 321 | 281 | ||
| 322 | int jffs2_init_acl_pre(struct inode *dir_i, struct inode *inode, int *i_mode) | 282 | int jffs2_init_acl_pre(struct inode *dir_i, struct inode *inode, int *i_mode) |
| 323 | { | 283 | { |
| 324 | struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); | ||
| 325 | struct posix_acl *acl, *clone; | 284 | struct posix_acl *acl, *clone; |
| 326 | int rc; | 285 | int rc; |
| 327 | 286 | ||
| 328 | f->i_acl_default = NULL; | 287 | inode->i_default_acl = NULL; |
| 329 | f->i_acl_access = NULL; | 288 | inode->i_acl = NULL; |
| 330 | 289 | ||
| 331 | if (S_ISLNK(*i_mode)) | 290 | if (S_ISLNK(*i_mode)) |
| 332 | return 0; /* Symlink always has no-ACL */ | 291 | return 0; /* Symlink always has no-ACL */ |
| @@ -339,7 +298,7 @@ int jffs2_init_acl_pre(struct inode *dir_i, struct inode *inode, int *i_mode) | |||
| 339 | *i_mode &= ~current_umask(); | 298 | *i_mode &= ~current_umask(); |
| 340 | } else { | 299 | } else { |
| 341 | if (S_ISDIR(*i_mode)) | 300 | if (S_ISDIR(*i_mode)) |
| 342 | jffs2_iset_acl(inode, &f->i_acl_default, acl); | 301 | set_cached_acl(inode, ACL_TYPE_DEFAULT, acl); |
| 343 | 302 | ||
| 344 | clone = posix_acl_clone(acl, GFP_KERNEL); | 303 | clone = posix_acl_clone(acl, GFP_KERNEL); |
| 345 | if (!clone) | 304 | if (!clone) |
| @@ -350,7 +309,7 @@ int jffs2_init_acl_pre(struct inode *dir_i, struct inode *inode, int *i_mode) | |||
| 350 | return rc; | 309 | return rc; |
| 351 | } | 310 | } |
| 352 | if (rc > 0) | 311 | if (rc > 0) |
| 353 | jffs2_iset_acl(inode, &f->i_acl_access, clone); | 312 | set_cached_acl(inode, ACL_TYPE_ACCESS, clone); |
| 354 | 313 | ||
| 355 | posix_acl_release(clone); | 314 | posix_acl_release(clone); |
| 356 | } | 315 | } |
| @@ -359,17 +318,16 @@ int jffs2_init_acl_pre(struct inode *dir_i, struct inode *inode, int *i_mode) | |||
| 359 | 318 | ||
| 360 | int jffs2_init_acl_post(struct inode *inode) | 319 | int jffs2_init_acl_post(struct inode *inode) |
| 361 | { | 320 | { |
| 362 | struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); | ||
| 363 | int rc; | 321 | int rc; |
| 364 | 322 | ||
| 365 | if (f->i_acl_default) { | 323 | if (inode->i_default_acl) { |
| 366 | rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_DEFAULT, f->i_acl_default); | 324 | rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_DEFAULT, inode->i_default_acl); |
| 367 | if (rc) | 325 | if (rc) |
| 368 | return rc; | 326 | return rc; |
| 369 | } | 327 | } |
| 370 | 328 | ||
| 371 | if (f->i_acl_access) { | 329 | if (inode->i_acl) { |
| 372 | rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_ACCESS, f->i_acl_access); | 330 | rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_ACCESS, inode->i_acl); |
| 373 | if (rc) | 331 | if (rc) |
| 374 | return rc; | 332 | return rc; |
| 375 | } | 333 | } |
| @@ -377,18 +335,6 @@ int jffs2_init_acl_post(struct inode *inode) | |||
| 377 | return 0; | 335 | return 0; |
| 378 | } | 336 | } |
| 379 | 337 | ||
| 380 | void jffs2_clear_acl(struct jffs2_inode_info *f) | ||
| 381 | { | ||
| 382 | if (f->i_acl_access && f->i_acl_access != JFFS2_ACL_NOT_CACHED) { | ||
| 383 | posix_acl_release(f->i_acl_access); | ||
| 384 | f->i_acl_access = JFFS2_ACL_NOT_CACHED; | ||
| 385 | } | ||
| 386 | if (f->i_acl_default && f->i_acl_default != JFFS2_ACL_NOT_CACHED) { | ||
| 387 | posix_acl_release(f->i_acl_default); | ||
| 388 | f->i_acl_default = JFFS2_ACL_NOT_CACHED; | ||
| 389 | } | ||
| 390 | } | ||
| 391 | |||
| 392 | int jffs2_acl_chmod(struct inode *inode) | 338 | int jffs2_acl_chmod(struct inode *inode) |
| 393 | { | 339 | { |
| 394 | struct posix_acl *acl, *clone; | 340 | struct posix_acl *acl, *clone; |
diff --git a/fs/jffs2/acl.h b/fs/jffs2/acl.h index 8ca058aed384..fc929f2a14f6 100644 --- a/fs/jffs2/acl.h +++ b/fs/jffs2/acl.h | |||
| @@ -26,13 +26,10 @@ struct jffs2_acl_header { | |||
| 26 | 26 | ||
| 27 | #ifdef CONFIG_JFFS2_FS_POSIX_ACL | 27 | #ifdef CONFIG_JFFS2_FS_POSIX_ACL |
| 28 | 28 | ||
| 29 | #define JFFS2_ACL_NOT_CACHED ((void *)-1) | ||
| 30 | |||
| 31 | extern int jffs2_permission(struct inode *, int); | 29 | extern int jffs2_permission(struct inode *, int); |
| 32 | extern int jffs2_acl_chmod(struct inode *); | 30 | extern int jffs2_acl_chmod(struct inode *); |
| 33 | extern int jffs2_init_acl_pre(struct inode *, struct inode *, int *); | 31 | extern int jffs2_init_acl_pre(struct inode *, struct inode *, int *); |
| 34 | extern int jffs2_init_acl_post(struct inode *); | 32 | extern int jffs2_init_acl_post(struct inode *); |
| 35 | extern void jffs2_clear_acl(struct jffs2_inode_info *); | ||
| 36 | 33 | ||
| 37 | extern struct xattr_handler jffs2_acl_access_xattr_handler; | 34 | extern struct xattr_handler jffs2_acl_access_xattr_handler; |
| 38 | extern struct xattr_handler jffs2_acl_default_xattr_handler; | 35 | extern struct xattr_handler jffs2_acl_default_xattr_handler; |
| @@ -43,6 +40,5 @@ extern struct xattr_handler jffs2_acl_default_xattr_handler; | |||
| 43 | #define jffs2_acl_chmod(inode) (0) | 40 | #define jffs2_acl_chmod(inode) (0) |
| 44 | #define jffs2_init_acl_pre(dir_i,inode,mode) (0) | 41 | #define jffs2_init_acl_pre(dir_i,inode,mode) (0) |
| 45 | #define jffs2_init_acl_post(inode) (0) | 42 | #define jffs2_init_acl_post(inode) (0) |
| 46 | #define jffs2_clear_acl(f) | ||
| 47 | 43 | ||
| 48 | #endif /* CONFIG_JFFS2_FS_POSIX_ACL */ | 44 | #endif /* CONFIG_JFFS2_FS_POSIX_ACL */ |
diff --git a/fs/jffs2/jffs2_fs_i.h b/fs/jffs2/jffs2_fs_i.h index 4c41db91eaa4..c6923da98263 100644 --- a/fs/jffs2/jffs2_fs_i.h +++ b/fs/jffs2/jffs2_fs_i.h | |||
| @@ -50,10 +50,6 @@ struct jffs2_inode_info { | |||
| 50 | uint16_t flags; | 50 | uint16_t flags; |
| 51 | uint8_t usercompr; | 51 | uint8_t usercompr; |
| 52 | struct inode vfs_inode; | 52 | struct inode vfs_inode; |
| 53 | #ifdef CONFIG_JFFS2_FS_POSIX_ACL | ||
| 54 | struct posix_acl *i_acl_access; | ||
| 55 | struct posix_acl *i_acl_default; | ||
| 56 | #endif | ||
| 57 | }; | 53 | }; |
| 58 | 54 | ||
| 59 | #endif /* _JFFS2_FS_I */ | 55 | #endif /* _JFFS2_FS_I */ |
diff --git a/fs/jffs2/os-linux.h b/fs/jffs2/os-linux.h index 2228380c47b9..a7f03b7ebcb3 100644 --- a/fs/jffs2/os-linux.h +++ b/fs/jffs2/os-linux.h | |||
| @@ -56,10 +56,6 @@ static inline void jffs2_init_inode_info(struct jffs2_inode_info *f) | |||
| 56 | f->target = NULL; | 56 | f->target = NULL; |
| 57 | f->flags = 0; | 57 | f->flags = 0; |
| 58 | f->usercompr = 0; | 58 | f->usercompr = 0; |
| 59 | #ifdef CONFIG_JFFS2_FS_POSIX_ACL | ||
| 60 | f->i_acl_access = JFFS2_ACL_NOT_CACHED; | ||
| 61 | f->i_acl_default = JFFS2_ACL_NOT_CACHED; | ||
| 62 | #endif | ||
| 63 | } | 59 | } |
| 64 | 60 | ||
| 65 | 61 | ||
diff --git a/fs/jffs2/readinode.c b/fs/jffs2/readinode.c index 1fc1e92356ee..1a80301004b8 100644 --- a/fs/jffs2/readinode.c +++ b/fs/jffs2/readinode.c | |||
| @@ -1424,7 +1424,6 @@ void jffs2_do_clear_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f) | |||
| 1424 | struct jffs2_full_dirent *fd, *fds; | 1424 | struct jffs2_full_dirent *fd, *fds; |
| 1425 | int deleted; | 1425 | int deleted; |
| 1426 | 1426 | ||
| 1427 | jffs2_clear_acl(f); | ||
| 1428 | jffs2_xattr_delete_inode(c, f->inocache); | 1427 | jffs2_xattr_delete_inode(c, f->inocache); |
| 1429 | mutex_lock(&f->sem); | 1428 | mutex_lock(&f->sem); |
| 1430 | deleted = f->inocache && !f->inocache->pino_nlink; | 1429 | deleted = f->inocache && !f->inocache->pino_nlink; |
diff --git a/fs/jfs/acl.c b/fs/jfs/acl.c index 06ca1b8d2054..f272bf032e1e 100644 --- a/fs/jfs/acl.c +++ b/fs/jfs/acl.c | |||
| @@ -31,27 +31,24 @@ static struct posix_acl *jfs_get_acl(struct inode *inode, int type) | |||
| 31 | { | 31 | { |
| 32 | struct posix_acl *acl; | 32 | struct posix_acl *acl; |
| 33 | char *ea_name; | 33 | char *ea_name; |
| 34 | struct jfs_inode_info *ji = JFS_IP(inode); | ||
| 35 | struct posix_acl **p_acl; | ||
| 36 | int size; | 34 | int size; |
| 37 | char *value = NULL; | 35 | char *value = NULL; |
| 38 | 36 | ||
| 37 | acl = get_cached_acl(inode, type); | ||
| 38 | if (acl != ACL_NOT_CACHED) | ||
| 39 | return acl; | ||
| 40 | |||
| 39 | switch(type) { | 41 | switch(type) { |
| 40 | case ACL_TYPE_ACCESS: | 42 | case ACL_TYPE_ACCESS: |
| 41 | ea_name = POSIX_ACL_XATTR_ACCESS; | 43 | ea_name = POSIX_ACL_XATTR_ACCESS; |
| 42 | p_acl = &ji->i_acl; | ||
| 43 | break; | 44 | break; |
| 44 | case ACL_TYPE_DEFAULT: | 45 | case ACL_TYPE_DEFAULT: |
| 45 | ea_name = POSIX_ACL_XATTR_DEFAULT; | 46 | ea_name = POSIX_ACL_XATTR_DEFAULT; |
| 46 | p_acl = &ji->i_default_acl; | ||
| 47 | break; | 47 | break; |
| 48 | default: | 48 | default: |
| 49 | return ERR_PTR(-EINVAL); | 49 | return ERR_PTR(-EINVAL); |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | if (*p_acl != JFS_ACL_NOT_CACHED) | ||
| 53 | return posix_acl_dup(*p_acl); | ||
| 54 | |||
| 55 | size = __jfs_getxattr(inode, ea_name, NULL, 0); | 52 | size = __jfs_getxattr(inode, ea_name, NULL, 0); |
| 56 | 53 | ||
| 57 | if (size > 0) { | 54 | if (size > 0) { |
| @@ -62,17 +59,18 @@ static struct posix_acl *jfs_get_acl(struct inode *inode, int type) | |||
| 62 | } | 59 | } |
| 63 | 60 | ||
| 64 | if (size < 0) { | 61 | if (size < 0) { |
| 65 | if (size == -ENODATA) { | 62 | if (size == -ENODATA) |
| 66 | *p_acl = NULL; | ||
| 67 | acl = NULL; | 63 | acl = NULL; |
| 68 | } else | 64 | else |
| 69 | acl = ERR_PTR(size); | 65 | acl = ERR_PTR(size); |
| 70 | } else { | 66 | } else { |
| 71 | acl = posix_acl_from_xattr(value, size); | 67 | acl = posix_acl_from_xattr(value, size); |
| 72 | if (!IS_ERR(acl)) | ||
| 73 | *p_acl = posix_acl_dup(acl); | ||
| 74 | } | 68 | } |
| 75 | kfree(value); | 69 | kfree(value); |
| 70 | if (!IS_ERR(acl)) { | ||
| 71 | set_cached_acl(inode, type, acl); | ||
| 72 | posix_acl_release(acl); | ||
| 73 | } | ||
| 76 | return acl; | 74 | return acl; |
| 77 | } | 75 | } |
| 78 | 76 | ||
| @@ -80,8 +78,6 @@ static int jfs_set_acl(tid_t tid, struct inode *inode, int type, | |||
| 80 | struct posix_acl *acl) | 78 | struct posix_acl *acl) |
| 81 | { | 79 | { |
| 82 | char *ea_name; | 80 | char *ea_name; |
| 83 | struct jfs_inode_info *ji = JFS_IP(inode); | ||
| 84 | struct posix_acl **p_acl; | ||
| 85 | int rc; | 81 | int rc; |
| 86 | int size = 0; | 82 | int size = 0; |
| 87 | char *value = NULL; | 83 | char *value = NULL; |
| @@ -92,11 +88,9 @@ static int jfs_set_acl(tid_t tid, struct inode *inode, int type, | |||
| 92 | switch(type) { | 88 | switch(type) { |
| 93 | case ACL_TYPE_ACCESS: | 89 | case ACL_TYPE_ACCESS: |
| 94 | ea_name = POSIX_ACL_XATTR_ACCESS; | 90 | ea_name = POSIX_ACL_XATTR_ACCESS; |
| 95 | p_acl = &ji->i_acl; | ||
| 96 | break; | 91 | break; |
| 97 | case ACL_TYPE_DEFAULT: | 92 | case ACL_TYPE_DEFAULT: |
| 98 | ea_name = POSIX_ACL_XATTR_DEFAULT; | 93 | ea_name = POSIX_ACL_XATTR_DEFAULT; |
| 99 | p_acl = &ji->i_default_acl; | ||
| 100 | if (!S_ISDIR(inode->i_mode)) | 94 | if (!S_ISDIR(inode->i_mode)) |
| 101 | return acl ? -EACCES : 0; | 95 | return acl ? -EACCES : 0; |
| 102 | break; | 96 | break; |
| @@ -116,27 +110,23 @@ static int jfs_set_acl(tid_t tid, struct inode *inode, int type, | |||
| 116 | out: | 110 | out: |
| 117 | kfree(value); | 111 | kfree(value); |
| 118 | 112 | ||
| 119 | if (!rc) { | 113 | if (!rc) |
| 120 | if (*p_acl && (*p_acl != JFS_ACL_NOT_CACHED)) | 114 | set_cached_acl(inode, type, acl); |
| 121 | posix_acl_release(*p_acl); | 115 | |
| 122 | *p_acl = posix_acl_dup(acl); | ||
| 123 | } | ||
| 124 | return rc; | 116 | return rc; |
| 125 | } | 117 | } |
| 126 | 118 | ||
| 127 | static int jfs_check_acl(struct inode *inode, int mask) | 119 | static int jfs_check_acl(struct inode *inode, int mask) |
| 128 | { | 120 | { |
| 129 | struct jfs_inode_info *ji = JFS_IP(inode); | 121 | if (inode->i_acl == ACL_NOT_CACHED) { |
| 130 | |||
| 131 | if (ji->i_acl == JFS_ACL_NOT_CACHED) { | ||
| 132 | struct posix_acl *acl = jfs_get_acl(inode, ACL_TYPE_ACCESS); | 122 | struct posix_acl *acl = jfs_get_acl(inode, ACL_TYPE_ACCESS); |
| 133 | if (IS_ERR(acl)) | 123 | if (IS_ERR(acl)) |
| 134 | return PTR_ERR(acl); | 124 | return PTR_ERR(acl); |
| 135 | posix_acl_release(acl); | 125 | posix_acl_release(acl); |
| 136 | } | 126 | } |
| 137 | 127 | ||
| 138 | if (ji->i_acl) | 128 | if (inode->i_acl) |
| 139 | return posix_acl_permission(inode, ji->i_acl, mask); | 129 | return posix_acl_permission(inode, inode->i_acl, mask); |
| 140 | return -EAGAIN; | 130 | return -EAGAIN; |
| 141 | } | 131 | } |
| 142 | 132 | ||
diff --git a/fs/jfs/jfs_incore.h b/fs/jfs/jfs_incore.h index 439901d205fe..1439f119ec83 100644 --- a/fs/jfs/jfs_incore.h +++ b/fs/jfs/jfs_incore.h | |||
| @@ -74,10 +74,6 @@ struct jfs_inode_info { | |||
| 74 | /* xattr_sem allows us to access the xattrs without taking i_mutex */ | 74 | /* xattr_sem allows us to access the xattrs without taking i_mutex */ |
| 75 | struct rw_semaphore xattr_sem; | 75 | struct rw_semaphore xattr_sem; |
| 76 | lid_t xtlid; /* lid of xtree lock on directory */ | 76 | lid_t xtlid; /* lid of xtree lock on directory */ |
| 77 | #ifdef CONFIG_JFS_POSIX_ACL | ||
| 78 | struct posix_acl *i_acl; | ||
| 79 | struct posix_acl *i_default_acl; | ||
| 80 | #endif | ||
| 81 | union { | 77 | union { |
| 82 | struct { | 78 | struct { |
| 83 | xtpage_t _xtroot; /* 288: xtree root */ | 79 | xtpage_t _xtroot; /* 288: xtree root */ |
| @@ -107,8 +103,6 @@ struct jfs_inode_info { | |||
| 107 | #define i_inline u.link._inline | 103 | #define i_inline u.link._inline |
| 108 | #define i_inline_ea u.link._inline_ea | 104 | #define i_inline_ea u.link._inline_ea |
| 109 | 105 | ||
| 110 | #define JFS_ACL_NOT_CACHED ((void *)-1) | ||
| 111 | |||
| 112 | #define IREAD_LOCK(ip, subclass) \ | 106 | #define IREAD_LOCK(ip, subclass) \ |
| 113 | down_read_nested(&JFS_IP(ip)->rdwrlock, subclass) | 107 | down_read_nested(&JFS_IP(ip)->rdwrlock, subclass) |
| 114 | #define IREAD_UNLOCK(ip) up_read(&JFS_IP(ip)->rdwrlock) | 108 | #define IREAD_UNLOCK(ip) up_read(&JFS_IP(ip)->rdwrlock) |
diff --git a/fs/jfs/super.c b/fs/jfs/super.c index 09b1b6ee2186..37e6dcda8fc8 100644 --- a/fs/jfs/super.c +++ b/fs/jfs/super.c | |||
| @@ -128,18 +128,6 @@ static void jfs_destroy_inode(struct inode *inode) | |||
| 128 | ji->active_ag = -1; | 128 | ji->active_ag = -1; |
| 129 | } | 129 | } |
| 130 | spin_unlock_irq(&ji->ag_lock); | 130 | spin_unlock_irq(&ji->ag_lock); |
| 131 | |||
| 132 | #ifdef CONFIG_JFS_POSIX_ACL | ||
| 133 | if (ji->i_acl != JFS_ACL_NOT_CACHED) { | ||
| 134 | posix_acl_release(ji->i_acl); | ||
| 135 | ji->i_acl = JFS_ACL_NOT_CACHED; | ||
| 136 | } | ||
| 137 | if (ji->i_default_acl != JFS_ACL_NOT_CACHED) { | ||
| 138 | posix_acl_release(ji->i_default_acl); | ||
| 139 | ji->i_default_acl = JFS_ACL_NOT_CACHED; | ||
| 140 | } | ||
| 141 | #endif | ||
| 142 | |||
| 143 | kmem_cache_free(jfs_inode_cachep, ji); | 131 | kmem_cache_free(jfs_inode_cachep, ji); |
| 144 | } | 132 | } |
| 145 | 133 | ||
| @@ -798,10 +786,6 @@ static void init_once(void *foo) | |||
| 798 | init_rwsem(&jfs_ip->xattr_sem); | 786 | init_rwsem(&jfs_ip->xattr_sem); |
| 799 | spin_lock_init(&jfs_ip->ag_lock); | 787 | spin_lock_init(&jfs_ip->ag_lock); |
| 800 | jfs_ip->active_ag = -1; | 788 | jfs_ip->active_ag = -1; |
| 801 | #ifdef CONFIG_JFS_POSIX_ACL | ||
| 802 | jfs_ip->i_acl = JFS_ACL_NOT_CACHED; | ||
| 803 | jfs_ip->i_default_acl = JFS_ACL_NOT_CACHED; | ||
| 804 | #endif | ||
| 805 | inode_init_once(&jfs_ip->vfs_inode); | 789 | inode_init_once(&jfs_ip->vfs_inode); |
| 806 | } | 790 | } |
| 807 | 791 | ||
diff --git a/fs/jfs/xattr.c b/fs/jfs/xattr.c index 61dfa8173ebc..fad364548bc9 100644 --- a/fs/jfs/xattr.c +++ b/fs/jfs/xattr.c | |||
| @@ -727,10 +727,7 @@ static int can_set_system_xattr(struct inode *inode, const char *name, | |||
| 727 | /* | 727 | /* |
| 728 | * We're changing the ACL. Get rid of the cached one | 728 | * We're changing the ACL. Get rid of the cached one |
| 729 | */ | 729 | */ |
| 730 | acl =JFS_IP(inode)->i_acl; | 730 | forget_cached_acl(inode, ACL_TYPE_ACCESS); |
| 731 | if (acl != JFS_ACL_NOT_CACHED) | ||
| 732 | posix_acl_release(acl); | ||
| 733 | JFS_IP(inode)->i_acl = JFS_ACL_NOT_CACHED; | ||
| 734 | 731 | ||
| 735 | return 0; | 732 | return 0; |
| 736 | } else if (strcmp(name, POSIX_ACL_XATTR_DEFAULT) == 0) { | 733 | } else if (strcmp(name, POSIX_ACL_XATTR_DEFAULT) == 0) { |
| @@ -746,10 +743,7 @@ static int can_set_system_xattr(struct inode *inode, const char *name, | |||
| 746 | /* | 743 | /* |
| 747 | * We're changing the default ACL. Get rid of the cached one | 744 | * We're changing the default ACL. Get rid of the cached one |
| 748 | */ | 745 | */ |
| 749 | acl =JFS_IP(inode)->i_default_acl; | 746 | forget_cached_acl(inode, ACL_TYPE_DEFAULT); |
| 750 | if (acl && (acl != JFS_ACL_NOT_CACHED)) | ||
| 751 | posix_acl_release(acl); | ||
| 752 | JFS_IP(inode)->i_default_acl = JFS_ACL_NOT_CACHED; | ||
| 753 | 747 | ||
| 754 | return 0; | 748 | return 0; |
| 755 | } | 749 | } |
diff --git a/fs/namei.c b/fs/namei.c index 527119afb6a5..5b961eb71cbf 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
| @@ -1698,8 +1698,11 @@ struct file *do_filp_open(int dfd, const char *pathname, | |||
| 1698 | if (error) | 1698 | if (error) |
| 1699 | return ERR_PTR(error); | 1699 | return ERR_PTR(error); |
| 1700 | error = path_walk(pathname, &nd); | 1700 | error = path_walk(pathname, &nd); |
| 1701 | if (error) | 1701 | if (error) { |
| 1702 | if (nd.root.mnt) | ||
| 1703 | path_put(&nd.root); | ||
| 1702 | return ERR_PTR(error); | 1704 | return ERR_PTR(error); |
| 1705 | } | ||
| 1703 | if (unlikely(!audit_dummy_context())) | 1706 | if (unlikely(!audit_dummy_context())) |
| 1704 | audit_inode(pathname, nd.path.dentry); | 1707 | audit_inode(pathname, nd.path.dentry); |
| 1705 | 1708 | ||
| @@ -1759,6 +1762,8 @@ do_last: | |||
| 1759 | } | 1762 | } |
| 1760 | filp = nameidata_to_filp(&nd, open_flag); | 1763 | filp = nameidata_to_filp(&nd, open_flag); |
| 1761 | mnt_drop_write(nd.path.mnt); | 1764 | mnt_drop_write(nd.path.mnt); |
| 1765 | if (nd.root.mnt) | ||
| 1766 | path_put(&nd.root); | ||
| 1762 | return filp; | 1767 | return filp; |
| 1763 | } | 1768 | } |
| 1764 | 1769 | ||
| @@ -1819,6 +1824,8 @@ ok: | |||
| 1819 | */ | 1824 | */ |
| 1820 | if (will_write) | 1825 | if (will_write) |
| 1821 | mnt_drop_write(nd.path.mnt); | 1826 | mnt_drop_write(nd.path.mnt); |
| 1827 | if (nd.root.mnt) | ||
| 1828 | path_put(&nd.root); | ||
| 1822 | return filp; | 1829 | return filp; |
| 1823 | 1830 | ||
| 1824 | exit_mutex_unlock: | 1831 | exit_mutex_unlock: |
| @@ -1859,6 +1866,8 @@ do_link: | |||
| 1859 | * with "intent.open". | 1866 | * with "intent.open". |
| 1860 | */ | 1867 | */ |
| 1861 | release_open_intent(&nd); | 1868 | release_open_intent(&nd); |
| 1869 | if (nd.root.mnt) | ||
| 1870 | path_put(&nd.root); | ||
| 1862 | return ERR_PTR(error); | 1871 | return ERR_PTR(error); |
| 1863 | } | 1872 | } |
| 1864 | nd.flags &= ~LOOKUP_PARENT; | 1873 | nd.flags &= ~LOOKUP_PARENT; |
diff --git a/fs/namespace.c b/fs/namespace.c index a7bea8c8bd46..3dc283fd4716 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
| @@ -42,6 +42,8 @@ __cacheline_aligned_in_smp DEFINE_SPINLOCK(vfsmount_lock); | |||
| 42 | static int event; | 42 | static int event; |
| 43 | static DEFINE_IDA(mnt_id_ida); | 43 | static DEFINE_IDA(mnt_id_ida); |
| 44 | static DEFINE_IDA(mnt_group_ida); | 44 | static DEFINE_IDA(mnt_group_ida); |
| 45 | static int mnt_id_start = 0; | ||
| 46 | static int mnt_group_start = 1; | ||
| 45 | 47 | ||
| 46 | static struct list_head *mount_hashtable __read_mostly; | 48 | static struct list_head *mount_hashtable __read_mostly; |
| 47 | static struct kmem_cache *mnt_cache __read_mostly; | 49 | static struct kmem_cache *mnt_cache __read_mostly; |
| @@ -69,7 +71,9 @@ static int mnt_alloc_id(struct vfsmount *mnt) | |||
| 69 | retry: | 71 | retry: |
| 70 | ida_pre_get(&mnt_id_ida, GFP_KERNEL); | 72 | ida_pre_get(&mnt_id_ida, GFP_KERNEL); |
| 71 | spin_lock(&vfsmount_lock); | 73 | spin_lock(&vfsmount_lock); |
| 72 | res = ida_get_new(&mnt_id_ida, &mnt->mnt_id); | 74 | res = ida_get_new_above(&mnt_id_ida, mnt_id_start, &mnt->mnt_id); |
| 75 | if (!res) | ||
| 76 | mnt_id_start = mnt->mnt_id + 1; | ||
| 73 | spin_unlock(&vfsmount_lock); | 77 | spin_unlock(&vfsmount_lock); |
| 74 | if (res == -EAGAIN) | 78 | if (res == -EAGAIN) |
| 75 | goto retry; | 79 | goto retry; |
| @@ -79,8 +83,11 @@ retry: | |||
| 79 | 83 | ||
| 80 | static void mnt_free_id(struct vfsmount *mnt) | 84 | static void mnt_free_id(struct vfsmount *mnt) |
| 81 | { | 85 | { |
| 86 | int id = mnt->mnt_id; | ||
| 82 | spin_lock(&vfsmount_lock); | 87 | spin_lock(&vfsmount_lock); |
| 83 | ida_remove(&mnt_id_ida, mnt->mnt_id); | 88 | ida_remove(&mnt_id_ida, id); |
| 89 | if (mnt_id_start > id) | ||
| 90 | mnt_id_start = id; | ||
| 84 | spin_unlock(&vfsmount_lock); | 91 | spin_unlock(&vfsmount_lock); |
| 85 | } | 92 | } |
| 86 | 93 | ||
| @@ -91,10 +98,18 @@ static void mnt_free_id(struct vfsmount *mnt) | |||
| 91 | */ | 98 | */ |
| 92 | static int mnt_alloc_group_id(struct vfsmount *mnt) | 99 | static int mnt_alloc_group_id(struct vfsmount *mnt) |
| 93 | { | 100 | { |
| 101 | int res; | ||
| 102 | |||
| 94 | if (!ida_pre_get(&mnt_group_ida, GFP_KERNEL)) | 103 | if (!ida_pre_get(&mnt_group_ida, GFP_KERNEL)) |
| 95 | return -ENOMEM; | 104 | return -ENOMEM; |
| 96 | 105 | ||
| 97 | return ida_get_new_above(&mnt_group_ida, 1, &mnt->mnt_group_id); | 106 | res = ida_get_new_above(&mnt_group_ida, |
| 107 | mnt_group_start, | ||
| 108 | &mnt->mnt_group_id); | ||
| 109 | if (!res) | ||
| 110 | mnt_group_start = mnt->mnt_group_id + 1; | ||
| 111 | |||
| 112 | return res; | ||
| 98 | } | 113 | } |
| 99 | 114 | ||
| 100 | /* | 115 | /* |
| @@ -102,7 +117,10 @@ static int mnt_alloc_group_id(struct vfsmount *mnt) | |||
| 102 | */ | 117 | */ |
| 103 | void mnt_release_group_id(struct vfsmount *mnt) | 118 | void mnt_release_group_id(struct vfsmount *mnt) |
| 104 | { | 119 | { |
| 105 | ida_remove(&mnt_group_ida, mnt->mnt_group_id); | 120 | int id = mnt->mnt_group_id; |
| 121 | ida_remove(&mnt_group_ida, id); | ||
| 122 | if (mnt_group_start > id) | ||
| 123 | mnt_group_start = id; | ||
| 106 | mnt->mnt_group_id = 0; | 124 | mnt->mnt_group_id = 0; |
| 107 | } | 125 | } |
| 108 | 126 | ||
| @@ -2222,16 +2240,9 @@ static void __init init_mount_tree(void) | |||
| 2222 | mnt = do_kern_mount("rootfs", 0, "rootfs", NULL); | 2240 | mnt = do_kern_mount("rootfs", 0, "rootfs", NULL); |
| 2223 | if (IS_ERR(mnt)) | 2241 | if (IS_ERR(mnt)) |
| 2224 | panic("Can't create rootfs"); | 2242 | panic("Can't create rootfs"); |
| 2225 | ns = kmalloc(sizeof(*ns), GFP_KERNEL); | 2243 | ns = create_mnt_ns(mnt); |
| 2226 | if (!ns) | 2244 | if (IS_ERR(ns)) |
| 2227 | panic("Can't allocate initial namespace"); | 2245 | panic("Can't allocate initial namespace"); |
| 2228 | atomic_set(&ns->count, 1); | ||
| 2229 | INIT_LIST_HEAD(&ns->list); | ||
| 2230 | init_waitqueue_head(&ns->poll); | ||
| 2231 | ns->event = 0; | ||
| 2232 | list_add(&mnt->mnt_list, &ns->list); | ||
| 2233 | ns->root = mnt; | ||
| 2234 | mnt->mnt_ns = ns; | ||
| 2235 | 2246 | ||
| 2236 | init_task.nsproxy->mnt_ns = ns; | 2247 | init_task.nsproxy->mnt_ns = ns; |
| 2237 | get_mnt_ns(ns); | 2248 | get_mnt_ns(ns); |
diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c index 2696d6b513b7..fe9d8f2a13f8 100644 --- a/fs/nilfs2/inode.c +++ b/fs/nilfs2/inode.c | |||
| @@ -309,10 +309,6 @@ struct inode *nilfs_new_inode(struct inode *dir, int mode) | |||
| 309 | /* ii->i_file_acl = 0; */ | 309 | /* ii->i_file_acl = 0; */ |
| 310 | /* ii->i_dir_acl = 0; */ | 310 | /* ii->i_dir_acl = 0; */ |
| 311 | ii->i_dir_start_lookup = 0; | 311 | ii->i_dir_start_lookup = 0; |
| 312 | #ifdef CONFIG_NILFS_FS_POSIX_ACL | ||
| 313 | ii->i_acl = NULL; | ||
| 314 | ii->i_default_acl = NULL; | ||
| 315 | #endif | ||
| 316 | ii->i_cno = 0; | 312 | ii->i_cno = 0; |
| 317 | nilfs_set_inode_flags(inode); | 313 | nilfs_set_inode_flags(inode); |
| 318 | spin_lock(&sbi->s_next_gen_lock); | 314 | spin_lock(&sbi->s_next_gen_lock); |
| @@ -434,10 +430,6 @@ static int __nilfs_read_inode(struct super_block *sb, unsigned long ino, | |||
| 434 | 430 | ||
| 435 | raw_inode = nilfs_ifile_map_inode(sbi->s_ifile, ino, bh); | 431 | raw_inode = nilfs_ifile_map_inode(sbi->s_ifile, ino, bh); |
| 436 | 432 | ||
| 437 | #ifdef CONFIG_NILFS_FS_POSIX_ACL | ||
| 438 | ii->i_acl = NILFS_ACL_NOT_CACHED; | ||
| 439 | ii->i_default_acl = NILFS_ACL_NOT_CACHED; | ||
| 440 | #endif | ||
| 441 | if (nilfs_read_inode_common(inode, raw_inode)) | 433 | if (nilfs_read_inode_common(inode, raw_inode)) |
| 442 | goto failed_unmap; | 434 | goto failed_unmap; |
| 443 | 435 | ||
diff --git a/fs/nilfs2/nilfs.h b/fs/nilfs2/nilfs.h index edf6a59d9f2a..724c63766e82 100644 --- a/fs/nilfs2/nilfs.h +++ b/fs/nilfs2/nilfs.h | |||
| @@ -58,10 +58,6 @@ struct nilfs_inode_info { | |||
| 58 | */ | 58 | */ |
| 59 | struct rw_semaphore xattr_sem; | 59 | struct rw_semaphore xattr_sem; |
| 60 | #endif | 60 | #endif |
| 61 | #ifdef CONFIG_NILFS_POSIX_ACL | ||
| 62 | struct posix_acl *i_acl; | ||
| 63 | struct posix_acl *i_default_acl; | ||
| 64 | #endif | ||
| 65 | struct buffer_head *i_bh; /* i_bh contains a new or dirty | 61 | struct buffer_head *i_bh; /* i_bh contains a new or dirty |
| 66 | disk inode */ | 62 | disk inode */ |
| 67 | struct inode vfs_inode; | 63 | struct inode vfs_inode; |
diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c index ab785f85aa50..8e2ec43b18f4 100644 --- a/fs/nilfs2/super.c +++ b/fs/nilfs2/super.c | |||
| @@ -189,16 +189,6 @@ static void nilfs_clear_inode(struct inode *inode) | |||
| 189 | { | 189 | { |
| 190 | struct nilfs_inode_info *ii = NILFS_I(inode); | 190 | struct nilfs_inode_info *ii = NILFS_I(inode); |
| 191 | 191 | ||
| 192 | #ifdef CONFIG_NILFS_POSIX_ACL | ||
| 193 | if (ii->i_acl && ii->i_acl != NILFS_ACL_NOT_CACHED) { | ||
| 194 | posix_acl_release(ii->i_acl); | ||
| 195 | ii->i_acl = NILFS_ACL_NOT_CACHED; | ||
| 196 | } | ||
| 197 | if (ii->i_default_acl && ii->i_default_acl != NILFS_ACL_NOT_CACHED) { | ||
| 198 | posix_acl_release(ii->i_default_acl); | ||
| 199 | ii->i_default_acl = NILFS_ACL_NOT_CACHED; | ||
| 200 | } | ||
| 201 | #endif | ||
| 202 | /* | 192 | /* |
| 203 | * Free resources allocated in nilfs_read_inode(), here. | 193 | * Free resources allocated in nilfs_read_inode(), here. |
| 204 | */ | 194 | */ |
| @@ -378,63 +378,63 @@ SYSCALL_ALIAS(sys_ftruncate64, SyS_ftruncate64); | |||
| 378 | #endif | 378 | #endif |
| 379 | #endif /* BITS_PER_LONG == 32 */ | 379 | #endif /* BITS_PER_LONG == 32 */ |
| 380 | 380 | ||
| 381 | SYSCALL_DEFINE(fallocate)(int fd, int mode, loff_t offset, loff_t len) | 381 | |
| 382 | int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) | ||
| 382 | { | 383 | { |
| 383 | struct file *file; | 384 | struct inode *inode = file->f_path.dentry->d_inode; |
| 384 | struct inode *inode; | 385 | long ret; |
| 385 | long ret = -EINVAL; | ||
| 386 | 386 | ||
| 387 | if (offset < 0 || len <= 0) | 387 | if (offset < 0 || len <= 0) |
| 388 | goto out; | 388 | return -EINVAL; |
| 389 | 389 | ||
| 390 | /* Return error if mode is not supported */ | 390 | /* Return error if mode is not supported */ |
| 391 | ret = -EOPNOTSUPP; | ||
| 392 | if (mode && !(mode & FALLOC_FL_KEEP_SIZE)) | 391 | if (mode && !(mode & FALLOC_FL_KEEP_SIZE)) |
| 393 | goto out; | 392 | return -EOPNOTSUPP; |
| 394 | 393 | ||
| 395 | ret = -EBADF; | ||
| 396 | file = fget(fd); | ||
| 397 | if (!file) | ||
| 398 | goto out; | ||
| 399 | if (!(file->f_mode & FMODE_WRITE)) | 394 | if (!(file->f_mode & FMODE_WRITE)) |
| 400 | goto out_fput; | 395 | return -EBADF; |
| 401 | /* | 396 | /* |
| 402 | * Revalidate the write permissions, in case security policy has | 397 | * Revalidate the write permissions, in case security policy has |
| 403 | * changed since the files were opened. | 398 | * changed since the files were opened. |
| 404 | */ | 399 | */ |
| 405 | ret = security_file_permission(file, MAY_WRITE); | 400 | ret = security_file_permission(file, MAY_WRITE); |
| 406 | if (ret) | 401 | if (ret) |
| 407 | goto out_fput; | 402 | return ret; |
| 408 | 403 | ||
| 409 | inode = file->f_path.dentry->d_inode; | ||
| 410 | |||
| 411 | ret = -ESPIPE; | ||
| 412 | if (S_ISFIFO(inode->i_mode)) | 404 | if (S_ISFIFO(inode->i_mode)) |
| 413 | goto out_fput; | 405 | return -ESPIPE; |
| 414 | 406 | ||
| 415 | ret = -ENODEV; | ||
| 416 | /* | 407 | /* |
| 417 | * Let individual file system decide if it supports preallocation | 408 | * Let individual file system decide if it supports preallocation |
| 418 | * for directories or not. | 409 | * for directories or not. |
| 419 | */ | 410 | */ |
| 420 | if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode)) | 411 | if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode)) |
| 421 | goto out_fput; | 412 | return -ENODEV; |
| 422 | 413 | ||
| 423 | ret = -EFBIG; | ||
| 424 | /* Check for wrap through zero too */ | 414 | /* Check for wrap through zero too */ |
| 425 | if (((offset + len) > inode->i_sb->s_maxbytes) || ((offset + len) < 0)) | 415 | if (((offset + len) > inode->i_sb->s_maxbytes) || ((offset + len) < 0)) |
| 426 | goto out_fput; | 416 | return -EFBIG; |
| 427 | 417 | ||
| 428 | if (inode->i_op->fallocate) | 418 | if (!inode->i_op->fallocate) |
| 429 | ret = inode->i_op->fallocate(inode, mode, offset, len); | 419 | return -EOPNOTSUPP; |
| 430 | else | ||
| 431 | ret = -EOPNOTSUPP; | ||
| 432 | 420 | ||
| 433 | out_fput: | 421 | return inode->i_op->fallocate(inode, mode, offset, len); |
| 434 | fput(file); | ||
| 435 | out: | ||
| 436 | return ret; | ||
| 437 | } | 422 | } |
| 423 | |||
| 424 | SYSCALL_DEFINE(fallocate)(int fd, int mode, loff_t offset, loff_t len) | ||
| 425 | { | ||
| 426 | struct file *file; | ||
| 427 | int error = -EBADF; | ||
| 428 | |||
| 429 | file = fget(fd); | ||
| 430 | if (file) { | ||
| 431 | error = do_fallocate(file, mode, offset, len); | ||
| 432 | fput(file); | ||
| 433 | } | ||
| 434 | |||
| 435 | return error; | ||
| 436 | } | ||
| 437 | |||
| 438 | #ifdef CONFIG_HAVE_SYSCALL_WRAPPERS | 438 | #ifdef CONFIG_HAVE_SYSCALL_WRAPPERS |
| 439 | asmlinkage long SyS_fallocate(long fd, long mode, loff_t offset, loff_t len) | 439 | asmlinkage long SyS_fallocate(long fd, long mode, loff_t offset, loff_t len) |
| 440 | { | 440 | { |
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index 6fd0f47e45db..a14d6cd9eeda 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c | |||
| @@ -1131,8 +1131,6 @@ static void init_inode(struct inode *inode, struct treepath *path) | |||
| 1131 | REISERFS_I(inode)->i_trans_id = 0; | 1131 | REISERFS_I(inode)->i_trans_id = 0; |
| 1132 | REISERFS_I(inode)->i_jl = NULL; | 1132 | REISERFS_I(inode)->i_jl = NULL; |
| 1133 | mutex_init(&(REISERFS_I(inode)->i_mmap)); | 1133 | mutex_init(&(REISERFS_I(inode)->i_mmap)); |
| 1134 | reiserfs_init_acl_access(inode); | ||
| 1135 | reiserfs_init_acl_default(inode); | ||
| 1136 | reiserfs_init_xattr_rwsem(inode); | 1134 | reiserfs_init_xattr_rwsem(inode); |
| 1137 | 1135 | ||
| 1138 | if (stat_data_v1(ih)) { | 1136 | if (stat_data_v1(ih)) { |
| @@ -1834,8 +1832,6 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th, | |||
| 1834 | REISERFS_I(dir)->i_attrs & REISERFS_INHERIT_MASK; | 1832 | REISERFS_I(dir)->i_attrs & REISERFS_INHERIT_MASK; |
| 1835 | sd_attrs_to_i_attrs(REISERFS_I(inode)->i_attrs, inode); | 1833 | sd_attrs_to_i_attrs(REISERFS_I(inode)->i_attrs, inode); |
| 1836 | mutex_init(&(REISERFS_I(inode)->i_mmap)); | 1834 | mutex_init(&(REISERFS_I(inode)->i_mmap)); |
| 1837 | reiserfs_init_acl_access(inode); | ||
| 1838 | reiserfs_init_acl_default(inode); | ||
| 1839 | reiserfs_init_xattr_rwsem(inode); | 1835 | reiserfs_init_xattr_rwsem(inode); |
| 1840 | 1836 | ||
| 1841 | /* key to search for correct place for new stat data */ | 1837 | /* key to search for correct place for new stat data */ |
diff --git a/fs/reiserfs/resize.c b/fs/reiserfs/resize.c index 238e9d9b31e0..18b315d3d104 100644 --- a/fs/reiserfs/resize.c +++ b/fs/reiserfs/resize.c | |||
| @@ -82,7 +82,6 @@ int reiserfs_resize(struct super_block *s, unsigned long block_count_new) | |||
| 82 | if (reiserfs_allocate_list_bitmaps(s, jbitmap, bmap_nr_new) < 0) { | 82 | if (reiserfs_allocate_list_bitmaps(s, jbitmap, bmap_nr_new) < 0) { |
| 83 | printk | 83 | printk |
| 84 | ("reiserfs_resize: unable to allocate memory for journal bitmaps\n"); | 84 | ("reiserfs_resize: unable to allocate memory for journal bitmaps\n"); |
| 85 | unlock_super(s); | ||
| 86 | return -ENOMEM; | 85 | return -ENOMEM; |
| 87 | } | 86 | } |
| 88 | /* the new journal bitmaps are zero filled, now we copy in the bitmap | 87 | /* the new journal bitmaps are zero filled, now we copy in the bitmap |
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index 2969773cfc22..d3aeb061612b 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c | |||
| @@ -529,10 +529,6 @@ static void init_once(void *foo) | |||
| 529 | 529 | ||
| 530 | INIT_LIST_HEAD(&ei->i_prealloc_list); | 530 | INIT_LIST_HEAD(&ei->i_prealloc_list); |
| 531 | inode_init_once(&ei->vfs_inode); | 531 | inode_init_once(&ei->vfs_inode); |
| 532 | #ifdef CONFIG_REISERFS_FS_POSIX_ACL | ||
| 533 | ei->i_acl_access = NULL; | ||
| 534 | ei->i_acl_default = NULL; | ||
| 535 | #endif | ||
| 536 | } | 532 | } |
| 537 | 533 | ||
| 538 | static int init_inodecache(void) | 534 | static int init_inodecache(void) |
| @@ -580,25 +576,6 @@ static void reiserfs_dirty_inode(struct inode *inode) | |||
| 580 | reiserfs_write_unlock(inode->i_sb); | 576 | reiserfs_write_unlock(inode->i_sb); |
| 581 | } | 577 | } |
| 582 | 578 | ||
| 583 | #ifdef CONFIG_REISERFS_FS_POSIX_ACL | ||
| 584 | static void reiserfs_clear_inode(struct inode *inode) | ||
| 585 | { | ||
| 586 | struct posix_acl *acl; | ||
| 587 | |||
| 588 | acl = REISERFS_I(inode)->i_acl_access; | ||
| 589 | if (acl && !IS_ERR(acl)) | ||
| 590 | posix_acl_release(acl); | ||
| 591 | REISERFS_I(inode)->i_acl_access = NULL; | ||
| 592 | |||
| 593 | acl = REISERFS_I(inode)->i_acl_default; | ||
| 594 | if (acl && !IS_ERR(acl)) | ||
| 595 | posix_acl_release(acl); | ||
| 596 | REISERFS_I(inode)->i_acl_default = NULL; | ||
| 597 | } | ||
| 598 | #else | ||
| 599 | #define reiserfs_clear_inode NULL | ||
| 600 | #endif | ||
| 601 | |||
| 602 | #ifdef CONFIG_QUOTA | 579 | #ifdef CONFIG_QUOTA |
| 603 | static ssize_t reiserfs_quota_write(struct super_block *, int, const char *, | 580 | static ssize_t reiserfs_quota_write(struct super_block *, int, const char *, |
| 604 | size_t, loff_t); | 581 | size_t, loff_t); |
| @@ -612,7 +589,6 @@ static const struct super_operations reiserfs_sops = { | |||
| 612 | .write_inode = reiserfs_write_inode, | 589 | .write_inode = reiserfs_write_inode, |
| 613 | .dirty_inode = reiserfs_dirty_inode, | 590 | .dirty_inode = reiserfs_dirty_inode, |
| 614 | .delete_inode = reiserfs_delete_inode, | 591 | .delete_inode = reiserfs_delete_inode, |
| 615 | .clear_inode = reiserfs_clear_inode, | ||
| 616 | .put_super = reiserfs_put_super, | 592 | .put_super = reiserfs_put_super, |
| 617 | .write_super = reiserfs_write_super, | 593 | .write_super = reiserfs_write_super, |
| 618 | .sync_fs = reiserfs_sync_fs, | 594 | .sync_fs = reiserfs_sync_fs, |
diff --git a/fs/reiserfs/xattr_acl.c b/fs/reiserfs/xattr_acl.c index c303c426fe2b..35d6e672a279 100644 --- a/fs/reiserfs/xattr_acl.c +++ b/fs/reiserfs/xattr_acl.c | |||
| @@ -188,29 +188,6 @@ static void *posix_acl_to_disk(const struct posix_acl *acl, size_t * size) | |||
| 188 | return ERR_PTR(-EINVAL); | 188 | return ERR_PTR(-EINVAL); |
| 189 | } | 189 | } |
| 190 | 190 | ||
| 191 | static inline void iset_acl(struct inode *inode, struct posix_acl **i_acl, | ||
| 192 | struct posix_acl *acl) | ||
| 193 | { | ||
| 194 | spin_lock(&inode->i_lock); | ||
| 195 | if (*i_acl != ERR_PTR(-ENODATA)) | ||
| 196 | posix_acl_release(*i_acl); | ||
| 197 | *i_acl = posix_acl_dup(acl); | ||
| 198 | spin_unlock(&inode->i_lock); | ||
| 199 | } | ||
| 200 | |||
| 201 | static inline struct posix_acl *iget_acl(struct inode *inode, | ||
| 202 | struct posix_acl **i_acl) | ||
| 203 | { | ||
| 204 | struct posix_acl *acl = ERR_PTR(-ENODATA); | ||
| 205 | |||
| 206 | spin_lock(&inode->i_lock); | ||
| 207 | if (*i_acl != ERR_PTR(-ENODATA)) | ||
| 208 | acl = posix_acl_dup(*i_acl); | ||
| 209 | spin_unlock(&inode->i_lock); | ||
| 210 | |||
| 211 | return acl; | ||
| 212 | } | ||
| 213 | |||
| 214 | /* | 191 | /* |
| 215 | * Inode operation get_posix_acl(). | 192 | * Inode operation get_posix_acl(). |
| 216 | * | 193 | * |
| @@ -220,34 +197,29 @@ static inline struct posix_acl *iget_acl(struct inode *inode, | |||
| 220 | struct posix_acl *reiserfs_get_acl(struct inode *inode, int type) | 197 | struct posix_acl *reiserfs_get_acl(struct inode *inode, int type) |
| 221 | { | 198 | { |
| 222 | char *name, *value; | 199 | char *name, *value; |
| 223 | struct posix_acl *acl, **p_acl; | 200 | struct posix_acl *acl; |
| 224 | int size; | 201 | int size; |
| 225 | int retval; | 202 | int retval; |
| 226 | struct reiserfs_inode_info *reiserfs_i = REISERFS_I(inode); | 203 | |
| 204 | acl = get_cached_acl(inode, type); | ||
| 205 | if (acl != ACL_NOT_CACHED) | ||
| 206 | return acl; | ||
| 227 | 207 | ||
| 228 | switch (type) { | 208 | switch (type) { |
| 229 | case ACL_TYPE_ACCESS: | 209 | case ACL_TYPE_ACCESS: |
| 230 | name = POSIX_ACL_XATTR_ACCESS; | 210 | name = POSIX_ACL_XATTR_ACCESS; |
| 231 | p_acl = &reiserfs_i->i_acl_access; | ||
| 232 | break; | 211 | break; |
| 233 | case ACL_TYPE_DEFAULT: | 212 | case ACL_TYPE_DEFAULT: |
| 234 | name = POSIX_ACL_XATTR_DEFAULT; | 213 | name = POSIX_ACL_XATTR_DEFAULT; |
| 235 | p_acl = &reiserfs_i->i_acl_default; | ||
| 236 | break; | 214 | break; |
| 237 | default: | 215 | default: |
| 238 | return ERR_PTR(-EINVAL); | 216 | BUG(); |
| 239 | } | 217 | } |
| 240 | 218 | ||
| 241 | acl = iget_acl(inode, p_acl); | ||
| 242 | if (acl && !IS_ERR(acl)) | ||
| 243 | return acl; | ||
| 244 | else if (PTR_ERR(acl) == -ENODATA) | ||
| 245 | return NULL; | ||
| 246 | |||
| 247 | size = reiserfs_xattr_get(inode, name, NULL, 0); | 219 | size = reiserfs_xattr_get(inode, name, NULL, 0); |
| 248 | if (size < 0) { | 220 | if (size < 0) { |
| 249 | if (size == -ENODATA || size == -ENOSYS) { | 221 | if (size == -ENODATA || size == -ENOSYS) { |
| 250 | *p_acl = ERR_PTR(-ENODATA); | 222 | set_cached_acl(inode, type, NULL); |
| 251 | return NULL; | 223 | return NULL; |
| 252 | } | 224 | } |
| 253 | return ERR_PTR(size); | 225 | return ERR_PTR(size); |
| @@ -262,14 +234,13 @@ struct posix_acl *reiserfs_get_acl(struct inode *inode, int type) | |||
| 262 | /* This shouldn't actually happen as it should have | 234 | /* This shouldn't actually happen as it should have |
| 263 | been caught above.. but just in case */ | 235 | been caught above.. but just in case */ |
| 264 | acl = NULL; | 236 | acl = NULL; |
| 265 | *p_acl = ERR_PTR(-ENODATA); | ||
| 266 | } else if (retval < 0) { | 237 | } else if (retval < 0) { |
| 267 | acl = ERR_PTR(retval); | 238 | acl = ERR_PTR(retval); |
| 268 | } else { | 239 | } else { |
| 269 | acl = posix_acl_from_disk(value, retval); | 240 | acl = posix_acl_from_disk(value, retval); |
| 270 | if (!IS_ERR(acl)) | ||
| 271 | iset_acl(inode, p_acl, acl); | ||
| 272 | } | 241 | } |
| 242 | if (!IS_ERR(acl)) | ||
| 243 | set_cached_acl(inode, type, acl); | ||
| 273 | 244 | ||
| 274 | kfree(value); | 245 | kfree(value); |
| 275 | return acl; | 246 | return acl; |
| @@ -287,10 +258,8 @@ reiserfs_set_acl(struct reiserfs_transaction_handle *th, struct inode *inode, | |||
| 287 | { | 258 | { |
| 288 | char *name; | 259 | char *name; |
| 289 | void *value = NULL; | 260 | void *value = NULL; |
| 290 | struct posix_acl **p_acl; | ||
| 291 | size_t size = 0; | 261 | size_t size = 0; |
| 292 | int error; | 262 | int error; |
| 293 | struct reiserfs_inode_info *reiserfs_i = REISERFS_I(inode); | ||
| 294 | 263 | ||
| 295 | if (S_ISLNK(inode->i_mode)) | 264 | if (S_ISLNK(inode->i_mode)) |
| 296 | return -EOPNOTSUPP; | 265 | return -EOPNOTSUPP; |
| @@ -298,7 +267,6 @@ reiserfs_set_acl(struct reiserfs_transaction_handle *th, struct inode *inode, | |||
| 298 | switch (type) { | 267 | switch (type) { |
| 299 | case ACL_TYPE_ACCESS: | 268 | case ACL_TYPE_ACCESS: |
| 300 | name = POSIX_ACL_XATTR_ACCESS; | 269 | name = POSIX_ACL_XATTR_ACCESS; |
| 301 | p_acl = &reiserfs_i->i_acl_access; | ||
| 302 | if (acl) { | 270 | if (acl) { |
| 303 | mode_t mode = inode->i_mode; | 271 | mode_t mode = inode->i_mode; |
| 304 | error = posix_acl_equiv_mode(acl, &mode); | 272 | error = posix_acl_equiv_mode(acl, &mode); |
| @@ -313,7 +281,6 @@ reiserfs_set_acl(struct reiserfs_transaction_handle *th, struct inode *inode, | |||
| 313 | break; | 281 | break; |
| 314 | case ACL_TYPE_DEFAULT: | 282 | case ACL_TYPE_DEFAULT: |
| 315 | name = POSIX_ACL_XATTR_DEFAULT; | 283 | name = POSIX_ACL_XATTR_DEFAULT; |
| 316 | p_acl = &reiserfs_i->i_acl_default; | ||
| 317 | if (!S_ISDIR(inode->i_mode)) | 284 | if (!S_ISDIR(inode->i_mode)) |
| 318 | return acl ? -EACCES : 0; | 285 | return acl ? -EACCES : 0; |
| 319 | break; | 286 | break; |
| @@ -346,7 +313,7 @@ reiserfs_set_acl(struct reiserfs_transaction_handle *th, struct inode *inode, | |||
| 346 | kfree(value); | 313 | kfree(value); |
| 347 | 314 | ||
| 348 | if (!error) | 315 | if (!error) |
| 349 | iset_acl(inode, p_acl, acl); | 316 | set_cached_acl(inode, type, acl); |
| 350 | 317 | ||
| 351 | return error; | 318 | return error; |
| 352 | } | 319 | } |
| @@ -379,11 +346,8 @@ reiserfs_inherit_default_acl(struct reiserfs_transaction_handle *th, | |||
| 379 | } | 346 | } |
| 380 | 347 | ||
| 381 | acl = reiserfs_get_acl(dir, ACL_TYPE_DEFAULT); | 348 | acl = reiserfs_get_acl(dir, ACL_TYPE_DEFAULT); |
| 382 | if (IS_ERR(acl)) { | 349 | if (IS_ERR(acl)) |
| 383 | if (PTR_ERR(acl) == -ENODATA) | ||
| 384 | goto apply_umask; | ||
| 385 | return PTR_ERR(acl); | 350 | return PTR_ERR(acl); |
| 386 | } | ||
| 387 | 351 | ||
| 388 | if (acl) { | 352 | if (acl) { |
| 389 | struct posix_acl *acl_copy; | 353 | struct posix_acl *acl_copy; |
diff --git a/fs/super.c b/fs/super.c index d40d53a22fb5..2761d3e22ed9 100644 --- a/fs/super.c +++ b/fs/super.c | |||
| @@ -608,6 +608,7 @@ void emergency_remount(void) | |||
| 608 | 608 | ||
| 609 | static DEFINE_IDA(unnamed_dev_ida); | 609 | static DEFINE_IDA(unnamed_dev_ida); |
| 610 | static DEFINE_SPINLOCK(unnamed_dev_lock);/* protects the above */ | 610 | static DEFINE_SPINLOCK(unnamed_dev_lock);/* protects the above */ |
| 611 | static int unnamed_dev_start = 0; /* don't bother trying below it */ | ||
| 611 | 612 | ||
| 612 | int set_anon_super(struct super_block *s, void *data) | 613 | int set_anon_super(struct super_block *s, void *data) |
| 613 | { | 614 | { |
| @@ -618,7 +619,9 @@ int set_anon_super(struct super_block *s, void *data) | |||
| 618 | if (ida_pre_get(&unnamed_dev_ida, GFP_ATOMIC) == 0) | 619 | if (ida_pre_get(&unnamed_dev_ida, GFP_ATOMIC) == 0) |
| 619 | return -ENOMEM; | 620 | return -ENOMEM; |
| 620 | spin_lock(&unnamed_dev_lock); | 621 | spin_lock(&unnamed_dev_lock); |
| 621 | error = ida_get_new(&unnamed_dev_ida, &dev); | 622 | error = ida_get_new_above(&unnamed_dev_ida, unnamed_dev_start, &dev); |
| 623 | if (!error) | ||
| 624 | unnamed_dev_start = dev + 1; | ||
| 622 | spin_unlock(&unnamed_dev_lock); | 625 | spin_unlock(&unnamed_dev_lock); |
| 623 | if (error == -EAGAIN) | 626 | if (error == -EAGAIN) |
| 624 | /* We raced and lost with another CPU. */ | 627 | /* We raced and lost with another CPU. */ |
| @@ -629,6 +632,8 @@ int set_anon_super(struct super_block *s, void *data) | |||
| 629 | if ((dev & MAX_ID_MASK) == (1 << MINORBITS)) { | 632 | if ((dev & MAX_ID_MASK) == (1 << MINORBITS)) { |
| 630 | spin_lock(&unnamed_dev_lock); | 633 | spin_lock(&unnamed_dev_lock); |
| 631 | ida_remove(&unnamed_dev_ida, dev); | 634 | ida_remove(&unnamed_dev_ida, dev); |
| 635 | if (unnamed_dev_start > dev) | ||
| 636 | unnamed_dev_start = dev; | ||
| 632 | spin_unlock(&unnamed_dev_lock); | 637 | spin_unlock(&unnamed_dev_lock); |
| 633 | return -EMFILE; | 638 | return -EMFILE; |
| 634 | } | 639 | } |
| @@ -645,6 +650,8 @@ void kill_anon_super(struct super_block *sb) | |||
| 645 | generic_shutdown_super(sb); | 650 | generic_shutdown_super(sb); |
| 646 | spin_lock(&unnamed_dev_lock); | 651 | spin_lock(&unnamed_dev_lock); |
| 647 | ida_remove(&unnamed_dev_ida, slot); | 652 | ida_remove(&unnamed_dev_ida, slot); |
| 653 | if (slot < unnamed_dev_start) | ||
| 654 | unnamed_dev_start = slot; | ||
| 648 | spin_unlock(&unnamed_dev_lock); | 655 | spin_unlock(&unnamed_dev_lock); |
| 649 | } | 656 | } |
| 650 | 657 | ||
diff --git a/fs/ubifs/xattr.c b/fs/ubifs/xattr.c index cfd31e229c89..adafcf556531 100644 --- a/fs/ubifs/xattr.c +++ b/fs/ubifs/xattr.c | |||
| @@ -55,9 +55,9 @@ | |||
| 55 | * ACL support is not implemented. | 55 | * ACL support is not implemented. |
| 56 | */ | 56 | */ |
| 57 | 57 | ||
| 58 | #include "ubifs.h" | ||
| 58 | #include <linux/xattr.h> | 59 | #include <linux/xattr.h> |
| 59 | #include <linux/posix_acl_xattr.h> | 60 | #include <linux/posix_acl_xattr.h> |
| 60 | #include "ubifs.h" | ||
| 61 | 61 | ||
| 62 | /* | 62 | /* |
| 63 | * Limit the number of extended attributes per inode so that the total size | 63 | * Limit the number of extended attributes per inode so that the total size |
diff --git a/fs/xfs/linux-2.6/xfs_acl.c b/fs/xfs/linux-2.6/xfs_acl.c index 1e9d1246eebc..b23a54506446 100644 --- a/fs/xfs/linux-2.6/xfs_acl.c +++ b/fs/xfs/linux-2.6/xfs_acl.c | |||
| @@ -25,14 +25,10 @@ | |||
| 25 | #include <linux/posix_acl_xattr.h> | 25 | #include <linux/posix_acl_xattr.h> |
| 26 | 26 | ||
| 27 | 27 | ||
| 28 | #define XFS_ACL_NOT_CACHED ((void *)-1) | ||
| 29 | |||
| 30 | /* | 28 | /* |
| 31 | * Locking scheme: | 29 | * Locking scheme: |
| 32 | * - all ACL updates are protected by inode->i_mutex, which is taken before | 30 | * - all ACL updates are protected by inode->i_mutex, which is taken before |
| 33 | * calling into this file. | 31 | * calling into this file. |
| 34 | * - access and updates to the ip->i_acl and ip->i_default_acl pointers are | ||
| 35 | * protected by inode->i_lock. | ||
| 36 | */ | 32 | */ |
| 37 | 33 | ||
| 38 | STATIC struct posix_acl * | 34 | STATIC struct posix_acl * |
| @@ -102,59 +98,35 @@ xfs_acl_to_disk(struct xfs_acl *aclp, const struct posix_acl *acl) | |||
| 102 | } | 98 | } |
| 103 | } | 99 | } |
| 104 | 100 | ||
| 105 | /* | ||
| 106 | * Update the cached ACL pointer in the inode. | ||
| 107 | * | ||
| 108 | * Because we don't hold any locks while reading/writing the attribute | ||
| 109 | * from/to disk another thread could have raced and updated the cached | ||
| 110 | * ACL value before us. In that case we release the previous cached value | ||
| 111 | * and update it with our new value. | ||
| 112 | */ | ||
| 113 | STATIC void | ||
| 114 | xfs_update_cached_acl(struct inode *inode, struct posix_acl **p_acl, | ||
| 115 | struct posix_acl *acl) | ||
| 116 | { | ||
| 117 | spin_lock(&inode->i_lock); | ||
| 118 | if (*p_acl && *p_acl != XFS_ACL_NOT_CACHED) | ||
| 119 | posix_acl_release(*p_acl); | ||
| 120 | *p_acl = posix_acl_dup(acl); | ||
| 121 | spin_unlock(&inode->i_lock); | ||
| 122 | } | ||
| 123 | |||
| 124 | struct posix_acl * | 101 | struct posix_acl * |
| 125 | xfs_get_acl(struct inode *inode, int type) | 102 | xfs_get_acl(struct inode *inode, int type) |
| 126 | { | 103 | { |
| 127 | struct xfs_inode *ip = XFS_I(inode); | 104 | struct xfs_inode *ip = XFS_I(inode); |
| 128 | struct posix_acl *acl = NULL, **p_acl; | 105 | struct posix_acl *acl; |
| 129 | struct xfs_acl *xfs_acl; | 106 | struct xfs_acl *xfs_acl; |
| 130 | int len = sizeof(struct xfs_acl); | 107 | int len = sizeof(struct xfs_acl); |
| 131 | char *ea_name; | 108 | char *ea_name; |
| 132 | int error; | 109 | int error; |
| 133 | 110 | ||
| 111 | acl = get_cached_acl(inode, type); | ||
| 112 | if (acl != ACL_NOT_CACHED) | ||
| 113 | return acl; | ||
| 114 | |||
| 134 | switch (type) { | 115 | switch (type) { |
| 135 | case ACL_TYPE_ACCESS: | 116 | case ACL_TYPE_ACCESS: |
| 136 | ea_name = SGI_ACL_FILE; | 117 | ea_name = SGI_ACL_FILE; |
| 137 | p_acl = &ip->i_acl; | ||
| 138 | break; | 118 | break; |
| 139 | case ACL_TYPE_DEFAULT: | 119 | case ACL_TYPE_DEFAULT: |
| 140 | ea_name = SGI_ACL_DEFAULT; | 120 | ea_name = SGI_ACL_DEFAULT; |
| 141 | p_acl = &ip->i_default_acl; | ||
| 142 | break; | 121 | break; |
| 143 | default: | 122 | default: |
| 144 | return ERR_PTR(-EINVAL); | 123 | BUG(); |
| 145 | } | 124 | } |
| 146 | 125 | ||
| 147 | spin_lock(&inode->i_lock); | ||
| 148 | if (*p_acl != XFS_ACL_NOT_CACHED) | ||
| 149 | acl = posix_acl_dup(*p_acl); | ||
| 150 | spin_unlock(&inode->i_lock); | ||
| 151 | |||
| 152 | /* | 126 | /* |
| 153 | * If we have a cached ACLs value just return it, not need to | 127 | * If we have a cached ACLs value just return it, not need to |
| 154 | * go out to the disk. | 128 | * go out to the disk. |
| 155 | */ | 129 | */ |
| 156 | if (acl) | ||
| 157 | return acl; | ||
| 158 | 130 | ||
| 159 | xfs_acl = kzalloc(sizeof(struct xfs_acl), GFP_KERNEL); | 131 | xfs_acl = kzalloc(sizeof(struct xfs_acl), GFP_KERNEL); |
| 160 | if (!xfs_acl) | 132 | if (!xfs_acl) |
| @@ -165,7 +137,7 @@ xfs_get_acl(struct inode *inode, int type) | |||
| 165 | /* | 137 | /* |
| 166 | * If the attribute doesn't exist make sure we have a negative | 138 | * If the attribute doesn't exist make sure we have a negative |
| 167 | * cache entry, for any other error assume it is transient and | 139 | * cache entry, for any other error assume it is transient and |
| 168 | * leave the cache entry as XFS_ACL_NOT_CACHED. | 140 | * leave the cache entry as ACL_NOT_CACHED. |
| 169 | */ | 141 | */ |
| 170 | if (error == -ENOATTR) { | 142 | if (error == -ENOATTR) { |
| 171 | acl = NULL; | 143 | acl = NULL; |
| @@ -179,7 +151,7 @@ xfs_get_acl(struct inode *inode, int type) | |||
| 179 | goto out; | 151 | goto out; |
| 180 | 152 | ||
| 181 | out_update_cache: | 153 | out_update_cache: |
| 182 | xfs_update_cached_acl(inode, p_acl, acl); | 154 | set_cached_acl(inode, type, acl); |
| 183 | out: | 155 | out: |
| 184 | kfree(xfs_acl); | 156 | kfree(xfs_acl); |
| 185 | return acl; | 157 | return acl; |
| @@ -189,7 +161,6 @@ STATIC int | |||
| 189 | xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl) | 161 | xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl) |
| 190 | { | 162 | { |
| 191 | struct xfs_inode *ip = XFS_I(inode); | 163 | struct xfs_inode *ip = XFS_I(inode); |
| 192 | struct posix_acl **p_acl; | ||
| 193 | char *ea_name; | 164 | char *ea_name; |
| 194 | int error; | 165 | int error; |
| 195 | 166 | ||
| @@ -199,13 +170,11 @@ xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl) | |||
| 199 | switch (type) { | 170 | switch (type) { |
| 200 | case ACL_TYPE_ACCESS: | 171 | case ACL_TYPE_ACCESS: |
| 201 | ea_name = SGI_ACL_FILE; | 172 | ea_name = SGI_ACL_FILE; |
| 202 | p_acl = &ip->i_acl; | ||
| 203 | break; | 173 | break; |
| 204 | case ACL_TYPE_DEFAULT: | 174 | case ACL_TYPE_DEFAULT: |
| 205 | if (!S_ISDIR(inode->i_mode)) | 175 | if (!S_ISDIR(inode->i_mode)) |
| 206 | return acl ? -EACCES : 0; | 176 | return acl ? -EACCES : 0; |
| 207 | ea_name = SGI_ACL_DEFAULT; | 177 | ea_name = SGI_ACL_DEFAULT; |
| 208 | p_acl = &ip->i_default_acl; | ||
| 209 | break; | 178 | break; |
| 210 | default: | 179 | default: |
| 211 | return -EINVAL; | 180 | return -EINVAL; |
| @@ -242,7 +211,7 @@ xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl) | |||
| 242 | } | 211 | } |
| 243 | 212 | ||
| 244 | if (!error) | 213 | if (!error) |
| 245 | xfs_update_cached_acl(inode, p_acl, acl); | 214 | set_cached_acl(inode, type, acl); |
| 246 | return error; | 215 | return error; |
| 247 | } | 216 | } |
| 248 | 217 | ||
| @@ -384,30 +353,6 @@ xfs_acl_chmod(struct inode *inode) | |||
| 384 | return error; | 353 | return error; |
| 385 | } | 354 | } |
| 386 | 355 | ||
| 387 | void | ||
| 388 | xfs_inode_init_acls(struct xfs_inode *ip) | ||
| 389 | { | ||
| 390 | /* | ||
| 391 | * No need for locking, inode is not live yet. | ||
| 392 | */ | ||
| 393 | ip->i_acl = XFS_ACL_NOT_CACHED; | ||
| 394 | ip->i_default_acl = XFS_ACL_NOT_CACHED; | ||
| 395 | } | ||
| 396 | |||
| 397 | void | ||
| 398 | xfs_inode_clear_acls(struct xfs_inode *ip) | ||
| 399 | { | ||
| 400 | /* | ||
| 401 | * No need for locking here, the inode is not live anymore | ||
| 402 | * and just about to be freed. | ||
| 403 | */ | ||
| 404 | if (ip->i_acl != XFS_ACL_NOT_CACHED) | ||
| 405 | posix_acl_release(ip->i_acl); | ||
| 406 | if (ip->i_default_acl != XFS_ACL_NOT_CACHED) | ||
| 407 | posix_acl_release(ip->i_default_acl); | ||
| 408 | } | ||
| 409 | |||
| 410 | |||
| 411 | /* | 356 | /* |
| 412 | * System xattr handlers. | 357 | * System xattr handlers. |
| 413 | * | 358 | * |
diff --git a/fs/xfs/xfs_acl.h b/fs/xfs/xfs_acl.h index 63dc1f2efad5..947b150df8ed 100644 --- a/fs/xfs/xfs_acl.h +++ b/fs/xfs/xfs_acl.h | |||
| @@ -46,8 +46,6 @@ extern int xfs_check_acl(struct inode *inode, int mask); | |||
| 46 | extern struct posix_acl *xfs_get_acl(struct inode *inode, int type); | 46 | extern struct posix_acl *xfs_get_acl(struct inode *inode, int type); |
| 47 | extern int xfs_inherit_acl(struct inode *inode, struct posix_acl *default_acl); | 47 | extern int xfs_inherit_acl(struct inode *inode, struct posix_acl *default_acl); |
| 48 | extern int xfs_acl_chmod(struct inode *inode); | 48 | extern int xfs_acl_chmod(struct inode *inode); |
| 49 | extern void xfs_inode_init_acls(struct xfs_inode *ip); | ||
| 50 | extern void xfs_inode_clear_acls(struct xfs_inode *ip); | ||
| 51 | extern int posix_acl_access_exists(struct inode *inode); | 49 | extern int posix_acl_access_exists(struct inode *inode); |
| 52 | extern int posix_acl_default_exists(struct inode *inode); | 50 | extern int posix_acl_default_exists(struct inode *inode); |
| 53 | 51 | ||
| @@ -57,8 +55,6 @@ extern struct xattr_handler xfs_xattr_system_handler; | |||
| 57 | # define xfs_get_acl(inode, type) NULL | 55 | # define xfs_get_acl(inode, type) NULL |
| 58 | # define xfs_inherit_acl(inode, default_acl) 0 | 56 | # define xfs_inherit_acl(inode, default_acl) 0 |
| 59 | # define xfs_acl_chmod(inode) 0 | 57 | # define xfs_acl_chmod(inode) 0 |
| 60 | # define xfs_inode_init_acls(ip) | ||
| 61 | # define xfs_inode_clear_acls(ip) | ||
| 62 | # define posix_acl_access_exists(inode) 0 | 58 | # define posix_acl_access_exists(inode) 0 |
| 63 | # define posix_acl_default_exists(inode) 0 | 59 | # define posix_acl_default_exists(inode) 0 |
| 64 | #endif /* CONFIG_XFS_POSIX_ACL */ | 60 | #endif /* CONFIG_XFS_POSIX_ACL */ |
diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index 76c540f719e4..5fcec6f020a7 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c | |||
| @@ -83,7 +83,6 @@ xfs_inode_alloc( | |||
| 83 | memset(&ip->i_d, 0, sizeof(xfs_icdinode_t)); | 83 | memset(&ip->i_d, 0, sizeof(xfs_icdinode_t)); |
| 84 | ip->i_size = 0; | 84 | ip->i_size = 0; |
| 85 | ip->i_new_size = 0; | 85 | ip->i_new_size = 0; |
| 86 | xfs_inode_init_acls(ip); | ||
| 87 | 86 | ||
| 88 | /* | 87 | /* |
| 89 | * Initialize inode's trace buffers. | 88 | * Initialize inode's trace buffers. |
| @@ -560,7 +559,6 @@ xfs_ireclaim( | |||
| 560 | ASSERT(atomic_read(&ip->i_pincount) == 0); | 559 | ASSERT(atomic_read(&ip->i_pincount) == 0); |
| 561 | ASSERT(!spin_is_locked(&ip->i_flags_lock)); | 560 | ASSERT(!spin_is_locked(&ip->i_flags_lock)); |
| 562 | ASSERT(completion_done(&ip->i_flush)); | 561 | ASSERT(completion_done(&ip->i_flush)); |
| 563 | xfs_inode_clear_acls(ip); | ||
| 564 | kmem_zone_free(xfs_inode_zone, ip); | 562 | kmem_zone_free(xfs_inode_zone, ip); |
| 565 | } | 563 | } |
| 566 | 564 | ||
diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 77016702938b..1804f866a71d 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h | |||
| @@ -273,11 +273,6 @@ typedef struct xfs_inode { | |||
| 273 | /* VFS inode */ | 273 | /* VFS inode */ |
| 274 | struct inode i_vnode; /* embedded VFS inode */ | 274 | struct inode i_vnode; /* embedded VFS inode */ |
| 275 | 275 | ||
| 276 | #ifdef CONFIG_XFS_POSIX_ACL | ||
| 277 | struct posix_acl *i_acl; | ||
| 278 | struct posix_acl *i_default_acl; | ||
| 279 | #endif | ||
| 280 | |||
| 281 | /* Trace buffers per inode. */ | 276 | /* Trace buffers per inode. */ |
| 282 | #ifdef XFS_INODE_TRACE | 277 | #ifdef XFS_INODE_TRACE |
| 283 | struct ktrace *i_trace; /* general inode trace */ | 278 | struct ktrace *i_trace; /* general inode trace */ |
diff --git a/include/linux/ext3_fs_i.h b/include/linux/ext3_fs_i.h index 7894dd0f3b77..ca1bfe90004f 100644 --- a/include/linux/ext3_fs_i.h +++ b/include/linux/ext3_fs_i.h | |||
| @@ -103,10 +103,6 @@ struct ext3_inode_info { | |||
| 103 | */ | 103 | */ |
| 104 | struct rw_semaphore xattr_sem; | 104 | struct rw_semaphore xattr_sem; |
| 105 | #endif | 105 | #endif |
| 106 | #ifdef CONFIG_EXT3_FS_POSIX_ACL | ||
| 107 | struct posix_acl *i_acl; | ||
| 108 | struct posix_acl *i_default_acl; | ||
| 109 | #endif | ||
| 110 | 106 | ||
| 111 | struct list_head i_orphan; /* unlinked but open inodes */ | 107 | struct list_head i_orphan; /* unlinked but open inodes */ |
| 112 | 108 | ||
diff --git a/include/linux/falloc.h b/include/linux/falloc.h index 8e912ab6a072..3c155107d61f 100644 --- a/include/linux/falloc.h +++ b/include/linux/falloc.h | |||
| @@ -3,4 +3,25 @@ | |||
| 3 | 3 | ||
| 4 | #define FALLOC_FL_KEEP_SIZE 0x01 /* default is extend size */ | 4 | #define FALLOC_FL_KEEP_SIZE 0x01 /* default is extend size */ |
| 5 | 5 | ||
| 6 | #ifdef __KERNEL__ | ||
| 7 | |||
| 8 | /* | ||
| 9 | * Space reservation ioctls and argument structure | ||
| 10 | * are designed to be compatible with the legacy XFS ioctls. | ||
| 11 | */ | ||
| 12 | struct space_resv { | ||
| 13 | __s16 l_type; | ||
| 14 | __s16 l_whence; | ||
| 15 | __s64 l_start; | ||
| 16 | __s64 l_len; /* len == 0 means until end of file */ | ||
| 17 | __s32 l_sysid; | ||
| 18 | __u32 l_pid; | ||
| 19 | __s32 l_pad[4]; /* reserved area */ | ||
| 20 | }; | ||
| 21 | |||
| 22 | #define FS_IOC_RESVSP _IOW('X', 40, struct space_resv) | ||
| 23 | #define FS_IOC_RESVSP64 _IOW('X', 42, struct space_resv) | ||
| 24 | |||
| 25 | #endif /* __KERNEL__ */ | ||
| 26 | |||
| 6 | #endif /* _FALLOC_H_ */ | 27 | #endif /* _FALLOC_H_ */ |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 1ff5e4e01952..0872372184fe 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -710,6 +710,9 @@ static inline int mapping_writably_mapped(struct address_space *mapping) | |||
| 710 | #define i_size_ordered_init(inode) do { } while (0) | 710 | #define i_size_ordered_init(inode) do { } while (0) |
| 711 | #endif | 711 | #endif |
| 712 | 712 | ||
| 713 | struct posix_acl; | ||
| 714 | #define ACL_NOT_CACHED ((void *)(-1)) | ||
| 715 | |||
| 713 | struct inode { | 716 | struct inode { |
| 714 | struct hlist_node i_hash; | 717 | struct hlist_node i_hash; |
| 715 | struct list_head i_list; | 718 | struct list_head i_list; |
| @@ -773,6 +776,10 @@ struct inode { | |||
| 773 | #ifdef CONFIG_SECURITY | 776 | #ifdef CONFIG_SECURITY |
| 774 | void *i_security; | 777 | void *i_security; |
| 775 | #endif | 778 | #endif |
| 779 | #ifdef CONFIG_FS_POSIX_ACL | ||
| 780 | struct posix_acl *i_acl; | ||
| 781 | struct posix_acl *i_default_acl; | ||
| 782 | #endif | ||
| 776 | void *i_private; /* fs or device private pointer */ | 783 | void *i_private; /* fs or device private pointer */ |
| 777 | }; | 784 | }; |
| 778 | 785 | ||
| @@ -1906,6 +1913,8 @@ static inline int break_lease(struct inode *inode, unsigned int mode) | |||
| 1906 | 1913 | ||
| 1907 | extern int do_truncate(struct dentry *, loff_t start, unsigned int time_attrs, | 1914 | extern int do_truncate(struct dentry *, loff_t start, unsigned int time_attrs, |
| 1908 | struct file *filp); | 1915 | struct file *filp); |
| 1916 | extern int do_fallocate(struct file *file, int mode, loff_t offset, | ||
| 1917 | loff_t len); | ||
| 1909 | extern long do_sys_open(int dfd, const char __user *filename, int flags, | 1918 | extern long do_sys_open(int dfd, const char __user *filename, int flags, |
| 1910 | int mode); | 1919 | int mode); |
| 1911 | extern struct file *filp_open(const char *, int, int); | 1920 | extern struct file *filp_open(const char *, int, int); |
| @@ -1914,6 +1923,10 @@ extern struct file * dentry_open(struct dentry *, struct vfsmount *, int, | |||
| 1914 | extern int filp_close(struct file *, fl_owner_t id); | 1923 | extern int filp_close(struct file *, fl_owner_t id); |
| 1915 | extern char * getname(const char __user *); | 1924 | extern char * getname(const char __user *); |
| 1916 | 1925 | ||
| 1926 | /* fs/ioctl.c */ | ||
| 1927 | |||
| 1928 | extern int ioctl_preallocate(struct file *filp, void __user *argp); | ||
| 1929 | |||
| 1917 | /* fs/dcache.c */ | 1930 | /* fs/dcache.c */ |
| 1918 | extern void __init vfs_caches_init_early(void); | 1931 | extern void __init vfs_caches_init_early(void); |
| 1919 | extern void __init vfs_caches_init(unsigned long); | 1932 | extern void __init vfs_caches_init(unsigned long); |
diff --git a/include/linux/posix_acl.h b/include/linux/posix_acl.h index 4bc241290c24..0cdba01b7756 100644 --- a/include/linux/posix_acl.h +++ b/include/linux/posix_acl.h | |||
| @@ -83,4 +83,68 @@ extern int posix_acl_chmod_masq(struct posix_acl *, mode_t); | |||
| 83 | extern struct posix_acl *get_posix_acl(struct inode *, int); | 83 | extern struct posix_acl *get_posix_acl(struct inode *, int); |
| 84 | extern int set_posix_acl(struct inode *, int, struct posix_acl *); | 84 | extern int set_posix_acl(struct inode *, int, struct posix_acl *); |
| 85 | 85 | ||
| 86 | static inline struct posix_acl *get_cached_acl(struct inode *inode, int type) | ||
| 87 | { | ||
| 88 | struct posix_acl **p, *acl; | ||
| 89 | switch (type) { | ||
| 90 | case ACL_TYPE_ACCESS: | ||
| 91 | p = &inode->i_acl; | ||
| 92 | break; | ||
| 93 | case ACL_TYPE_DEFAULT: | ||
| 94 | p = &inode->i_default_acl; | ||
| 95 | break; | ||
| 96 | default: | ||
| 97 | return ERR_PTR(-EINVAL); | ||
| 98 | } | ||
| 99 | acl = ACCESS_ONCE(*p); | ||
| 100 | if (acl) { | ||
| 101 | spin_lock(&inode->i_lock); | ||
| 102 | acl = *p; | ||
| 103 | if (acl != ACL_NOT_CACHED) | ||
| 104 | acl = posix_acl_dup(acl); | ||
| 105 | spin_unlock(&inode->i_lock); | ||
| 106 | } | ||
| 107 | return acl; | ||
| 108 | } | ||
| 109 | |||
| 110 | static inline void set_cached_acl(struct inode *inode, | ||
| 111 | int type, | ||
| 112 | struct posix_acl *acl) | ||
| 113 | { | ||
| 114 | struct posix_acl *old = NULL; | ||
| 115 | spin_lock(&inode->i_lock); | ||
| 116 | switch (type) { | ||
| 117 | case ACL_TYPE_ACCESS: | ||
| 118 | old = inode->i_acl; | ||
| 119 | inode->i_acl = posix_acl_dup(acl); | ||
| 120 | break; | ||
| 121 | case ACL_TYPE_DEFAULT: | ||
| 122 | old = inode->i_default_acl; | ||
| 123 | inode->i_default_acl = posix_acl_dup(acl); | ||
| 124 | break; | ||
| 125 | } | ||
| 126 | spin_unlock(&inode->i_lock); | ||
| 127 | if (old != ACL_NOT_CACHED) | ||
| 128 | posix_acl_release(old); | ||
| 129 | } | ||
| 130 | |||
| 131 | static inline void forget_cached_acl(struct inode *inode, int type) | ||
| 132 | { | ||
| 133 | struct posix_acl *old = NULL; | ||
| 134 | spin_lock(&inode->i_lock); | ||
| 135 | switch (type) { | ||
| 136 | case ACL_TYPE_ACCESS: | ||
| 137 | old = inode->i_acl; | ||
| 138 | inode->i_acl = ACL_NOT_CACHED; | ||
| 139 | break; | ||
| 140 | case ACL_TYPE_DEFAULT: | ||
| 141 | old = inode->i_default_acl; | ||
| 142 | inode->i_default_acl = ACL_NOT_CACHED; | ||
| 143 | break; | ||
| 144 | } | ||
| 145 | spin_unlock(&inode->i_lock); | ||
| 146 | if (old != ACL_NOT_CACHED) | ||
| 147 | posix_acl_release(old); | ||
| 148 | } | ||
| 149 | |||
| 86 | #endif /* __LINUX_POSIX_ACL_H */ | 150 | #endif /* __LINUX_POSIX_ACL_H */ |
diff --git a/include/linux/reiserfs_acl.h b/include/linux/reiserfs_acl.h index 8cc65757e47a..b4448853900e 100644 --- a/include/linux/reiserfs_acl.h +++ b/include/linux/reiserfs_acl.h | |||
| @@ -56,15 +56,6 @@ int reiserfs_cache_default_acl(struct inode *dir); | |||
| 56 | extern struct xattr_handler reiserfs_posix_acl_default_handler; | 56 | extern struct xattr_handler reiserfs_posix_acl_default_handler; |
| 57 | extern struct xattr_handler reiserfs_posix_acl_access_handler; | 57 | extern struct xattr_handler reiserfs_posix_acl_access_handler; |
| 58 | 58 | ||
| 59 | static inline void reiserfs_init_acl_access(struct inode *inode) | ||
| 60 | { | ||
| 61 | REISERFS_I(inode)->i_acl_access = NULL; | ||
| 62 | } | ||
| 63 | |||
| 64 | static inline void reiserfs_init_acl_default(struct inode *inode) | ||
| 65 | { | ||
| 66 | REISERFS_I(inode)->i_acl_default = NULL; | ||
| 67 | } | ||
| 68 | #else | 59 | #else |
| 69 | 60 | ||
| 70 | #define reiserfs_cache_default_acl(inode) 0 | 61 | #define reiserfs_cache_default_acl(inode) 0 |
| @@ -86,12 +77,4 @@ reiserfs_inherit_default_acl(struct reiserfs_transaction_handle *th, | |||
| 86 | { | 77 | { |
| 87 | return 0; | 78 | return 0; |
| 88 | } | 79 | } |
| 89 | |||
| 90 | static inline void reiserfs_init_acl_access(struct inode *inode) | ||
| 91 | { | ||
| 92 | } | ||
| 93 | |||
| 94 | static inline void reiserfs_init_acl_default(struct inode *inode) | ||
| 95 | { | ||
| 96 | } | ||
| 97 | #endif | 80 | #endif |
diff --git a/include/linux/reiserfs_fs_i.h b/include/linux/reiserfs_fs_i.h index 76360b36ac33..89f4d3abbf5a 100644 --- a/include/linux/reiserfs_fs_i.h +++ b/include/linux/reiserfs_fs_i.h | |||
| @@ -54,10 +54,6 @@ struct reiserfs_inode_info { | |||
| 54 | unsigned int i_trans_id; | 54 | unsigned int i_trans_id; |
| 55 | struct reiserfs_journal_list *i_jl; | 55 | struct reiserfs_journal_list *i_jl; |
| 56 | struct mutex i_mmap; | 56 | struct mutex i_mmap; |
| 57 | #ifdef CONFIG_REISERFS_FS_POSIX_ACL | ||
| 58 | struct posix_acl *i_acl_access; | ||
| 59 | struct posix_acl *i_acl_default; | ||
| 60 | #endif | ||
| 61 | #ifdef CONFIG_REISERFS_FS_XATTR | 57 | #ifdef CONFIG_REISERFS_FS_XATTR |
| 62 | struct rw_semaphore i_xattr_sem; | 58 | struct rw_semaphore i_xattr_sem; |
| 63 | #endif | 59 | #endif |
diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h index fd83f2584b15..abff6c9b413c 100644 --- a/include/linux/shmem_fs.h +++ b/include/linux/shmem_fs.h | |||
| @@ -19,10 +19,6 @@ struct shmem_inode_info { | |||
| 19 | swp_entry_t i_direct[SHMEM_NR_DIRECT]; /* first blocks */ | 19 | swp_entry_t i_direct[SHMEM_NR_DIRECT]; /* first blocks */ |
| 20 | struct list_head swaplist; /* chain of maybes on swap */ | 20 | struct list_head swaplist; /* chain of maybes on swap */ |
| 21 | struct inode vfs_inode; | 21 | struct inode vfs_inode; |
| 22 | #ifdef CONFIG_TMPFS_POSIX_ACL | ||
| 23 | struct posix_acl *i_acl; | ||
| 24 | struct posix_acl *i_default_acl; | ||
| 25 | #endif | ||
| 26 | }; | 22 | }; |
| 27 | 23 | ||
| 28 | struct shmem_sb_info { | 24 | struct shmem_sb_info { |
| @@ -45,7 +41,6 @@ static inline struct shmem_inode_info *SHMEM_I(struct inode *inode) | |||
| 45 | #ifdef CONFIG_TMPFS_POSIX_ACL | 41 | #ifdef CONFIG_TMPFS_POSIX_ACL |
| 46 | int shmem_permission(struct inode *, int); | 42 | int shmem_permission(struct inode *, int); |
| 47 | int shmem_acl_init(struct inode *, struct inode *); | 43 | int shmem_acl_init(struct inode *, struct inode *); |
| 48 | void shmem_acl_destroy_inode(struct inode *); | ||
| 49 | 44 | ||
| 50 | extern struct xattr_handler shmem_xattr_acl_access_handler; | 45 | extern struct xattr_handler shmem_xattr_acl_access_handler; |
| 51 | extern struct xattr_handler shmem_xattr_acl_default_handler; | 46 | extern struct xattr_handler shmem_xattr_acl_default_handler; |
| @@ -57,9 +52,6 @@ static inline int shmem_acl_init(struct inode *inode, struct inode *dir) | |||
| 57 | { | 52 | { |
| 58 | return 0; | 53 | return 0; |
| 59 | } | 54 | } |
| 60 | static inline void shmem_acl_destroy_inode(struct inode *inode) | ||
| 61 | { | ||
| 62 | } | ||
| 63 | #endif /* CONFIG_TMPFS_POSIX_ACL */ | 55 | #endif /* CONFIG_TMPFS_POSIX_ACL */ |
| 64 | 56 | ||
| 65 | #endif | 57 | #endif |
diff --git a/mm/shmem.c b/mm/shmem.c index e89d7ec18eda..5f2019fc7895 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
| @@ -2379,6 +2379,10 @@ static struct inode *shmem_alloc_inode(struct super_block *sb) | |||
| 2379 | p = (struct shmem_inode_info *)kmem_cache_alloc(shmem_inode_cachep, GFP_KERNEL); | 2379 | p = (struct shmem_inode_info *)kmem_cache_alloc(shmem_inode_cachep, GFP_KERNEL); |
| 2380 | if (!p) | 2380 | if (!p) |
| 2381 | return NULL; | 2381 | return NULL; |
| 2382 | #ifdef CONFIG_TMPFS_POSIX_ACL | ||
| 2383 | p->vfs_inode.i_acl = NULL; | ||
| 2384 | p->vfs_inode.i_default_acl = NULL; | ||
| 2385 | #endif | ||
| 2382 | return &p->vfs_inode; | 2386 | return &p->vfs_inode; |
| 2383 | } | 2387 | } |
| 2384 | 2388 | ||
| @@ -2388,7 +2392,6 @@ static void shmem_destroy_inode(struct inode *inode) | |||
| 2388 | /* only struct inode is valid if it's an inline symlink */ | 2392 | /* only struct inode is valid if it's an inline symlink */ |
| 2389 | mpol_free_shared_policy(&SHMEM_I(inode)->policy); | 2393 | mpol_free_shared_policy(&SHMEM_I(inode)->policy); |
| 2390 | } | 2394 | } |
| 2391 | shmem_acl_destroy_inode(inode); | ||
| 2392 | kmem_cache_free(shmem_inode_cachep, SHMEM_I(inode)); | 2395 | kmem_cache_free(shmem_inode_cachep, SHMEM_I(inode)); |
| 2393 | } | 2396 | } |
| 2394 | 2397 | ||
| @@ -2397,10 +2400,6 @@ static void init_once(void *foo) | |||
| 2397 | struct shmem_inode_info *p = (struct shmem_inode_info *) foo; | 2400 | struct shmem_inode_info *p = (struct shmem_inode_info *) foo; |
| 2398 | 2401 | ||
| 2399 | inode_init_once(&p->vfs_inode); | 2402 | inode_init_once(&p->vfs_inode); |
| 2400 | #ifdef CONFIG_TMPFS_POSIX_ACL | ||
| 2401 | p->i_acl = NULL; | ||
| 2402 | p->i_default_acl = NULL; | ||
| 2403 | #endif | ||
| 2404 | } | 2403 | } |
| 2405 | 2404 | ||
| 2406 | static int init_inodecache(void) | 2405 | static int init_inodecache(void) |
diff --git a/mm/shmem_acl.c b/mm/shmem_acl.c index 8e5aadd7dcd6..606a8e757a42 100644 --- a/mm/shmem_acl.c +++ b/mm/shmem_acl.c | |||
| @@ -22,11 +22,11 @@ shmem_get_acl(struct inode *inode, int type) | |||
| 22 | spin_lock(&inode->i_lock); | 22 | spin_lock(&inode->i_lock); |
| 23 | switch(type) { | 23 | switch(type) { |
| 24 | case ACL_TYPE_ACCESS: | 24 | case ACL_TYPE_ACCESS: |
| 25 | acl = posix_acl_dup(SHMEM_I(inode)->i_acl); | 25 | acl = posix_acl_dup(inode->i_acl); |
| 26 | break; | 26 | break; |
| 27 | 27 | ||
| 28 | case ACL_TYPE_DEFAULT: | 28 | case ACL_TYPE_DEFAULT: |
| 29 | acl = posix_acl_dup(SHMEM_I(inode)->i_default_acl); | 29 | acl = posix_acl_dup(inode->i_default_acl); |
| 30 | break; | 30 | break; |
| 31 | } | 31 | } |
| 32 | spin_unlock(&inode->i_lock); | 32 | spin_unlock(&inode->i_lock); |
| @@ -45,13 +45,13 @@ shmem_set_acl(struct inode *inode, int type, struct posix_acl *acl) | |||
| 45 | spin_lock(&inode->i_lock); | 45 | spin_lock(&inode->i_lock); |
| 46 | switch(type) { | 46 | switch(type) { |
| 47 | case ACL_TYPE_ACCESS: | 47 | case ACL_TYPE_ACCESS: |
| 48 | free = SHMEM_I(inode)->i_acl; | 48 | free = inode->i_acl; |
| 49 | SHMEM_I(inode)->i_acl = posix_acl_dup(acl); | 49 | inode->i_acl = posix_acl_dup(acl); |
| 50 | break; | 50 | break; |
| 51 | 51 | ||
| 52 | case ACL_TYPE_DEFAULT: | 52 | case ACL_TYPE_DEFAULT: |
| 53 | free = SHMEM_I(inode)->i_default_acl; | 53 | free = inode->i_default_acl; |
| 54 | SHMEM_I(inode)->i_default_acl = posix_acl_dup(acl); | 54 | inode->i_default_acl = posix_acl_dup(acl); |
| 55 | break; | 55 | break; |
| 56 | } | 56 | } |
| 57 | spin_unlock(&inode->i_lock); | 57 | spin_unlock(&inode->i_lock); |
| @@ -155,23 +155,6 @@ shmem_acl_init(struct inode *inode, struct inode *dir) | |||
| 155 | } | 155 | } |
| 156 | 156 | ||
| 157 | /** | 157 | /** |
| 158 | * shmem_acl_destroy_inode - destroy acls hanging off the in-memory inode | ||
| 159 | * | ||
| 160 | * This is done before destroying the actual inode. | ||
| 161 | */ | ||
| 162 | |||
| 163 | void | ||
| 164 | shmem_acl_destroy_inode(struct inode *inode) | ||
| 165 | { | ||
| 166 | if (SHMEM_I(inode)->i_acl) | ||
| 167 | posix_acl_release(SHMEM_I(inode)->i_acl); | ||
| 168 | SHMEM_I(inode)->i_acl = NULL; | ||
| 169 | if (SHMEM_I(inode)->i_default_acl) | ||
| 170 | posix_acl_release(SHMEM_I(inode)->i_default_acl); | ||
| 171 | SHMEM_I(inode)->i_default_acl = NULL; | ||
| 172 | } | ||
| 173 | |||
| 174 | /** | ||
| 175 | * shmem_check_acl - check_acl() callback for generic_permission() | 158 | * shmem_check_acl - check_acl() callback for generic_permission() |
| 176 | */ | 159 | */ |
| 177 | static int | 160 | static int |
