Commit 936940a9 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: (23 commits)
  switch xfs to generic acl caching helpers
  helpers for acl caching + switch to those
  switch shmem to inode->i_acl
  switch reiserfs to inode->i_acl
  switch reiserfs to usual conventions for caching ACLs
  reiserfs: minimal fix for ACL caching
  switch nilfs2 to inode->i_acl
  switch btrfs to inode->i_acl
  switch jffs2 to inode->i_acl
  switch jfs to inode->i_acl
  switch ext4 to inode->i_acl
  switch ext3 to inode->i_acl
  switch ext2 to inode->i_acl
  add caching of ACLs in struct inode
  fs: Add new pre-allocation ioctls to vfs for compatibility with legacy xfs ioctls
  cleanup __writeback_single_inode
  ... and the same for vfsmount id/mount group id
  Make allocation of anon devices cheaper
  update Documentation/filesystems/Locking
  devpts: remove module-related code
  ...
parents 09ce42d3 1cbd20d8
...@@ -109,27 +109,28 @@ prototypes: ...@@ -109,27 +109,28 @@ prototypes:
locking rules: locking rules:
All may block. All may block.
BKL s_lock s_umount None have BKL
alloc_inode: no no no s_umount
destroy_inode: no alloc_inode:
dirty_inode: no (must not sleep) destroy_inode:
write_inode: no dirty_inode: (must not sleep)
drop_inode: no !!!inode_lock!!! write_inode:
delete_inode: no drop_inode: !!!inode_lock!!!
put_super: yes yes no delete_inode:
write_super: no yes read put_super: write
sync_fs: no no read write_super: read
freeze_fs: ? sync_fs: read
unfreeze_fs: ? freeze_fs: read
statfs: no no no unfreeze_fs: read
remount_fs: yes yes maybe (see below) statfs: no
clear_inode: no remount_fs: maybe (see below)
umount_begin: yes no no clear_inode:
show_options: no (vfsmount->sem) umount_begin: no
quota_read: no no no (see below) show_options: no (namespace_sem)
quota_write: no no no (see below) quota_read: no (see below)
quota_write: no (see below)
->remount_fs() will have the s_umount lock if it's already mounted.
->remount_fs() will have the s_umount exclusive lock if it's already mounted.
When called from get_sb_single, it does NOT have the s_umount lock. When called from get_sb_single, it does NOT have the s_umount lock.
->quota_read() and ->quota_write() functions are both guaranteed to ->quota_read() and ->quota_write() functions are both guaranteed to
be the only ones operating on the quota file by the quota code (via be the only ones operating on the quota file by the quota code (via
......
...@@ -29,51 +29,28 @@ ...@@ -29,51 +29,28 @@
#ifdef CONFIG_FS_POSIX_ACL #ifdef CONFIG_FS_POSIX_ACL
static void btrfs_update_cached_acl(struct inode *inode,
struct posix_acl **p_acl,
struct posix_acl *acl)
{
spin_lock(&inode->i_lock);
if (*p_acl && *p_acl != BTRFS_ACL_NOT_CACHED)
posix_acl_release(*p_acl);
*p_acl = posix_acl_dup(acl);
spin_unlock(&inode->i_lock);
}
static struct posix_acl *btrfs_get_acl(struct inode *inode, int type) static struct posix_acl *btrfs_get_acl(struct inode *inode, int type)
{ {
int size; int size;
const char *name; const char *name;
char *value = NULL; char *value = NULL;
struct posix_acl *acl = NULL, **p_acl; struct posix_acl *acl;
acl = get_cached_acl(inode, type);
if (acl != ACL_NOT_CACHED)
return acl;
switch (type) { switch (type) {
case ACL_TYPE_ACCESS: case ACL_TYPE_ACCESS:
name = POSIX_ACL_XATTR_ACCESS; name = POSIX_ACL_XATTR_ACCESS;
p_acl = &BTRFS_I(inode)->i_acl;
break; break;
case ACL_TYPE_DEFAULT: case ACL_TYPE_DEFAULT:
name = POSIX_ACL_XATTR_DEFAULT; name = POSIX_ACL_XATTR_DEFAULT;
p_acl = &BTRFS_I(inode)->i_default_acl;
break; break;
default: default:
return ERR_PTR(-EINVAL); BUG();
} }
/* Handle the cached NULL acl case without locking */
acl = ACCESS_ONCE(*p_acl);
if (!acl)
return acl;
spin_lock(&inode->i_lock);
acl = *p_acl;
if (acl != BTRFS_ACL_NOT_CACHED)
acl = posix_acl_dup(acl);
spin_unlock(&inode->i_lock);
if (acl != BTRFS_ACL_NOT_CACHED)
return acl;
size = __btrfs_getxattr(inode, name, "", 0); size = __btrfs_getxattr(inode, name, "", 0);
if (size > 0) { if (size > 0) {
value = kzalloc(size, GFP_NOFS); value = kzalloc(size, GFP_NOFS);
...@@ -82,13 +59,13 @@ static struct posix_acl *btrfs_get_acl(struct inode *inode, int type) ...@@ -82,13 +59,13 @@ static struct posix_acl *btrfs_get_acl(struct inode *inode, int type)
size = __btrfs_getxattr(inode, name, value, size); size = __btrfs_getxattr(inode, name, value, size);
if (size > 0) { if (size > 0) {
acl = posix_acl_from_xattr(value, size); acl = posix_acl_from_xattr(value, size);
btrfs_update_cached_acl(inode, p_acl, acl); set_cached_acl(inode, type, acl);
} }
kfree(value); kfree(value);
} else if (size == -ENOENT || size == -ENODATA || size == 0) { } else if (size == -ENOENT || size == -ENODATA || size == 0) {
/* FIXME, who returns -ENOENT? I think nobody */ /* FIXME, who returns -ENOENT? I think nobody */
acl = NULL; acl = NULL;
btrfs_update_cached_acl(inode, p_acl, acl); set_cached_acl(inode, type, acl);
} else { } else {
acl = ERR_PTR(-EIO); acl = ERR_PTR(-EIO);
} }
...@@ -121,7 +98,6 @@ static int btrfs_set_acl(struct inode *inode, struct posix_acl *acl, int type) ...@@ -121,7 +98,6 @@ static int btrfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
{ {
int ret, size = 0; int ret, size = 0;
const char *name; const char *name;
struct posix_acl **p_acl;
char *value = NULL; char *value = NULL;
mode_t mode; mode_t mode;
...@@ -141,13 +117,11 @@ static int btrfs_set_acl(struct inode *inode, struct posix_acl *acl, int type) ...@@ -141,13 +117,11 @@ static int btrfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
ret = 0; ret = 0;
inode->i_mode = mode; inode->i_mode = mode;
name = POSIX_ACL_XATTR_ACCESS; name = POSIX_ACL_XATTR_ACCESS;
p_acl = &BTRFS_I(inode)->i_acl;
break; break;
case ACL_TYPE_DEFAULT: case ACL_TYPE_DEFAULT:
if (!S_ISDIR(inode->i_mode)) if (!S_ISDIR(inode->i_mode))
return acl ? -EINVAL : 0; return acl ? -EINVAL : 0;
name = POSIX_ACL_XATTR_DEFAULT; name = POSIX_ACL_XATTR_DEFAULT;
p_acl = &BTRFS_I(inode)->i_default_acl;
break; break;
default: default:
return -EINVAL; return -EINVAL;
...@@ -172,7 +146,7 @@ static int btrfs_set_acl(struct inode *inode, struct posix_acl *acl, int type) ...@@ -172,7 +146,7 @@ static int btrfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
kfree(value); kfree(value);
if (!ret) if (!ret)
btrfs_update_cached_acl(inode, p_acl, acl); set_cached_acl(inode, type, acl);
return ret; return ret;
} }
......
...@@ -53,10 +53,6 @@ struct btrfs_inode { ...@@ -53,10 +53,6 @@ struct btrfs_inode {
/* used to order data wrt metadata */ /* used to order data wrt metadata */
struct btrfs_ordered_inode_tree ordered_tree; struct btrfs_ordered_inode_tree ordered_tree;
/* standard acl pointers */
struct posix_acl *i_acl;
struct posix_acl *i_default_acl;
/* for keeping track of orphaned inodes */ /* for keeping track of orphaned inodes */
struct list_head i_orphan; struct list_head i_orphan;
......
...@@ -41,8 +41,6 @@ struct btrfs_ordered_sum; ...@@ -41,8 +41,6 @@ struct btrfs_ordered_sum;
#define BTRFS_MAGIC "_BHRfS_M" #define BTRFS_MAGIC "_BHRfS_M"
#define BTRFS_ACL_NOT_CACHED ((void *)-1)
#define BTRFS_MAX_LEVEL 8 #define BTRFS_MAX_LEVEL 8
#define BTRFS_COMPAT_EXTENT_TREE_V0 #define BTRFS_COMPAT_EXTENT_TREE_V0
......
...@@ -2123,8 +2123,8 @@ static void btrfs_read_locked_inode(struct inode *inode) ...@@ -2123,8 +2123,8 @@ static void btrfs_read_locked_inode(struct inode *inode)
*/ */
maybe_acls = acls_after_inode_item(leaf, path->slots[0], inode->i_ino); maybe_acls = acls_after_inode_item(leaf, path->slots[0], inode->i_ino);
if (!maybe_acls) { if (!maybe_acls) {
BTRFS_I(inode)->i_acl = NULL; inode->i_acl = NULL;
BTRFS_I(inode)->i_default_acl = NULL; inode->i_default_acl = NULL;
} }
BTRFS_I(inode)->block_group = btrfs_find_block_group(root, 0, 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,9 +3141,6 @@ static noinline void init_btrfs_i(struct inode *inode)
{ {
struct btrfs_inode *bi = BTRFS_I(inode); struct btrfs_inode *bi = BTRFS_I(inode);
bi->i_acl = BTRFS_ACL_NOT_CACHED;
bi->i_default_acl = BTRFS_ACL_NOT_CACHED;
bi->generation = 0; bi->generation = 0;
bi->sequence = 0; bi->sequence = 0;
bi->last_trans = 0; bi->last_trans = 0;
...@@ -4640,8 +4637,6 @@ struct inode *btrfs_alloc_inode(struct super_block *sb) ...@@ -4640,8 +4637,6 @@ struct inode *btrfs_alloc_inode(struct super_block *sb)
ei->last_trans = 0; ei->last_trans = 0;
ei->logged_trans = 0; ei->logged_trans = 0;
btrfs_ordered_inode_tree_init(&ei->ordered_tree); btrfs_ordered_inode_tree_init(&ei->ordered_tree);
ei->i_acl = BTRFS_ACL_NOT_CACHED;
ei->i_default_acl = BTRFS_ACL_NOT_CACHED;
INIT_LIST_HEAD(&ei->i_orphan); INIT_LIST_HEAD(&ei->i_orphan);
INIT_LIST_HEAD(&ei->ordered_operations); INIT_LIST_HEAD(&ei->ordered_operations);
return &ei->vfs_inode; return &ei->vfs_inode;
...@@ -4655,13 +4650,6 @@ void btrfs_destroy_inode(struct inode *inode) ...@@ -4655,13 +4650,6 @@ void btrfs_destroy_inode(struct inode *inode)
WARN_ON(!list_empty(&inode->i_dentry)); WARN_ON(!list_empty(&inode->i_dentry));
WARN_ON(inode->i_data.nrpages); WARN_ON(inode->i_data.nrpages);
if (BTRFS_I(inode)->i_acl &&
BTRFS_I(inode)->i_acl != BTRFS_ACL_NOT_CACHED)
posix_acl_release(BTRFS_I(inode)->i_acl);
if (BTRFS_I(inode)->i_default_acl &&
BTRFS_I(inode)->i_default_acl != BTRFS_ACL_NOT_CACHED)
posix_acl_release(BTRFS_I(inode)->i_default_acl);
/* /*
* Make sure we're properly removed from the ordered operation * Make sure we're properly removed from the ordered operation
* lists. * lists.
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/netlink.h> #include <linux/netlink.h>
#include <linux/vt.h> #include <linux/vt.h>
#include <linux/falloc.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/file.h> #include <linux/file.h>
#include <linux/ppp_defs.h> #include <linux/ppp_defs.h>
...@@ -1779,6 +1780,41 @@ lp_timeout_trans(unsigned int fd, unsigned int cmd, unsigned long arg) ...@@ -1779,6 +1780,41 @@ lp_timeout_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
return sys_ioctl(fd, cmd, (unsigned long)tn); return sys_ioctl(fd, cmd, (unsigned long)tn);
} }
/* on ia32 l_start is on a 32-bit boundary */
#if defined(CONFIG_IA64) || defined(CONFIG_X86_64)
struct space_resv_32 {
__s16 l_type;
__s16 l_whence;
__s64 l_start __attribute__((packed));
/* len == 0 means until end of file */
__s64 l_len __attribute__((packed));
__s32 l_sysid;
__u32 l_pid;
__s32 l_pad[4]; /* reserve area */
};
#define FS_IOC_RESVSP_32 _IOW ('X', 40, struct space_resv_32)
#define FS_IOC_RESVSP64_32 _IOW ('X', 42, struct space_resv_32)
/* just account for different alignment */
static int compat_ioctl_preallocate(struct file *file, unsigned long arg)
{
struct space_resv_32 __user *p32 = (void __user *)arg;
struct space_resv __user *p = compat_alloc_user_space(sizeof(*p));
if (copy_in_user(&p->l_type, &p32->l_type, sizeof(s16)) ||
copy_in_user(&p->l_whence, &p32->l_whence, sizeof(s16)) ||
copy_in_user(&p->l_start, &p32->l_start, sizeof(s64)) ||
copy_in_user(&p->l_len, &p32->l_len, sizeof(s64)) ||
copy_in_user(&p->l_sysid, &p32->l_sysid, sizeof(s32)) ||
copy_in_user(&p->l_pid, &p32->l_pid, sizeof(u32)) ||
copy_in_user(&p->l_pad, &p32->l_pad, 4*sizeof(u32)))
return -EFAULT;
return ioctl_preallocate(file, p);
}
#endif
typedef int (*ioctl_trans_handler_t)(unsigned int, unsigned int, typedef int (*ioctl_trans_handler_t)(unsigned int, unsigned int,
unsigned long, struct file *); unsigned long, struct file *);
...@@ -2756,6 +2792,18 @@ asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd, ...@@ -2756,6 +2792,18 @@ asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd,
case FIOQSIZE: case FIOQSIZE:
break; break;
#if defined(CONFIG_IA64) || defined(CONFIG_X86_64)
case FS_IOC_RESVSP_32:
case FS_IOC_RESVSP64_32:
error = compat_ioctl_preallocate(filp, arg);
goto out_fput;
#else
case FS_IOC_RESVSP:
case FS_IOC_RESVSP64:
error = ioctl_preallocate(filp, (void __user *)arg);
goto out_fput;
#endif
case FIBMAP: case FIBMAP:
case FIGETBSZ: case FIGETBSZ:
case FIONREAD: case FIONREAD:
......
...@@ -423,7 +423,6 @@ static void devpts_kill_sb(struct super_block *sb) ...@@ -423,7 +423,6 @@ static void devpts_kill_sb(struct super_block *sb)
} }
static struct file_system_type devpts_fs_type = { static struct file_system_type devpts_fs_type = {
.owner = THIS_MODULE,
.name = "devpts", .name = "devpts",
.get_sb = devpts_get_sb, .get_sb = devpts_get_sb,
.kill_sb = devpts_kill_sb, .kill_sb = devpts_kill_sb,
...@@ -564,13 +563,4 @@ static int __init init_devpts_fs(void) ...@@ -564,13 +563,4 @@ static int __init init_devpts_fs(void)
} }
return err; return err;
} }
static void __exit exit_devpts_fs(void)
{
unregister_filesystem(&devpts_fs_type);
mntput(devpts_mnt);
}
module_init(init_devpts_fs) module_init(init_devpts_fs)
module_exit(exit_devpts_fs)
MODULE_LICENSE("GPL");
...@@ -125,37 +125,12 @@ ext2_acl_to_disk(const struct posix_acl *acl, size_t *size) ...@@ -125,37 +125,12 @@ ext2_acl_to_disk(const struct posix_acl *acl, size_t *size)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
} }
static inline struct posix_acl *
ext2_iget_acl(struct inode *inode, struct posix_acl **i_acl)
{
struct posix_acl *acl = EXT2_ACL_NOT_CACHED;
spin_lock(&inode->i_lock);
if (*i_acl != EXT2_ACL_NOT_CACHED)
acl = posix_acl_dup(*i_acl);
spin_unlock(&inode->i_lock);
return acl;
}
static inline void
ext2_iset_acl(struct inode *inode, struct posix_acl **i_acl,
struct posix_acl *acl)
{
spin_lock(&inode->i_lock);
if (*i_acl != EXT2_ACL_NOT_CACHED)
posix_acl_release(*i_acl);
*i_acl = posix_acl_dup(acl);
spin_unlock(&inode->i_lock);
}
/* /*
* inode->i_mutex: don't care * inode->i_mutex: don't care
*/ */
static struct posix_acl * static struct posix_acl *
ext2_get_acl(struct inode *inode, int type) ext2_get_acl(struct inode *inode, int type)
{ {
struct ext2_inode_info *ei = EXT2_I(inode);
int name_index; int name_index;
char *value = NULL; char *value = NULL;
struct posix_acl *acl; struct posix_acl *acl;
...@@ -164,23 +139,19 @@ ext2_get_acl(struct inode *inode, int type) ...@@ -164,23 +139,19 @@ ext2_get_acl(struct inode *inode, int type)
if (!test_opt(inode->i_sb, POSIX_ACL)) if (!test_opt(inode->i_sb, POSIX_ACL))
return NULL; return NULL;
switch(type) { acl = get_cached_acl(inode, type);
case ACL_TYPE_ACCESS: if (acl != ACL_NOT_CACHED)
acl = ext2_iget_acl(inode, &ei->i_acl); return acl;
if (acl != EXT2_ACL_NOT_CACHED)
return acl; switch (type) {
name_index = EXT2_XATTR_INDEX_POSIX_ACL_ACCESS; case ACL_TYPE_ACCESS:
break; name_index = EXT2_XATTR_INDEX_POSIX_ACL_ACCESS;
break;
case ACL_TYPE_DEFAULT: case ACL_TYPE_DEFAULT:
acl = ext2_iget_acl(inode, &ei->i_default_acl); name_index = EXT2_XATTR_INDEX_POSIX_ACL_DEFAULT;
if (acl != EXT2_ACL_NOT_CACHED) break;
return acl; default:
name_index = EXT2_XATTR_INDEX_POSIX_ACL_DEFAULT; BUG();
break;
default:
return ERR_PTR(-EINVAL);
} }
retval = ext2_xattr_get(inode, name_index, "", NULL, 0); retval = ext2_xattr_get(inode, name_index, "", NULL, 0);
if (retval > 0) { if (retval > 0) {
...@@ -197,17 +168,9 @@ ext2_get_acl(struct inode *inode, int type) ...@@ -197,17 +168,9 @@ ext2_get_acl(struct inode *inode, int type)
acl = ERR_PTR(retval); acl = ERR_PTR(retval);
kfree(value); kfree(value);
if (!IS_ERR(acl)) { if (!IS_ERR(acl))
switch(type) { set_cached_acl(inode, type, acl);
case ACL_TYPE_ACCESS:
ext2_iset_acl(inode, &ei->i_acl, acl);
break;
case ACL_TYPE_DEFAULT:
ext2_iset_acl(inode, &ei->i_default_acl, acl);
break;
}
}
return acl; return acl;
} }
...@@ -217,7 +180,6 @@ ext2_get_acl(struct inode *inode, int type) ...@@ -217,7 +180,6 @@ ext2_get_acl(struct inode *inode, int type)
static int static int
ext2_set_acl(struct inode *inode, int type, struct posix_acl *acl) ext2_set_acl(struct inode *inode, int type, struct posix_acl *acl)
{ {
struct ext2_inode_info *ei = EXT2_I(inode);
int name_index; int name_index;
void *value = NULL; void *value = NULL;
size_t size = 0; size_t size = 0;
...@@ -263,17 +225,8 @@ ext2_set_acl(struct inode *inode, int type, struct posix_acl *acl) ...@@ -263,17 +225,8 @@ ext2_set_acl(struct inode *inode, int type, struct posix_acl *acl)
error = ext2_xattr_set(inode, name_index, "", value, size, 0); error = ext2_xattr_set(inode, name_index, "", value, size, 0);
kfree(value); kfree(value);
if (!error) { if (!error)
switch(type) { set_cached_acl(inode, type, acl);
case ACL_TYPE_ACCESS:
ext2_iset_acl(inode, &ei->i_acl, acl);
break;
case ACL_TYPE_DEFAULT:
ext2_iset_acl(inode, &ei->i_default_acl, acl);
break;
}
}
return error; return error;
} }
......
...@@ -53,10 +53,6 @@ static inline int ext2_acl_count(size_t size) ...@@ -53,10 +53,6 @@ static inline int ext2_acl_count(size_t size)
#ifdef CONFIG_EXT2_FS_POSIX_ACL #ifdef CONFIG_EXT2_FS_POSIX_ACL
/* Value for inode->u.ext2_i.i_acl and inode->u.ext2_i.i_default_acl
if the ACL has not been cached */
#define EXT2_ACL_NOT_CACHED ((void *)-1)
/* acl.c */ /* acl.c */
extern int ext2_permission (struct inode *, int); extern int ext2_permission (struct inode *, int);
extern int ext2_acl_chmod (struct inode *); extern int ext2_acl_chmod (struct inode *);
......
...@@ -46,10 +46,6 @@ struct ext2_inode_info { ...@@ -46,10 +46,6 @@ struct ext2_inode_info {
* EAs. * EAs.
*/ */
struct rw_semaphore xattr_sem; struct rw_semaphore xattr_sem;
#endif
#ifdef CONFIG_EXT2_FS_POSIX_ACL
struct posix_acl *i_acl;
struct posix_acl *i_default_acl;
#endif #endif
rwlock_t i_meta_lock; rwlock_t i_meta_lock;
......
...@@ -1224,10 +1224,6 @@ struct inode *ext2_iget (struct super_block *sb, unsigned long ino) ...@@ -1224,10 +1224,6 @@ struct inode *ext2_iget (struct super_block *sb, unsigned long ino)
return inode; return inode;
ei = EXT2_I(inode); ei = EXT2_I(inode);
#ifdef CONFIG_EXT2_FS_POSIX_ACL
ei->i_acl = EXT2_ACL_NOT_CACHED;
ei->i_default_acl = EXT2_ACL_NOT_CACHED;
#endif
ei->i_block_alloc_info = NULL; ei->i_block_alloc_info = NULL;
raw_inode = ext2_get_inode(inode->i_sb, ino, &bh); raw_inode = ext2_get_inode(inode->i_sb, ino, &bh);
......
...@@ -152,10 +152,6 @@ static struct inode *ext2_alloc_inode(struct super_block *sb) ...@@ -152,10 +152,6 @@ static struct inode *ext2_alloc_inode(struct super_block *sb)
ei = (struct ext2_inode_info *)kmem_cache_alloc(ext2_inode_cachep, GFP_KERNEL); ei = (struct ext2_inode_info *)kmem_cache_alloc(ext2_inode_cachep, GFP_KERNEL);
if (!ei) if (!ei)
return NULL; return NULL;
#ifdef CONFIG_EXT2_FS_POSIX_ACL
ei->i_acl = EXT2_ACL_NOT_CACHED;
ei->i_default_acl = EXT2_ACL_NOT_CACHED;
#endif
ei->i_block_alloc_info = NULL; ei->i_block_alloc_info = NULL;
ei->vfs_inode.i_version = 1; ei->vfs_inode.i_version = 1;
return &ei->vfs_inode; return &ei->vfs_inode;
...@@ -198,18 +194,6 @@ static void destroy_inodecache(void) ...@@ -198,18 +194,6 @@ static void destroy_inodecache(void)
static void ext2_clear_inode(struct inode *inode) static void ext2_clear_inode(struct inode *inode)
{ {
struct ext2_block_alloc_info *rsv = EXT2_I(inode)->i_block_alloc_info; struct ext2_block_alloc_info *rsv = EXT2_I(inode)->i_block_alloc_info;
#ifdef CONFIG_EXT2_FS_POSIX_ACL
struct ext2_inode_info *ei = EXT2_I(inode);
if (ei->i_acl && ei->i_acl != EXT2_ACL_NOT_CACHED) {
posix_acl_release(ei->i_acl);
ei->i_acl = EXT2_ACL_NOT_CACHED;
}
if (ei->i_default_acl && ei->i_default_acl != EXT2_ACL_NOT_CACHED) {
posix_acl_release(ei->i_default_acl);
ei->i_default_acl = EXT2_ACL_NOT_CACHED;
}
#endif
ext2_discard_reservation(inode); ext2_discard_reservation(inode);
EXT2_I(inode)->i_block_alloc_info = NULL; EXT2_I(inode)->i_block_alloc_info = NULL;
if (unlikely(rsv)) if (unlikely(rsv))
......
...@@ -126,33 +126,6 @@ ext3_acl_to_disk(const struct posix_acl *acl, size_t *size) ...@@ -126,33 +126,6 @@ ext3_acl_to_disk(const struct posix_acl *acl, size_t *size)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
} }
static inline struct posix_acl *
ext3_iget_acl(struct inode *inode, struct posix_acl **i_acl)
{
struct posix_acl *acl = ACCESS_ONCE(*i_acl);
if (acl) {
spin_lock(&inode->i_lock);
acl = *i_acl;
if (acl != EXT3_ACL_NOT_CACHED)
acl = posix_acl_dup(acl);
spin_unlock(&inode->i_lock);
}
return acl;
}
static inline void
ext3_iset_acl(struct inode *inode, struct posix_acl **i_acl,
struct posix_acl *acl)
{
spin_lock(&inode->i_lock);
if (*i_acl != EXT3_ACL_NOT_CACHED)
posix_acl_release(*i_acl);
*i_acl = posix_acl_dup(acl);
spin_unlock(&inode->i_lock);
}
/* /*
* Inode operation get_posix_acl(). * Inode operation get_posix_acl().
* *
...@@ -161,7 +134,6 @@ ext3_iset_acl(struct inode *inode, struct posix_acl **i_acl, ...@@ -161,7 +134,6 @@ ext3_iset_acl(struct inode *inode, struct posix_acl **i_acl,
static struct posix_acl * static struct posix_acl *
ext3_get_acl(struct inode *inode, int type) ext3_get_acl(struct inode *inode, int type)
{ {
struct ext3_inode_info *ei = EXT3_I(inode);
int name_index; int name_index;
char *value = NULL; char *value = NULL;
struct posix_acl *acl; struct posix_acl *acl;
...@@ -170,24 +142,21 @@ ext3_get_acl(struct inode *inode, int type) ...@@ -170,24 +142,21 @@ ext3_get_acl(struct inode *inode, int type)
if (!test_opt(inode->i_sb, POSIX_ACL)) if (!test_opt(inode->i_sb, POSIX_ACL))
return NULL; return NULL;
switch(type) { acl = get_cached_acl(inode, type);
case ACL_TYPE_ACCESS: if (acl != ACL_NOT_CACHED)
acl = ext3_iget_acl(inode, &ei->i_acl); return acl;
if (acl != EXT3_ACL_NOT_CACHED)
return acl; switch (type) {
name_index = EXT3_XATTR_INDEX_POSIX_ACL_ACCESS; case ACL_TYPE_ACCESS:
break; name_index = EXT3_XATTR_INDEX_POSIX_ACL_ACCESS;
break;
case ACL_TYPE_DEFAULT: case ACL_TYPE_DEFAULT:
acl = ext3_iget_acl(inode, &ei->i_default_acl); name_index = EXT3_XATTR_INDEX_POSIX_ACL_DEFAULT;
if (acl != EXT3_ACL_NOT_CACHED) break;
return acl; default:
name_index = EXT3_XATTR_INDEX_POSIX_ACL_DEFAULT; BUG();
break;
default:
return ERR_PTR(-EINVAL);
} }
retval = ext3_xattr_get(inode, name_index, "", NULL, 0); retval = ext3_xattr_get(inode, name_index, "", NULL, 0);
if (retval > 0) { if (retval > 0) {
value = kmalloc(retval, GFP_NOFS); value = kmalloc(retval, GFP_NOFS);
...@@ -203,17 +172,9 @@ ext3_get_acl(struct inode *inode, int type) ...@@ -203,17 +172,9 @@ ext3_get_acl(struct inode *inode, int type)
acl = ERR_PTR(retval); acl = ERR_PTR(retval);
kfree(value); kfree(value);
if (!IS_ERR(acl)) { if (!IS_ERR(acl))
switch(type) { set_cached_acl(inode, type, acl);
case ACL_TYPE_ACCESS:
ext3_iset_acl(inode, &ei->i_acl, acl);
break;
case ACL_TYPE_DEFAULT:
ext3_iset_acl(inode, &ei->i_default_acl, acl);
break;
}
}
return acl; return acl;
} }
...@@ -226,7 +187,6 @@ static int ...@@ -226,7 +187,6 @@ static int
ext3_set_acl(handle_t *handle, struct inode *inode, int type, ext3_set_acl(handle_t *handle, struct inode *inode, int type,
struct posix_acl *acl) struct posix_acl *acl)
{ {
struct ext3_inode_info *ei = EXT3_I(inode);
int name_index; int name_index;
void *value = NULL; void *value = NULL;
size_t size = 0; size_t size = 0;
...@@ -271,17 +231,10 @@ ext3_set_acl(handle_t *handle, struct inode *inode, int type, ...@@ -271,17 +231,10 @@ ext3_set_acl(handle_t *handle, struct inode *inode, int type,
value, size, 0); value, size, 0);
kfree(value); kfree(value);
if (!error) {
switch(type) {
case ACL_TYPE_ACCESS:
ext3_iset_acl(inode, &ei->i_acl, acl);
break;
case ACL_TYPE_DEFAULT: if (!error)
ext3_iset_acl(inode, &ei->i_default_acl, acl); set_cached_acl(inode, type, acl);
break;
}
}
return error; return error;
} }
......
...@@ -53,10 +53,6 @@ static inline int ext3_acl_count(size_t size) ...@@ -53,10 +53,6 @@ static inline int ext3_acl_count(size_t size)
#ifdef CONFIG_EXT3_FS_POSIX_ACL #ifdef CONFIG_EXT3_FS_POSIX_ACL
/* Value for inode->u.ext3_i.i_acl and inode->u.ext3_i.i_default_acl
if the ACL has not been cached */
#define EXT3_ACL_NOT_CACHED ((void *)-1)
/* acl.c */ /* acl.c */
extern int ext3_permission (struct inode *, int); extern int ext3_permission (struct inode *, int);
extern int ext3_acl_chmod (struct inode *); extern int ext3_acl_chmod (struct inode *);
......
...@@ -2752,10 +2752,6 @@ struct inode *ext3_iget(struct super_block *sb, unsigned long ino) ...@@ -2752,10 +2752,6 @@ struct inode *ext3_iget(struct super_block *sb, unsigned long ino)
return inode; return inode;
ei = EXT3_I(inode); ei = EXT3_I(inode);
#ifdef CONFIG_EXT3_FS_POSIX_ACL
ei->i_acl = EXT3_ACL_NOT_CACHED;
ei->i_default_acl = EXT3_ACL_NOT_CACHED;
#endif
ei->i_block_alloc_info = NULL; ei->i_block_alloc_info = NULL;
ret = __ext3_get_inode_loc(inode, &iloc, 0); ret = __ext3_get_inode_loc(inode, &iloc, 0);
......
...@@ -464,10 +464,6 @@ static struct inode *ext3_alloc_inode(struct super_block *sb) ...@@ -464,10 +464,6 @@ static struct inode *ext3_alloc_inode(struct super_block *sb)
ei = kmem_cache_alloc(ext3_inode_cachep, GFP_NOFS); ei = kmem_cache_alloc(ext3_inode_cachep, GFP_NOFS);
if (!ei) if (!ei)
return NULL; return NULL;
#ifdef CONFIG_EXT3_FS_POSIX_ACL
ei->i_acl = EXT3_ACL_NOT_CACHED;
ei->i_default_acl = EXT3_ACL_NOT_CACHED;
#endif
ei->i_block_alloc_info = NULL; ei->i_block_alloc_info = NULL;
ei->vfs_inode.i_version = 1; ei->vfs_inode.i_version = 1;
return &ei->vfs_inode; return &ei->vfs_inode;
...@@ -518,18 +514,6 @@ static void destroy_inodecache(void) ...@@ -518,18 +514,6 @@ static void destroy_inodecache(void)
static void ext3_clear_inode(struct inode *inode) static void ext3_clear_inode(struct inode *inode)
{ {
struct ext3_block_alloc_info *rsv = EXT3_I(inode)->i_block_alloc_info; struct ext3_block_alloc_info *rsv = EXT3_I(inode)->i_block_alloc_info;
#ifdef CONFIG_EXT3_FS_POSIX_ACL
if (EXT3_I(inode)->i_acl &&
EXT3_I(inode)->i_acl != EXT3_ACL_NOT_CACHED) {
posix_acl_release(EXT3_I(inode)->i_acl);
EXT3_I(inode)->i_acl = EXT3_ACL_NOT_CACHED;
}
if (EXT3_I(inode)->i_default_acl &&
EXT3_I(inode)->i_default_acl != EXT3_ACL_NOT_CACHED) {
posix_acl_release(EXT3_I(inode)->i_default_acl);
EXT3_I(inode)->i_default_acl = EXT3_ACL_NOT_CACHED;
}
#endif
ext3_discard_reservation(inode); ext3_discard_reservation(inode);
EXT3_I(inode)->i_block_alloc_info = NULL; EXT3_I(inode)->i_block_alloc_info = NULL;
if (unlikely(rsv)) if (unlikely(rsv))
......
...@@ -126,33 +126,6 @@ ext4_acl_to_disk(const struct posix_acl *acl, size_t *size) ...@@ -126,33 +126,6 @@ ext4_acl_to_disk(const struct posix_acl *acl, size_t *size)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
} }
static inline struct posix_acl *
ext4_iget_acl(struct inode *inode, struct posix_acl **i_acl)
{
struct posix_acl *acl = ACCESS_ONCE(*i_acl);
if (acl) {
spin_lock(&inode->i_lock);
acl = *i_acl;
if (acl != EXT4_ACL_NOT_CACHED)
acl = posix_acl_dup(acl);
spin_unlock(&inode->i_lock);
}
return acl;
}
static inline void
ext4_iset_acl(struct inode *inode, struct posix_acl **i_acl,
struct posix_acl *acl)
{
spin_lock(&inode->i_lock);
if (*i_acl != EXT4_ACL_NOT_CACHED)
posix_acl_release(*i_acl);
*i_acl = posix_acl_dup(acl);
spin_unlock(&inode->i_lock);
}
/* /*
* Inode operation get_posix_acl(). * Inode operation get_posix_acl().
* *
...@@ -161,7 +134,6 @@ ext4_iset_acl(struct inode *inode, struct posix_acl **i_acl, ...@@ -161,7 +134,6 @@ ext4_iset_acl(struct inode *inode, struct posix_acl **i_acl,
static struct posix_acl * static struct posix_acl *
ext4_get_acl(struct inode *inode, int type) ext4_get_acl(struct inode *inode, int type)
{ {
struct ext4_inode_info *ei = EXT4_I(inode);
int name_index; int name_index;
char *value = NULL; char *value = NULL;
struct posix_acl *acl; struct posix_acl *acl;
...@@ -170,23 +142,19 @@ ext4_get_acl(struct inode *inode, int type) ...@@ -170,23 +142,19 @@ ext4_get_acl(struct inode *inode, int type)
if (!test_opt(inode->i_sb, POSIX_ACL)) if (!test_opt(inode->i_sb, POSIX_ACL))
return NULL; return NULL;
acl = get_cached_acl(inode, type);
if (acl != ACL_NOT_CACHED)
return acl;
switch (type) { switch (type) {
case ACL_TYPE_ACCESS: case ACL_TYPE_ACCESS:
acl = ext4_iget_acl(inode, &ei->i_acl);
if (acl != EXT4_ACL_NOT_CACHED)
return acl;
name_index = EXT4_XATTR_INDEX_POSIX_ACL_ACCESS; name_index = EXT4_XATTR_INDEX_POSIX_ACL_ACCESS;
break; break;
case ACL_TYPE_DEFAULT: case ACL_TYPE_DEFAULT:
acl = ext4_iget_acl(inode, &ei->i_default_acl);
if (acl != EXT4_ACL_NOT_CACHED)
return acl;
name_index = EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT; name_index = EXT4_XATTR_INDEX_POSIX_ACL_DEFAULT;
break; break;
default: default:
return ERR_PTR(-EINVAL); BUG();
} }
retval = ext4_xattr_get(inode, name_index, "", NULL, 0); retval = ext4_xattr_get(inode, name_index, "", NULL, 0);
if (retval > 0) { if (retval > 0) {
...@@ -203,17 +171,9 @@ ext4_get_acl(struct inode *inode, int type) ...@@ -203,17 +171,9 @@ ext4_get_acl(struct inode *inode, int type)
acl = ERR_PTR(retval); acl = ERR_PTR(retval);
kfree(value); kfree(value);
if (!IS_ERR(acl)) { if (!IS_ERR(acl))
switch (type) { set_cached_acl(inode, type, acl);
case ACL_TYPE_ACCESS:
ext4_iset_acl(inode, &ei->i_acl, acl);
break;
case ACL_TYPE_DEFAULT:
ext4_iset_acl(inode, &ei->i_default_acl, acl);
break;
}
}
return acl; return acl;
} }
...@@ -226,7 +186,6 @@ static int ...@@ -226,7 +186,6 @@ static int
ext4_set_acl(handle_t *handle, struct inode *inode, int type, ext4_set_acl(handle_t *handle, struct inode *inode, int type,
struct posix_acl *acl) struct posix_acl *acl)
{ {
struct ext4_inode_info *ei = EXT4_I(inode);
int name_index; int name_index;
void *value = NULL; void *value = NULL;
size_t size = 0; size_t size = 0;
...@@ -271,17 +230,9 @@ ext4_set_acl(handle_t *handle, struct inode *inode, int type, ...@@ -271,17 +230,9 @@ ext4_set_acl(handle_t *handle, struct inode *inode, int type,
value, size, 0); value, size, 0);
kfree(value); kfree(value);
if (!error) { if (!error)
switch (type) { set_cached_acl(inode, type, acl);
case ACL_TYPE_ACCESS:
ext4_iset_acl(inode, &ei->i_acl, acl);
break;
case ACL_TYPE_DEFAULT:
ext4_iset_acl(inode, &ei->i_default_acl, acl);
break;
}
}
return error; return error;
} }
......
...@@ -53,10 +53,6 @@ static inline int ext4_acl_count(size_t size) ...@@ -53,10 +53,6 @@ static inline int ext4_acl_count(size_t size)
#ifdef CONFIG_EXT4_FS_POSIX_ACL #ifdef CONFIG_EXT4_FS_POSIX_ACL
/* Value for inode->u.ext4_i.i_acl and inode->u.ext4_i.i_default_acl
if the ACL has not been cached */
#define EXT4_ACL_NOT_CACHED ((void *)-1)
/* acl.c */ /* acl.c */
extern int ext4_permission(struct inode *, int); extern int ext4_permission(struct inode *, int);
extern int ext4_acl_chmod(struct inode *); extern int ext4_acl_chmod(struct inode *);
......
...@@ -595,10 +595,6 @@ struct ext4_inode_info { ...@@ -595,10 +595,6 @@ struct ext4_inode_info {
*/ */
struct rw_semaphore xattr_sem; struct rw_semaphore xattr_sem;
#endif #endif
#ifdef CONFIG_EXT4_FS_POSIX_ACL
struct posix_acl *i_acl;
struct posix_acl *i_default_acl;
#endif
struct list_head i_orphan; /* unlinked but open inodes */ struct list_head i_orphan; /* unlinked but open inodes */
......
...@@ -4453,10 +4453,6 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) ...@@ -4453,10 +4453,6 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino)
return inode; return inode;
ei = EXT4_I(inode); ei = EXT4_I(inode);
#ifdef CONFIG_EXT4_FS_POSIX_ACL
ei->i_acl = EXT4_ACL_NOT_CACHED;
ei->i_default_acl = EXT4_ACL_NOT_CACHED;
#endif
ret = __ext4_get_inode_loc(inode, &iloc, 0); ret = __ext4_get_inode_loc(inode, &iloc, 0);
if (ret < 0) if (ret < 0)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment