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
...@@ -82,7 +82,6 @@ int reiserfs_resize(struct super_block *s, unsigned long block_count_new) ...@@ -82,7 +82,6 @@ int reiserfs_resize(struct super_block *s, unsigned long block_count_new)
if (reiserfs_allocate_list_bitmaps(s, jbitmap, bmap_nr_new) < 0) { if (reiserfs_allocate_list_bitmaps(s, jbitmap, bmap_nr_new) < 0) {
printk printk
("reiserfs_resize: unable to allocate memory for journal bitmaps\n"); ("reiserfs_resize: unable to allocate memory for journal bitmaps\n");
unlock_super(s);
return -ENOMEM; return -ENOMEM;
} }
/* the new journal bitmaps are zero filled, now we copy in the bitmap /* the new journal bitmaps are zero filled, now we copy in the bitmap
......
...@@ -529,10 +529,6 @@ static void init_once(void *foo) ...@@ -529,10 +529,6 @@ static void init_once(void *foo)
INIT_LIST_HEAD(&ei->i_prealloc_list); INIT_LIST_HEAD(&ei->i_prealloc_list);
inode_init_once(&ei->vfs_inode); inode_init_once(&ei->vfs_inode);
#ifdef CONFIG_REISERFS_FS_POSIX_ACL
ei->i_acl_access = NULL;
ei->i_acl_default = NULL;
#endif
} }
static int init_inodecache(void) static int init_inodecache(void)
...@@ -580,25 +576,6 @@ static void reiserfs_dirty_inode(struct inode *inode) ...@@ -580,25 +576,6 @@ static void reiserfs_dirty_inode(struct inode *inode)
reiserfs_write_unlock(inode->i_sb); reiserfs_write_unlock(inode->i_sb);
} }
#ifdef CONFIG_REISERFS_FS_POSIX_ACL
static void reiserfs_clear_inode(struct inode *inode)
{
struct posix_acl *acl;
acl = REISERFS_I(inode)->i_acl_access;
if (acl && !IS_ERR(acl))
posix_acl_release(acl);
REISERFS_I(inode)->i_acl_access = NULL;
acl = REISERFS_I(inode)->i_acl_default;
if (acl && !IS_ERR(acl))
posix_acl_release(acl);
REISERFS_I(inode)->i_acl_default = NULL;
}
#else
#define reiserfs_clear_inode NULL
#endif
#ifdef CONFIG_QUOTA #ifdef CONFIG_QUOTA
static ssize_t reiserfs_quota_write(struct super_block *, int, const char *, static ssize_t reiserfs_quota_write(struct super_block *, int, const char *,
size_t, loff_t); size_t, loff_t);
...@@ -612,7 +589,6 @@ static const struct super_operations reiserfs_sops = { ...@@ -612,7 +589,6 @@ static const struct super_operations reiserfs_sops = {
.write_inode = reiserfs_write_inode, .write_inode = reiserfs_write_inode,
.dirty_inode = reiserfs_dirty_inode, .dirty_inode = reiserfs_dirty_inode,
.delete_inode = reiserfs_delete_inode, .delete_inode = reiserfs_delete_inode,
.clear_inode = reiserfs_clear_inode,
.put_super = reiserfs_put_super, .put_super = reiserfs_put_super,
.write_super = reiserfs_write_super, .write_super = reiserfs_write_super,
.sync_fs = reiserfs_sync_fs, .sync_fs = reiserfs_sync_fs,
......
...@@ -188,29 +188,6 @@ static void *posix_acl_to_disk(const struct posix_acl *acl, size_t * size) ...@@ -188,29 +188,6 @@ static void *posix_acl_to_disk(const struct posix_acl *acl, size_t * size)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
} }
static inline void iset_acl(struct inode *inode, struct posix_acl **i_acl,
struct posix_acl *acl)
{
spin_lock(&inode->i_lock);
if (*i_acl != ERR_PTR(-ENODATA))
posix_acl_release(*i_acl);
*i_acl = posix_acl_dup(acl);
spin_unlock(&inode->i_lock);
}
static inline struct posix_acl *iget_acl(struct inode *inode,
struct posix_acl **i_acl)
{
struct posix_acl *acl = ERR_PTR(-ENODATA);
spin_lock(&inode->i_lock);
if (*i_acl != ERR_PTR(-ENODATA))
acl = posix_acl_dup(*i_acl);
spin_unlock(&inode->i_lock);
return acl;
}
/* /*
* Inode operation get_posix_acl(). * Inode operation get_posix_acl().
* *
...@@ -220,34 +197,29 @@ static inline struct posix_acl *iget_acl(struct inode *inode, ...@@ -220,34 +197,29 @@ static inline struct posix_acl *iget_acl(struct inode *inode,
struct posix_acl *reiserfs_get_acl(struct inode *inode, int type) struct posix_acl *reiserfs_get_acl(struct inode *inode, int type)
{ {
char *name, *value; char *name, *value;
struct posix_acl *acl, **p_acl; struct posix_acl *acl;
int size; int size;
int retval; int retval;
struct reiserfs_inode_info *reiserfs_i = REISERFS_I(inode);
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 = &reiserfs_i->i_acl_access;
break; break;
case ACL_TYPE_DEFAULT: case ACL_TYPE_DEFAULT:
name = POSIX_ACL_XATTR_DEFAULT; name = POSIX_ACL_XATTR_DEFAULT;
p_acl = &reiserfs_i->i_acl_default;
break; break;
default: default:
return ERR_PTR(-EINVAL); BUG();
} }
acl = iget_acl(inode, p_acl);
if (acl && !IS_ERR(acl))
return acl;
else if (PTR_ERR(acl) == -ENODATA)
return NULL;
size = reiserfs_xattr_get(inode, name, NULL, 0); size = reiserfs_xattr_get(inode, name, NULL, 0);
if (size < 0) { if (size < 0) {
if (size == -ENODATA || size == -ENOSYS) { if (size == -ENODATA || size == -ENOSYS) {
*p_acl = ERR_PTR(-ENODATA); set_cached_acl(inode, type, NULL);
return NULL; return NULL;
} }
return ERR_PTR(size); return ERR_PTR(size);
...@@ -262,14 +234,13 @@ struct posix_acl *reiserfs_get_acl(struct inode *inode, int type) ...@@ -262,14 +234,13 @@ struct posix_acl *reiserfs_get_acl(struct inode *inode, int type)
/* This shouldn't actually happen as it should have /* This shouldn't actually happen as it should have
been caught above.. but just in case */ been caught above.. but just in case */
acl = NULL; acl = NULL;
*p_acl = ERR_PTR(-ENODATA);
} else if (retval < 0) { } else if (retval < 0) {
acl = ERR_PTR(retval); acl = ERR_PTR(retval);
} else { } else {
acl = posix_acl_from_disk(value, retval); acl = posix_acl_from_disk(value, retval);
if (!IS_ERR(acl))
iset_acl(inode, p_acl, acl);
} }
if (!IS_ERR(acl))
set_cached_acl(inode, type, acl);
kfree(value); kfree(value);
return acl; return acl;
...@@ -287,10 +258,8 @@ reiserfs_set_acl(struct reiserfs_transaction_handle *th, struct inode *inode, ...@@ -287,10 +258,8 @@ reiserfs_set_acl(struct reiserfs_transaction_handle *th, struct inode *inode,
{ {
char *name; char *name;
void *value = NULL; void *value = NULL;
struct posix_acl **p_acl;
size_t size = 0; size_t size = 0;
int error; int error;
struct reiserfs_inode_info *reiserfs_i = REISERFS_I(inode);
if (S_ISLNK(inode->i_mode)) if (S_ISLNK(inode->i_mode))
return -EOPNOTSUPP; return -EOPNOTSUPP;
...@@ -298,7 +267,6 @@ reiserfs_set_acl(struct reiserfs_transaction_handle *th, struct inode *inode, ...@@ -298,7 +267,6 @@ reiserfs_set_acl(struct reiserfs_transaction_handle *th, struct inode *inode,
switch (type) { switch (type) {
case ACL_TYPE_ACCESS: case ACL_TYPE_ACCESS:
name = POSIX_ACL_XATTR_ACCESS; name = POSIX_ACL_XATTR_ACCESS;
p_acl = &reiserfs_i->i_acl_access;
if (acl) { if (acl) {
mode_t mode = inode->i_mode; mode_t mode = inode->i_mode;
error = posix_acl_equiv_mode(acl, &mode); error = posix_acl_equiv_mode(acl, &mode);
...@@ -313,7 +281,6 @@ reiserfs_set_acl(struct reiserfs_transaction_handle *th, struct inode *inode, ...@@ -313,7 +281,6 @@ reiserfs_set_acl(struct reiserfs_transaction_handle *th, struct inode *inode,
break; break;
case ACL_TYPE_DEFAULT: case ACL_TYPE_DEFAULT:
name = POSIX_ACL_XATTR_DEFAULT; name = POSIX_ACL_XATTR_DEFAULT;
p_acl = &reiserfs_i->i_acl_default;
if (!S_ISDIR(inode->i_mode)) if (!S_ISDIR(inode->i_mode))
return acl ? -EACCES : 0; return acl ? -EACCES : 0;
break; break;
...@@ -346,7 +313,7 @@ reiserfs_set_acl(struct reiserfs_transaction_handle *th, struct inode *inode, ...@@ -346,7 +313,7 @@ reiserfs_set_acl(struct reiserfs_transaction_handle *th, struct inode *inode,
kfree(value); kfree(value);
if (!error) if (!error)
iset_acl(inode, p_acl, acl); set_cached_acl(inode, type, acl);
return error; return error;
} }
...@@ -379,11 +346,8 @@ reiserfs_inherit_default_acl(struct reiserfs_transaction_handle *th, ...@@ -379,11 +346,8 @@ reiserfs_inherit_default_acl(struct reiserfs_transaction_handle *th,
} }
acl = reiserfs_get_acl(dir, ACL_TYPE_DEFAULT); acl = reiserfs_get_acl(dir, ACL_TYPE_DEFAULT);
if (IS_ERR(acl)) { if (IS_ERR(acl))
if (PTR_ERR(acl) == -ENODATA)
goto apply_umask;
return PTR_ERR(acl); return PTR_ERR(acl);
}
if (acl) { if (acl) {
struct posix_acl *acl_copy; struct posix_acl *acl_copy;
......
...@@ -608,6 +608,7 @@ void emergency_remount(void) ...@@ -608,6 +608,7 @@ void emergency_remount(void)
static DEFINE_IDA(unnamed_dev_ida); static DEFINE_IDA(unnamed_dev_ida);
static DEFINE_SPINLOCK(unnamed_dev_lock);/* protects the above */ static DEFINE_SPINLOCK(unnamed_dev_lock);/* protects the above */
static int unnamed_dev_start = 0; /* don't bother trying below it */
int set_anon_super(struct super_block *s, void *data) int set_anon_super(struct super_block *s, void *data)
{ {
...@@ -618,7 +619,9 @@ int set_anon_super(struct super_block *s, void *data) ...@@ -618,7 +619,9 @@ int set_anon_super(struct super_block *s, void *data)
if (ida_pre_get(&unnamed_dev_ida, GFP_ATOMIC) == 0) if (ida_pre_get(&unnamed_dev_ida, GFP_ATOMIC) == 0)
return -ENOMEM; return -ENOMEM;
spin_lock(&unnamed_dev_lock); spin_lock(&unnamed_dev_lock);
error = ida_get_new(&unnamed_dev_ida, &dev); error = ida_get_new_above(&unnamed_dev_ida, unnamed_dev_start, &dev);
if (!error)
unnamed_dev_start = dev + 1;
spin_unlock(&unnamed_dev_lock); spin_unlock(&unnamed_dev_lock);
if (error == -EAGAIN) if (error == -EAGAIN)
/* We raced and lost with another CPU. */ /* We raced and lost with another CPU. */
...@@ -629,6 +632,8 @@ int set_anon_super(struct super_block *s, void *data) ...@@ -629,6 +632,8 @@ int set_anon_super(struct super_block *s, void *data)
if ((dev & MAX_ID_MASK) == (1 << MINORBITS)) { if ((dev & MAX_ID_MASK) == (1 << MINORBITS)) {
spin_lock(&unnamed_dev_lock); spin_lock(&unnamed_dev_lock);
ida_remove(&unnamed_dev_ida, dev); ida_remove(&unnamed_dev_ida, dev);
if (unnamed_dev_start > dev)
unnamed_dev_start = dev;
spin_unlock(&unnamed_dev_lock); spin_unlock(&unnamed_dev_lock);
return -EMFILE; return -EMFILE;
} }
...@@ -645,6 +650,8 @@ void kill_anon_super(struct super_block *sb) ...@@ -645,6 +650,8 @@ void kill_anon_super(struct super_block *sb)
generic_shutdown_super(sb); generic_shutdown_super(sb);
spin_lock(&unnamed_dev_lock); spin_lock(&unnamed_dev_lock);
ida_remove(&unnamed_dev_ida, slot); ida_remove(&unnamed_dev_ida, slot);
if (slot < unnamed_dev_start)
unnamed_dev_start = slot;
spin_unlock(&unnamed_dev_lock); spin_unlock(&unnamed_dev_lock);
} }
......
...@@ -55,9 +55,9 @@ ...@@ -55,9 +55,9 @@
* ACL support is not implemented. * ACL support is not implemented.
*/ */
#include "ubifs.h"
#include <linux/xattr.h> #include <linux/xattr.h>
#include <linux/posix_acl_xattr.h> #include <linux/posix_acl_xattr.h>
#include "ubifs.h"
/* /*
* Limit the number of extended attributes per inode so that the total size * Limit the number of extended attributes per inode so that the total size
......
...@@ -25,14 +25,10 @@ ...@@ -25,14 +25,10 @@
#include <linux/posix_acl_xattr.h> #include <linux/posix_acl_xattr.h>
#define XFS_ACL_NOT_CACHED ((void *)-1)
/* /*
* Locking scheme: * Locking scheme:
* - all ACL updates are protected by inode->i_mutex, which is taken before * - all ACL updates are protected by inode->i_mutex, which is taken before
* calling into this file. * calling into this file.
* - access and updates to the ip->i_acl and ip->i_default_acl pointers are
* protected by inode->i_lock.
*/ */
STATIC struct posix_acl * STATIC struct posix_acl *
...@@ -102,59 +98,35 @@ xfs_acl_to_disk(struct xfs_acl *aclp, const struct posix_acl *acl) ...@@ -102,59 +98,35 @@ xfs_acl_to_disk(struct xfs_acl *aclp, const struct posix_acl *acl)
} }
} }
/*
* Update the cached ACL pointer in the inode.
*
* Because we don't hold any locks while reading/writing the attribute
* from/to disk another thread could have raced and updated the cached
* ACL value before us. In that case we release the previous cached value
* and update it with our new value.
*/
STATIC void
xfs_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 != XFS_ACL_NOT_CACHED)
posix_acl_release(*p_acl);
*p_acl = posix_acl_dup(acl);
spin_unlock(&inode->i_lock);
}
struct posix_acl * struct posix_acl *
xfs_get_acl(struct inode *inode, int type) xfs_get_acl(struct inode *inode, int type)
{ {
struct xfs_inode *ip = XFS_I(inode); struct xfs_inode *ip = XFS_I(inode);
struct posix_acl *acl = NULL, **p_acl; struct posix_acl *acl;
struct xfs_acl *xfs_acl; struct xfs_acl *xfs_acl;
int len = sizeof(struct xfs_acl); int len = sizeof(struct xfs_acl);
char *ea_name; char *ea_name;
int error; int error;
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:
ea_name = SGI_ACL_FILE; ea_name = SGI_ACL_FILE;
p_acl = &ip->i_acl;
break; break;
case ACL_TYPE_DEFAULT: case ACL_TYPE_DEFAULT:
ea_name = SGI_ACL_DEFAULT; ea_name = SGI_ACL_DEFAULT;
p_acl = &ip->i_default_acl;
break; break;
default: default:
return ERR_PTR(-EINVAL); BUG();
} }
spin_lock(&inode->i_lock);
if (*p_acl != XFS_ACL_NOT_CACHED)
acl = posix_acl_dup(*p_acl);
spin_unlock(&inode->i_lock);
/* /*
* If we have a cached ACLs value just return it, not need to * If we have a cached ACLs value just return it, not need to
* go out to the disk. * go out to the disk.
*/ */
if (acl)
return acl;
xfs_acl = kzalloc(sizeof(struct xfs_acl), GFP_KERNEL); xfs_acl = kzalloc(sizeof(struct xfs_acl), GFP_KERNEL);
if (!xfs_acl) if (!xfs_acl)
...@@ -165,7 +137,7 @@ xfs_get_acl(struct inode *inode, int type) ...@@ -165,7 +137,7 @@ xfs_get_acl(struct inode *inode, int type)
/* /*
* If the attribute doesn't exist make sure we have a negative * If the attribute doesn't exist make sure we have a negative
* cache entry, for any other error assume it is transient and * cache entry, for any other error assume it is transient and
* leave the cache entry as XFS_ACL_NOT_CACHED. * leave the cache entry as ACL_NOT_CACHED.
*/ */
if (error == -ENOATTR) { if (error == -ENOATTR) {
acl = NULL; acl = NULL;
...@@ -179,7 +151,7 @@ xfs_get_acl(struct inode *inode, int type) ...@@ -179,7 +151,7 @@ xfs_get_acl(struct inode *inode, int type)
goto out; goto out;
out_update_cache: out_update_cache:
xfs_update_cached_acl(inode, p_acl, acl); set_cached_acl(inode, type, acl);
out: out:
kfree(xfs_acl); kfree(xfs_acl);
return acl; return acl;
...@@ -189,7 +161,6 @@ STATIC int ...@@ -189,7 +161,6 @@ STATIC int
xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl) xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl)
{ {
struct xfs_inode *ip = XFS_I(inode); struct xfs_inode *ip = XFS_I(inode);
struct posix_acl **p_acl;
char *ea_name; char *ea_name;
int error; int error;
...@@ -199,13 +170,11 @@ xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl) ...@@ -199,13 +170,11 @@ xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl)
switch (type) { switch (type) {
case ACL_TYPE_ACCESS: case ACL_TYPE_ACCESS:
ea_name = SGI_ACL_FILE; ea_name = SGI_ACL_FILE;
p_acl = &ip->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 ? -EACCES : 0; return acl ? -EACCES : 0;
ea_name = SGI_ACL_DEFAULT; ea_name = SGI_ACL_DEFAULT;
p_acl = &ip->i_default_acl;
break; break;
default: default:
return -EINVAL; return -EINVAL;
...@@ -242,7 +211,7 @@ xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl) ...@@ -242,7 +211,7 @@ xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl)
} }
if (!error) if (!error)
xfs_update_cached_acl(inode, p_acl, acl); set_cached_acl(inode, type, acl);
return error; return error;
} }
...@@ -384,30 +353,6 @@ xfs_acl_chmod(struct inode *inode) ...@@ -384,30 +353,6 @@ xfs_acl_chmod(struct inode *inode)
return error; return error;
} }
void
xfs_inode_init_acls(struct xfs_inode *ip)
{
/*
* No need for locking, inode is not live yet.
*/
ip->i_acl = XFS_ACL_NOT_CACHED;
ip->i_default_acl = XFS_ACL_NOT_CACHED;
}
void
xfs_inode_clear_acls(struct xfs_inode *ip)
{
/*
* No need for locking here, the inode is not live anymore
* and just about to be freed.
*/
if (ip->i_acl != XFS_ACL_NOT_CACHED)
posix_acl_release(ip->i_acl);
if (ip->i_default_acl != XFS_ACL_NOT_CACHED)
posix_acl_release(ip->i_default_acl);
}
/* /*
* System xattr handlers. * System xattr handlers.
* *
......
...@@ -46,8 +46,6 @@ extern int xfs_check_acl(struct inode *inode, int mask); ...@@ -46,8 +46,6 @@ extern int xfs_check_acl(struct inode *inode, int mask);
extern struct posix_acl *xfs_get_acl(struct inode *inode, int type); extern struct posix_acl *xfs_get_acl(struct inode *inode, int type);
extern int xfs_inherit_acl(struct inode *inode, struct posix_acl *default_acl); extern int xfs_inherit_acl(struct inode *inode, struct posix_acl *default_acl);
extern int xfs_acl_chmod(struct inode *inode); extern int xfs_acl_chmod(struct inode *inode);
extern void xfs_inode_init_acls(struct xfs_inode *ip);
extern void xfs_inode_clear_acls(struct xfs_inode *ip);
extern int posix_acl_access_exists(struct inode *inode); extern int posix_acl_access_exists(struct inode *inode);
extern int posix_acl_default_exists(struct inode *inode); extern int posix_acl_default_exists(struct inode *inode);
...@@ -57,8 +55,6 @@ extern struct xattr_handler xfs_xattr_system_handler; ...@@ -57,8 +55,6 @@ extern struct xattr_handler xfs_xattr_system_handler;
# define xfs_get_acl(inode, type) NULL # define xfs_get_acl(inode, type) NULL
# define xfs_inherit_acl(inode, default_acl) 0 # define xfs_inherit_acl(inode, default_acl) 0
# define xfs_acl_chmod(inode) 0 # define xfs_acl_chmod(inode) 0
# define xfs_inode_init_acls(ip)
# define xfs_inode_clear_acls(ip)
# define posix_acl_access_exists(inode) 0 # define posix_acl_access_exists(inode) 0
# define posix_acl_default_exists(inode) 0 # define posix_acl_default_exists(inode) 0
#endif /* CONFIG_XFS_POSIX_ACL */ #endif /* CONFIG_XFS_POSIX_ACL */
......
...@@ -83,7 +83,6 @@ xfs_inode_alloc( ...@@ -83,7 +83,6 @@ xfs_inode_alloc(
memset(&ip->i_d, 0, sizeof(xfs_icdinode_t)); memset(&ip->i_d, 0, sizeof(xfs_icdinode_t));
ip->i_size = 0; ip->i_size = 0;
ip->i_new_size = 0; ip->i_new_size = 0;
xfs_inode_init_acls(ip);
/* /*
* Initialize inode's trace buffers. * Initialize inode's trace buffers.
...@@ -560,7 +559,6 @@ xfs_ireclaim( ...@@ -560,7 +559,6 @@ xfs_ireclaim(
ASSERT(atomic_read(&ip->i_pincount) == 0); ASSERT(atomic_read(&ip->i_pincount) == 0);
ASSERT(!spin_is_locked(&ip->i_flags_lock)); ASSERT(!spin_is_locked(&ip->i_flags_lock));
ASSERT(completion_done(&ip->i_flush)); ASSERT(completion_done(&ip->i_flush));
xfs_inode_clear_acls(ip);
kmem_zone_free(xfs_inode_zone, ip); kmem_zone_free(xfs_inode_zone, ip);
} }
......
...@@ -273,11 +273,6 @@ typedef struct xfs_inode { ...@@ -273,11 +273,6 @@ typedef struct xfs_inode {
/* VFS inode */ /* VFS inode */
struct inode i_vnode; /* embedded VFS inode */ struct inode i_vnode; /* embedded VFS inode */
#ifdef CONFIG_XFS_POSIX_ACL
struct posix_acl *i_acl;
struct posix_acl *i_default_acl;
#endif
/* Trace buffers per inode. */ /* Trace buffers per inode. */
#ifdef XFS_INODE_TRACE #ifdef XFS_INODE_TRACE
struct ktrace *i_trace; /* general inode trace */ struct ktrace *i_trace; /* general inode trace */
......
...@@ -103,10 +103,6 @@ struct ext3_inode_info { ...@@ -103,10 +103,6 @@ struct ext3_inode_info {
*/ */
struct rw_semaphore xattr_sem; struct rw_semaphore xattr_sem;
#endif #endif
#ifdef CONFIG_EXT3_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 */
......
...@@ -3,4 +3,25 @@ ...@@ -3,4 +3,25 @@
#define FALLOC_FL_KEEP_SIZE 0x01 /* default is extend size */ #define FALLOC_FL_KEEP_SIZE 0x01 /* default is extend size */
#ifdef __KERNEL__
/*
* Space reservation ioctls and argument structure
* are designed to be compatible with the legacy XFS ioctls.
*/
struct space_resv {
__s16 l_type;
__s16 l_whence;
__s64 l_start;
__s64 l_len; /* len == 0 means until end of file */
__s32 l_sysid;
__u32 l_pid;
__s32 l_pad[4]; /* reserved area */
};
#define FS_IOC_RESVSP _IOW('X', 40, struct space_resv)
#define FS_IOC_RESVSP64 _IOW('X', 42, struct space_resv)
#endif /* __KERNEL__ */
#endif /* _FALLOC_H_ */ #endif /* _FALLOC_H_ */
...@@ -710,6 +710,9 @@ static inline int mapping_writably_mapped(struct address_space *mapping) ...@@ -710,6 +710,9 @@ static inline int mapping_writably_mapped(struct address_space *mapping)
#define i_size_ordered_init(inode) do { } while (0) #define i_size_ordered_init(inode) do { } while (0)
#endif #endif
struct posix_acl;
#define ACL_NOT_CACHED ((void *)(-1))
struct inode { struct inode {
struct hlist_node i_hash; struct hlist_node i_hash;
struct list_head i_list; struct list_head i_list;
...@@ -772,6 +775,10 @@ struct inode { ...@@ -772,6 +775,10 @@ struct inode {
atomic_t i_writecount; atomic_t i_writecount;
#ifdef CONFIG_SECURITY #ifdef CONFIG_SECURITY
void *i_security; void *i_security;
#endif
#ifdef CONFIG_FS_POSIX_ACL
struct posix_acl *i_acl;
struct posix_acl *i_default_acl;
#endif #endif
void *i_private; /* fs or device private pointer */ void *i_private; /* fs or device private pointer */
}; };
...@@ -1906,6 +1913,8 @@ static inline int break_lease(struct inode *inode, unsigned int mode) ...@@ -1906,6 +1913,8 @@ static inline int break_lease(struct inode *inode, unsigned int mode)
extern int do_truncate(struct dentry *, loff_t start, unsigned int time_attrs, extern int do_truncate(struct dentry *, loff_t start, unsigned int time_attrs,
struct file *filp); struct file *filp);
extern int do_fallocate(struct file *file, int mode, loff_t offset,
loff_t len);
extern long do_sys_open(int dfd, const char __user *filename, int flags, extern long do_sys_open(int dfd, const char __user *filename, int flags,
int mode); int mode);
extern struct file *filp_open(const char *, int, int); extern struct file *filp_open(const char *, int, int);
...@@ -1914,6 +1923,10 @@ extern struct file * dentry_open(struct dentry *, struct vfsmount *, int, ...@@ -1914,6 +1923,10 @@ extern struct file * dentry_open(struct dentry *, struct vfsmount *, int,
extern int filp_close(struct file *, fl_owner_t id); extern int filp_close(struct file *, fl_owner_t id);
extern char * getname(const char __user *); extern char * getname(const char __user *);
/* fs/ioctl.c */
extern int ioctl_preallocate(struct file *filp, void __user *argp);
/* fs/dcache.c */ /* fs/dcache.c */
extern void __init vfs_caches_init_early(void); extern void __init vfs_caches_init_early(void);
extern void __init vfs_caches_init(unsigned long); extern void __init vfs_caches_init(unsigned long);
......
...@@ -83,4 +83,68 @@ extern int posix_acl_chmod_masq(struct posix_acl *, mode_t); ...@@ -83,4 +83,68 @@ extern int posix_acl_chmod_masq(struct posix_acl *, mode_t);
extern struct posix_acl *get_posix_acl(struct inode *, int); extern struct posix_acl *get_posix_acl(struct inode *, int);
extern int set_posix_acl(struct inode *, int, struct posix_acl *); extern int set_posix_acl(struct inode *, int, struct posix_acl *);
static inline struct posix_acl *get_cached_acl(struct inode *inode, int type)
{
struct posix_acl **p, *acl;
switch (type) {
case ACL_TYPE_ACCESS:
p = &inode->i_acl;
break;
case ACL_TYPE_DEFAULT:
p = &inode->i_default_acl;
break;
default:
return ERR_PTR(-EINVAL);
}
acl = ACCESS_ONCE(*p);
if (acl) {
spin_lock(&inode->i_lock);
acl = *p;
if (acl != ACL_NOT_CACHED)
acl = posix_acl_dup(acl);
spin_unlock(&inode->i_lock);
}
return acl;
}
static inline void set_cached_acl(struct inode *inode,
int type,
struct posix_acl *acl)
{
struct posix_acl *old = NULL;
spin_lock(&inode->i_lock);
switch (type) {
case ACL_TYPE_ACCESS:
old = inode->i_acl;
inode->i_acl = posix_acl_dup(acl);
break;
case ACL_TYPE_DEFAULT:
old = inode->i_default_acl;
inode->i_default_acl = posix_acl_dup(acl);
break;
}
spin_unlock(&inode->i_lock);
if (old != ACL_NOT_CACHED)
posix_acl_release(old);
}
static inline void forget_cached_acl(struct inode *inode, int type)
{
struct posix_acl *old = NULL;
spin_lock(&inode->i_lock);
switch (type) {
case ACL_TYPE_ACCESS:
old = inode->i_acl;
inode->i_acl = ACL_NOT_CACHED;
break;
case ACL_TYPE_DEFAULT:
old = inode->i_default_acl;
inode->i_default_acl = ACL_NOT_CACHED;
break;
}
spin_unlock(&inode->i_lock);
if (old != ACL_NOT_CACHED)
posix_acl_release(old);
}
#endif /* __LINUX_POSIX_ACL_H */ #endif /* __LINUX_POSIX_ACL_H */
...@@ -56,15 +56,6 @@ int reiserfs_cache_default_acl(struct inode *dir); ...@@ -56,15 +56,6 @@ int reiserfs_cache_default_acl(struct inode *dir);
extern struct xattr_handler reiserfs_posix_acl_default_handler; extern struct xattr_handler reiserfs_posix_acl_default_handler;
extern struct xattr_handler reiserfs_posix_acl_access_handler; extern struct xattr_handler reiserfs_posix_acl_access_handler;
static inline void reiserfs_init_acl_access(struct inode *inode)
{
REISERFS_I(inode)->i_acl_access = NULL;
}
static inline void reiserfs_init_acl_default(struct inode *inode)
{
REISERFS_I(inode)->i_acl_default = NULL;
}
#else #else
#define reiserfs_cache_default_acl(inode) 0 #define reiserfs_cache_default_acl(inode) 0
...@@ -86,12 +77,4 @@ reiserfs_inherit_default_acl(struct reiserfs_transaction_handle *th, ...@@ -86,12 +77,4 @@ reiserfs_inherit_default_acl(struct reiserfs_transaction_handle *th,
{ {
return 0; return 0;
} }
static inline void reiserfs_init_acl_access(struct inode *inode)
{
}
static inline void reiserfs_init_acl_default(struct inode *inode)
{
}
#endif #endif
...@@ -54,10 +54,6 @@ struct reiserfs_inode_info { ...@@ -54,10 +54,6 @@ struct reiserfs_inode_info {
unsigned int i_trans_id; unsigned int i_trans_id;
struct reiserfs_journal_list *i_jl; struct reiserfs_journal_list *i_jl;
struct mutex i_mmap; struct mutex i_mmap;
#ifdef CONFIG_REISERFS_FS_POSIX_ACL
struct posix_acl *i_acl_access;
struct posix_acl *i_acl_default;
#endif
#ifdef CONFIG_REISERFS_FS_XATTR #ifdef CONFIG_REISERFS_FS_XATTR
struct rw_semaphore i_xattr_sem; struct rw_semaphore i_xattr_sem;
#endif #endif
......
...@@ -19,10 +19,6 @@ struct shmem_inode_info { ...@@ -19,10 +19,6 @@ struct shmem_inode_info {
swp_entry_t i_direct[SHMEM_NR_DIRECT]; /* first blocks */ swp_entry_t i_direct[SHMEM_NR_DIRECT]; /* first blocks */
struct list_head swaplist; /* chain of maybes on swap */ struct list_head swaplist; /* chain of maybes on swap */
struct inode vfs_inode; struct inode vfs_inode;
#ifdef CONFIG_TMPFS_POSIX_ACL
struct posix_acl *i_acl;
struct posix_acl *i_default_acl;
#endif
}; };
struct shmem_sb_info { struct shmem_sb_info {
...@@ -45,7 +41,6 @@ static inline struct shmem_inode_info *SHMEM_I(struct inode *inode) ...@@ -45,7 +41,6 @@ static inline struct shmem_inode_info *SHMEM_I(struct inode *inode)
#ifdef CONFIG_TMPFS_POSIX_ACL #ifdef CONFIG_TMPFS_POSIX_ACL
int shmem_permission(struct inode *, int); int shmem_permission(struct inode *, int);
int shmem_acl_init(struct inode *, struct inode *); int shmem_acl_init(struct inode *, struct inode *);
void shmem_acl_destroy_inode(struct inode *);
extern struct xattr_handler shmem_xattr_acl_access_handler; extern struct xattr_handler shmem_xattr_acl_access_handler;
extern struct xattr_handler shmem_xattr_acl_default_handler; 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,9 +52,6 @@ static inline int shmem_acl_init(struct inode *inode, struct inode *dir)
{ {
return 0; return 0;
} }
static inline void shmem_acl_destroy_inode(struct inode *inode)
{
}
#endif /* CONFIG_TMPFS_POSIX_ACL */ #endif /* CONFIG_TMPFS_POSIX_ACL */
#endif #endif
...@@ -2379,6 +2379,10 @@ static struct inode *shmem_alloc_inode(struct super_block *sb) ...@@ -2379,6 +2379,10 @@ static struct inode *shmem_alloc_inode(struct super_block *sb)
p = (struct shmem_inode_info *)kmem_cache_alloc(shmem_inode_cachep, GFP_KERNEL); p = (struct shmem_inode_info *)kmem_cache_alloc(shmem_inode_cachep, GFP_KERNEL);
if (!p) if (!p)
return NULL; return NULL;
#ifdef CONFIG_TMPFS_POSIX_ACL
p->vfs_inode.i_acl = NULL;
p->vfs_inode.i_default_acl = NULL;
#endif
return &p->vfs_inode; return &p->vfs_inode;
} }
...@@ -2388,7 +2392,6 @@ static void shmem_destroy_inode(struct inode *inode) ...@@ -2388,7 +2392,6 @@ static void shmem_destroy_inode(struct inode *inode)
/* only struct inode is valid if it's an inline symlink */ /* only struct inode is valid if it's an inline symlink */
mpol_free_shared_policy(&SHMEM_I(inode)->policy); mpol_free_shared_policy(&SHMEM_I(inode)->policy);
} }
shmem_acl_destroy_inode(inode);
kmem_cache_free(shmem_inode_cachep, SHMEM_I(inode)); kmem_cache_free(shmem_inode_cachep, SHMEM_I(inode));
} }
...@@ -2397,10 +2400,6 @@ static void init_once(void *foo) ...@@ -2397,10 +2400,6 @@ static void init_once(void *foo)
struct shmem_inode_info *p = (struct shmem_inode_info *) foo; struct shmem_inode_info *p = (struct shmem_inode_info *) foo;
inode_init_once(&p->vfs_inode); inode_init_once(&p->vfs_inode);
#ifdef CONFIG_TMPFS_POSIX_ACL
p->i_acl = NULL;
p->i_default_acl = NULL;
#endif
} }
static int init_inodecache(void) static int init_inodecache(void)
......
...@@ -22,11 +22,11 @@ shmem_get_acl(struct inode *inode, int type) ...@@ -22,11 +22,11 @@ shmem_get_acl(struct inode *inode, int type)
spin_lock(&inode->i_lock); spin_lock(&inode->i_lock);
switch(type) { switch(type) {
case ACL_TYPE_ACCESS: case ACL_TYPE_ACCESS:
acl = posix_acl_dup(SHMEM_I(inode)->i_acl); acl = posix_acl_dup(inode->i_acl);
break; break;
case ACL_TYPE_DEFAULT: case ACL_TYPE_DEFAULT:
acl = posix_acl_dup(SHMEM_I(inode)->i_default_acl); acl = posix_acl_dup(inode->i_default_acl);
break; break;
} }
spin_unlock(&inode->i_lock); spin_unlock(&inode->i_lock);
...@@ -45,13 +45,13 @@ shmem_set_acl(struct inode *inode, int type, struct posix_acl *acl) ...@@ -45,13 +45,13 @@ shmem_set_acl(struct inode *inode, int type, struct posix_acl *acl)
spin_lock(&inode->i_lock); spin_lock(&inode->i_lock);
switch(type) { switch(type) {
case ACL_TYPE_ACCESS: case ACL_TYPE_ACCESS:
free = SHMEM_I(inode)->i_acl; free = inode->i_acl;
SHMEM_I(inode)->i_acl = posix_acl_dup(acl); inode->i_acl = posix_acl_dup(acl);
break; break;
case ACL_TYPE_DEFAULT: case ACL_TYPE_DEFAULT:
free = SHMEM_I(inode)->i_default_acl; free = inode->i_default_acl;
SHMEM_I(inode)->i_default_acl = posix_acl_dup(acl); inode->i_default_acl = posix_acl_dup(acl);
break; break;
} }
spin_unlock(&inode->i_lock); spin_unlock(&inode->i_lock);
...@@ -154,23 +154,6 @@ shmem_acl_init(struct inode *inode, struct inode *dir) ...@@ -154,23 +154,6 @@ shmem_acl_init(struct inode *inode, struct inode *dir)
return generic_acl_init(inode, dir, &shmem_acl_ops); return generic_acl_init(inode, dir, &shmem_acl_ops);
} }
/**
* shmem_acl_destroy_inode - destroy acls hanging off the in-memory inode
*
* This is done before destroying the actual inode.
*/
void
shmem_acl_destroy_inode(struct inode *inode)
{
if (SHMEM_I(inode)->i_acl)
posix_acl_release(SHMEM_I(inode)->i_acl);
SHMEM_I(inode)->i_acl = NULL;
if (SHMEM_I(inode)->i_default_acl)
posix_acl_release(SHMEM_I(inode)->i_default_acl);
SHMEM_I(inode)->i_default_acl = NULL;
}
/** /**
* shmem_check_acl - check_acl() callback for generic_permission() * shmem_check_acl - check_acl() callback for generic_permission()
*/ */
......
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