You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
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 ...
This commit is contained in:
@@ -109,27 +109,28 @@ prototypes:
|
||||
|
||||
locking rules:
|
||||
All may block.
|
||||
BKL s_lock s_umount
|
||||
alloc_inode: no no no
|
||||
destroy_inode: no
|
||||
dirty_inode: no (must not sleep)
|
||||
write_inode: no
|
||||
drop_inode: no !!!inode_lock!!!
|
||||
delete_inode: no
|
||||
put_super: yes yes no
|
||||
write_super: no yes read
|
||||
sync_fs: no no read
|
||||
freeze_fs: ?
|
||||
unfreeze_fs: ?
|
||||
statfs: no no no
|
||||
remount_fs: yes yes maybe (see below)
|
||||
clear_inode: no
|
||||
umount_begin: yes no no
|
||||
show_options: no (vfsmount->sem)
|
||||
quota_read: no no no (see below)
|
||||
quota_write: no no no (see below)
|
||||
None have BKL
|
||||
s_umount
|
||||
alloc_inode:
|
||||
destroy_inode:
|
||||
dirty_inode: (must not sleep)
|
||||
write_inode:
|
||||
drop_inode: !!!inode_lock!!!
|
||||
delete_inode:
|
||||
put_super: write
|
||||
write_super: read
|
||||
sync_fs: read
|
||||
freeze_fs: read
|
||||
unfreeze_fs: read
|
||||
statfs: no
|
||||
remount_fs: maybe (see below)
|
||||
clear_inode:
|
||||
umount_begin: no
|
||||
show_options: no (namespace_sem)
|
||||
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.
|
||||
->quota_read() and ->quota_write() functions are both guaranteed to
|
||||
be the only ones operating on the quota file by the quota code (via
|
||||
|
||||
+9
-35
@@ -29,51 +29,28 @@
|
||||
|
||||
#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)
|
||||
{
|
||||
int size;
|
||||
const char *name;
|
||||
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) {
|
||||
case ACL_TYPE_ACCESS:
|
||||
name = POSIX_ACL_XATTR_ACCESS;
|
||||
p_acl = &BTRFS_I(inode)->i_acl;
|
||||
break;
|
||||
case ACL_TYPE_DEFAULT:
|
||||
name = POSIX_ACL_XATTR_DEFAULT;
|
||||
p_acl = &BTRFS_I(inode)->i_default_acl;
|
||||
break;
|
||||
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);
|
||||
if (size > 0) {
|
||||
value = kzalloc(size, GFP_NOFS);
|
||||
@@ -82,13 +59,13 @@ static struct posix_acl *btrfs_get_acl(struct inode *inode, int type)
|
||||
size = __btrfs_getxattr(inode, name, value, size);
|
||||
if (size > 0) {
|
||||
acl = posix_acl_from_xattr(value, size);
|
||||
btrfs_update_cached_acl(inode, p_acl, acl);
|
||||
set_cached_acl(inode, type, acl);
|
||||
}
|
||||
kfree(value);
|
||||
} else if (size == -ENOENT || size == -ENODATA || size == 0) {
|
||||
/* FIXME, who returns -ENOENT? I think nobody */
|
||||
acl = NULL;
|
||||
btrfs_update_cached_acl(inode, p_acl, acl);
|
||||
set_cached_acl(inode, type, acl);
|
||||
} else {
|
||||
acl = ERR_PTR(-EIO);
|
||||
}
|
||||
@@ -121,7 +98,6 @@ static int btrfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
|
||||
{
|
||||
int ret, size = 0;
|
||||
const char *name;
|
||||
struct posix_acl **p_acl;
|
||||
char *value = NULL;
|
||||
mode_t mode;
|
||||
|
||||
@@ -141,13 +117,11 @@ static int btrfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
|
||||
ret = 0;
|
||||
inode->i_mode = mode;
|
||||
name = POSIX_ACL_XATTR_ACCESS;
|
||||
p_acl = &BTRFS_I(inode)->i_acl;
|
||||
break;
|
||||
case ACL_TYPE_DEFAULT:
|
||||
if (!S_ISDIR(inode->i_mode))
|
||||
return acl ? -EINVAL : 0;
|
||||
name = POSIX_ACL_XATTR_DEFAULT;
|
||||
p_acl = &BTRFS_I(inode)->i_default_acl;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
@@ -172,7 +146,7 @@ out:
|
||||
kfree(value);
|
||||
|
||||
if (!ret)
|
||||
btrfs_update_cached_acl(inode, p_acl, acl);
|
||||
set_cached_acl(inode, type, acl);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -53,10 +53,6 @@ struct btrfs_inode {
|
||||
/* used to order data wrt metadata */
|
||||
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 */
|
||||
struct list_head i_orphan;
|
||||
|
||||
|
||||
@@ -41,8 +41,6 @@ struct btrfs_ordered_sum;
|
||||
|
||||
#define BTRFS_MAGIC "_BHRfS_M"
|
||||
|
||||
#define BTRFS_ACL_NOT_CACHED ((void *)-1)
|
||||
|
||||
#define BTRFS_MAX_LEVEL 8
|
||||
|
||||
#define BTRFS_COMPAT_EXTENT_TREE_V0
|
||||
|
||||
+2
-14
@@ -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);
|
||||
if (!maybe_acls) {
|
||||
BTRFS_I(inode)->i_acl = NULL;
|
||||
BTRFS_I(inode)->i_default_acl = NULL;
|
||||
inode->i_acl = NULL;
|
||||
inode->i_default_acl = NULL;
|
||||
}
|
||||
|
||||
BTRFS_I(inode)->block_group = btrfs_find_block_group(root, 0,
|
||||
@@ -3141,9 +3141,6 @@ static noinline void init_btrfs_i(struct inode *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->sequence = 0;
|
||||
bi->last_trans = 0;
|
||||
@@ -4640,8 +4637,6 @@ struct inode *btrfs_alloc_inode(struct super_block *sb)
|
||||
ei->last_trans = 0;
|
||||
ei->logged_trans = 0;
|
||||
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->ordered_operations);
|
||||
return &ei->vfs_inode;
|
||||
@@ -4655,13 +4650,6 @@ void btrfs_destroy_inode(struct inode *inode)
|
||||
WARN_ON(!list_empty(&inode->i_dentry));
|
||||
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
|
||||
* lists.
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/vt.h>
|
||||
#include <linux/falloc.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/file.h>
|
||||
#include <linux/ppp_defs.h>
|
||||
@@ -1779,6 +1780,41 @@ lp_timeout_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
|
||||
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,
|
||||
unsigned long, struct file *);
|
||||
@@ -2756,6 +2792,18 @@ asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd,
|
||||
case FIOQSIZE:
|
||||
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 FIGETBSZ:
|
||||
case FIONREAD:
|
||||
|
||||
@@ -423,7 +423,6 @@ static void devpts_kill_sb(struct super_block *sb)
|
||||
}
|
||||
|
||||
static struct file_system_type devpts_fs_type = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "devpts",
|
||||
.get_sb = devpts_get_sb,
|
||||
.kill_sb = devpts_kill_sb,
|
||||
@@ -564,13 +563,4 @@ static int __init init_devpts_fs(void)
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
static void __exit exit_devpts_fs(void)
|
||||
{
|
||||
unregister_filesystem(&devpts_fs_type);
|
||||
mntput(devpts_mnt);
|
||||
}
|
||||
|
||||
module_init(init_devpts_fs)
|
||||
module_exit(exit_devpts_fs)
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
+16
-63
@@ -125,37 +125,12 @@ fail:
|
||||
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
|
||||
*/
|
||||
static struct posix_acl *
|
||||
ext2_get_acl(struct inode *inode, int type)
|
||||
{
|
||||
struct ext2_inode_info *ei = EXT2_I(inode);
|
||||
int name_index;
|
||||
char *value = NULL;
|
||||
struct posix_acl *acl;
|
||||
@@ -164,23 +139,19 @@ ext2_get_acl(struct inode *inode, int type)
|
||||
if (!test_opt(inode->i_sb, POSIX_ACL))
|
||||
return NULL;
|
||||
|
||||
switch(type) {
|
||||
case ACL_TYPE_ACCESS:
|
||||
acl = ext2_iget_acl(inode, &ei->i_acl);
|
||||
if (acl != EXT2_ACL_NOT_CACHED)
|
||||
return acl;
|
||||
name_index = EXT2_XATTR_INDEX_POSIX_ACL_ACCESS;
|
||||
break;
|
||||
acl = get_cached_acl(inode, type);
|
||||
if (acl != ACL_NOT_CACHED)
|
||||
return acl;
|
||||
|
||||
case ACL_TYPE_DEFAULT:
|
||||
acl = ext2_iget_acl(inode, &ei->i_default_acl);
|
||||
if (acl != EXT2_ACL_NOT_CACHED)
|
||||
return acl;
|
||||
name_index = EXT2_XATTR_INDEX_POSIX_ACL_DEFAULT;
|
||||
break;
|
||||
|
||||
default:
|
||||
return ERR_PTR(-EINVAL);
|
||||
switch (type) {
|
||||
case ACL_TYPE_ACCESS:
|
||||
name_index = EXT2_XATTR_INDEX_POSIX_ACL_ACCESS;
|
||||
break;
|
||||
case ACL_TYPE_DEFAULT:
|
||||
name_index = EXT2_XATTR_INDEX_POSIX_ACL_DEFAULT;
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
retval = ext2_xattr_get(inode, name_index, "", NULL, 0);
|
||||
if (retval > 0) {
|
||||
@@ -197,17 +168,9 @@ ext2_get_acl(struct inode *inode, int type)
|
||||
acl = ERR_PTR(retval);
|
||||
kfree(value);
|
||||
|
||||
if (!IS_ERR(acl)) {
|
||||
switch(type) {
|
||||
case ACL_TYPE_ACCESS:
|
||||
ext2_iset_acl(inode, &ei->i_acl, acl);
|
||||
break;
|
||||
if (!IS_ERR(acl))
|
||||
set_cached_acl(inode, type, acl);
|
||||
|
||||
case ACL_TYPE_DEFAULT:
|
||||
ext2_iset_acl(inode, &ei->i_default_acl, acl);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return acl;
|
||||
}
|
||||
|
||||
@@ -217,7 +180,6 @@ ext2_get_acl(struct inode *inode, int type)
|
||||
static int
|
||||
ext2_set_acl(struct inode *inode, int type, struct posix_acl *acl)
|
||||
{
|
||||
struct ext2_inode_info *ei = EXT2_I(inode);
|
||||
int name_index;
|
||||
void *value = NULL;
|
||||
size_t size = 0;
|
||||
@@ -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);
|
||||
|
||||
kfree(value);
|
||||
if (!error) {
|
||||
switch(type) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
if (!error)
|
||||
set_cached_acl(inode, type, acl);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
@@ -53,10 +53,6 @@ static inline int ext2_acl_count(size_t size)
|
||||
|
||||
#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 */
|
||||
extern int ext2_permission (struct inode *, int);
|
||||
extern int ext2_acl_chmod (struct inode *);
|
||||
|
||||
@@ -46,10 +46,6 @@ struct ext2_inode_info {
|
||||
* EAs.
|
||||
*/
|
||||
struct rw_semaphore xattr_sem;
|
||||
#endif
|
||||
#ifdef CONFIG_EXT2_FS_POSIX_ACL
|
||||
struct posix_acl *i_acl;
|
||||
struct posix_acl *i_default_acl;
|
||||
#endif
|
||||
rwlock_t i_meta_lock;
|
||||
|
||||
|
||||
@@ -1224,10 +1224,6 @@ struct inode *ext2_iget (struct super_block *sb, unsigned long ino)
|
||||
return 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;
|
||||
|
||||
raw_inode = ext2_get_inode(inode->i_sb, ino, &bh);
|
||||
|
||||
@@ -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);
|
||||
if (!ei)
|
||||
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->vfs_inode.i_version = 1;
|
||||
return &ei->vfs_inode;
|
||||
@@ -198,18 +194,6 @@ static void destroy_inodecache(void)
|
||||
static void ext2_clear_inode(struct inode *inode)
|
||||
{
|
||||
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_I(inode)->i_block_alloc_info = NULL;
|
||||
if (unlikely(rsv))
|
||||
|
||||
+18
-65
@@ -126,33 +126,6 @@ fail:
|
||||
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().
|
||||
*
|
||||
@@ -161,7 +134,6 @@ ext3_iset_acl(struct inode *inode, struct posix_acl **i_acl,
|
||||
static struct posix_acl *
|
||||
ext3_get_acl(struct inode *inode, int type)
|
||||
{
|
||||
struct ext3_inode_info *ei = EXT3_I(inode);
|
||||
int name_index;
|
||||
char *value = NULL;
|
||||
struct posix_acl *acl;
|
||||
@@ -170,24 +142,21 @@ ext3_get_acl(struct inode *inode, int type)
|
||||
if (!test_opt(inode->i_sb, POSIX_ACL))
|
||||
return NULL;
|
||||
|
||||
switch(type) {
|
||||
case ACL_TYPE_ACCESS:
|
||||
acl = ext3_iget_acl(inode, &ei->i_acl);
|
||||
if (acl != EXT3_ACL_NOT_CACHED)
|
||||
return acl;
|
||||
name_index = EXT3_XATTR_INDEX_POSIX_ACL_ACCESS;
|
||||
break;
|
||||
acl = get_cached_acl(inode, type);
|
||||
if (acl != ACL_NOT_CACHED)
|
||||
return acl;
|
||||
|
||||
case ACL_TYPE_DEFAULT:
|
||||
acl = ext3_iget_acl(inode, &ei->i_default_acl);
|
||||
if (acl != EXT3_ACL_NOT_CACHED)
|
||||
return acl;
|
||||
name_index = EXT3_XATTR_INDEX_POSIX_ACL_DEFAULT;
|
||||
break;
|
||||
|
||||
default:
|
||||
return ERR_PTR(-EINVAL);
|
||||
switch (type) {
|
||||
case ACL_TYPE_ACCESS:
|
||||
name_index = EXT3_XATTR_INDEX_POSIX_ACL_ACCESS;
|
||||
break;
|
||||
case ACL_TYPE_DEFAULT:
|
||||
name_index = EXT3_XATTR_INDEX_POSIX_ACL_DEFAULT;
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
|
||||
retval = ext3_xattr_get(inode, name_index, "", NULL, 0);
|
||||
if (retval > 0) {
|
||||
value = kmalloc(retval, GFP_NOFS);
|
||||
@@ -203,17 +172,9 @@ ext3_get_acl(struct inode *inode, int type)
|
||||
acl = ERR_PTR(retval);
|
||||
kfree(value);
|
||||
|
||||
if (!IS_ERR(acl)) {
|
||||
switch(type) {
|
||||
case ACL_TYPE_ACCESS:
|
||||
ext3_iset_acl(inode, &ei->i_acl, acl);
|
||||
break;
|
||||
if (!IS_ERR(acl))
|
||||
set_cached_acl(inode, type, acl);
|
||||
|
||||
case ACL_TYPE_DEFAULT:
|
||||
ext3_iset_acl(inode, &ei->i_default_acl, acl);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return acl;
|
||||
}
|
||||
|
||||
@@ -226,7 +187,6 @@ static int
|
||||
ext3_set_acl(handle_t *handle, struct inode *inode, int type,
|
||||
struct posix_acl *acl)
|
||||
{
|
||||
struct ext3_inode_info *ei = EXT3_I(inode);
|
||||
int name_index;
|
||||
void *value = NULL;
|
||||
size_t size = 0;
|
||||
@@ -271,17 +231,10 @@ ext3_set_acl(handle_t *handle, struct inode *inode, int type,
|
||||
value, size, 0);
|
||||
|
||||
kfree(value);
|
||||
if (!error) {
|
||||
switch(type) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
if (!error)
|
||||
set_cached_acl(inode, type, acl);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
@@ -53,10 +53,6 @@ static inline int ext3_acl_count(size_t size)
|
||||
|
||||
#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 */
|
||||
extern int ext3_permission (struct inode *, int);
|
||||
extern int ext3_acl_chmod (struct inode *);
|
||||
|
||||
@@ -2752,10 +2752,6 @@ struct inode *ext3_iget(struct super_block *sb, unsigned long ino)
|
||||
return 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;
|
||||
|
||||
ret = __ext3_get_inode_loc(inode, &iloc, 0);
|
||||
|
||||
@@ -464,10 +464,6 @@ static struct inode *ext3_alloc_inode(struct super_block *sb)
|
||||
ei = kmem_cache_alloc(ext3_inode_cachep, GFP_NOFS);
|
||||
if (!ei)
|
||||
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->vfs_inode.i_version = 1;
|
||||
return &ei->vfs_inode;
|
||||
@@ -518,18 +514,6 @@ static void destroy_inodecache(void)
|
||||
static void ext3_clear_inode(struct inode *inode)
|
||||
{
|
||||
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_I(inode)->i_block_alloc_info = NULL;
|
||||
if (unlikely(rsv))
|
||||
|
||||
+9
-58
@@ -126,33 +126,6 @@ fail:
|
||||
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().
|
||||
*
|
||||
@@ -161,7 +134,6 @@ ext4_iset_acl(struct inode *inode, struct posix_acl **i_acl,
|
||||
static struct posix_acl *
|
||||
ext4_get_acl(struct inode *inode, int type)
|
||||
{
|
||||
struct ext4_inode_info *ei = EXT4_I(inode);
|
||||
int name_index;
|
||||
char *value = NULL;
|
||||
struct posix_acl *acl;
|
||||
@@ -170,23 +142,19 @@ ext4_get_acl(struct inode *inode, int type)
|
||||
if (!test_opt(inode->i_sb, POSIX_ACL))
|
||||
return NULL;
|
||||
|
||||
acl = get_cached_acl(inode, type);
|
||||
if (acl != ACL_NOT_CACHED)
|
||||
return acl;
|
||||
|
||||
switch (type) {
|
||||
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;
|
||||
break;
|
||||
|
||||
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;
|
||||
break;
|
||||
|
||||
default:
|
||||
return ERR_PTR(-EINVAL);
|
||||
BUG();
|
||||
}
|
||||
retval = ext4_xattr_get(inode, name_index, "", NULL, 0);
|
||||
if (retval > 0) {
|
||||
@@ -203,17 +171,9 @@ ext4_get_acl(struct inode *inode, int type)
|
||||
acl = ERR_PTR(retval);
|
||||
kfree(value);
|
||||
|
||||
if (!IS_ERR(acl)) {
|
||||
switch (type) {
|
||||
case ACL_TYPE_ACCESS:
|
||||
ext4_iset_acl(inode, &ei->i_acl, acl);
|
||||
break;
|
||||
if (!IS_ERR(acl))
|
||||
set_cached_acl(inode, type, acl);
|
||||
|
||||
case ACL_TYPE_DEFAULT:
|
||||
ext4_iset_acl(inode, &ei->i_default_acl, acl);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return acl;
|
||||
}
|
||||
|
||||
@@ -226,7 +186,6 @@ static int
|
||||
ext4_set_acl(handle_t *handle, struct inode *inode, int type,
|
||||
struct posix_acl *acl)
|
||||
{
|
||||
struct ext4_inode_info *ei = EXT4_I(inode);
|
||||
int name_index;
|
||||
void *value = NULL;
|
||||
size_t size = 0;
|
||||
@@ -271,17 +230,9 @@ ext4_set_acl(handle_t *handle, struct inode *inode, int type,
|
||||
value, size, 0);
|
||||
|
||||
kfree(value);
|
||||
if (!error) {
|
||||
switch (type) {
|
||||
case ACL_TYPE_ACCESS:
|
||||
ext4_iset_acl(inode, &ei->i_acl, acl);
|
||||
break;
|
||||
if (!error)
|
||||
set_cached_acl(inode, type, acl);
|
||||
|
||||
case ACL_TYPE_DEFAULT:
|
||||
ext4_iset_acl(inode, &ei->i_default_acl, acl);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
@@ -53,10 +53,6 @@ static inline int ext4_acl_count(size_t size)
|
||||
|
||||
#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 */
|
||||
extern int ext4_permission(struct inode *, int);
|
||||
extern int ext4_acl_chmod(struct inode *);
|
||||
|
||||
@@ -595,10 +595,6 @@ struct ext4_inode_info {
|
||||
*/
|
||||
struct rw_semaphore xattr_sem;
|
||||
#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 */
|
||||
|
||||
|
||||
@@ -4453,10 +4453,6 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino)
|
||||
return 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);
|
||||
if (ret < 0)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user