vfs: add rcu argument to ->get_acl() callback
authorMiklos Szeredi <mszeredi@redhat.com>
Wed, 18 Aug 2021 20:08:24 +0000 (22:08 +0200)
committerMiklos Szeredi <mszeredi@redhat.com>
Wed, 18 Aug 2021 20:08:24 +0000 (22:08 +0200)
Add a rcu argument to the ->get_acl() callback to allow
get_cached_acl_rcu() to call the ->get_acl() method in the next patch.

Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
39 files changed:
Documentation/filesystems/locking.rst
Documentation/filesystems/vfs.rst
fs/9p/acl.c
fs/9p/acl.h
fs/bad_inode.c
fs/btrfs/acl.c
fs/btrfs/ctree.h
fs/ceph/acl.c
fs/ceph/super.h
fs/erofs/xattr.c
fs/erofs/xattr.h
fs/ext2/acl.c
fs/ext2/acl.h
fs/ext4/acl.c
fs/ext4/acl.h
fs/f2fs/acl.c
fs/f2fs/acl.h
fs/fuse/acl.c
fs/fuse/fuse_i.h
fs/gfs2/acl.c
fs/gfs2/acl.h
fs/jffs2/acl.c
fs/jffs2/acl.h
fs/jfs/acl.c
fs/jfs/jfs_acl.h
fs/nfs/nfs3_fs.h
fs/nfs/nfs3acl.c
fs/ocfs2/acl.c
fs/ocfs2/acl.h
fs/orangefs/acl.c
fs/orangefs/orangefs-kernel.h
fs/overlayfs/inode.c
fs/overlayfs/overlayfs.h
fs/posix_acl.c
fs/reiserfs/acl.h
fs/reiserfs/xattr_acl.c
fs/xfs/xfs_acl.c
fs/xfs/xfs_acl.h
include/linux/fs.h

index 2183fd8cc350457a0cff3a42d15cdccba8594a36..899fa9aba01a936ee16d3b32f2161b98b6cb4c28 100644 (file)
@@ -70,7 +70,7 @@ prototypes::
        const char *(*get_link) (struct dentry *, struct inode *, struct delayed_call *);
        void (*truncate) (struct inode *);
        int (*permission) (struct inode *, int, unsigned int);
-       int (*get_acl)(struct inode *, int);
+       struct posix_acl * (*get_acl)(struct inode *, int, bool);
        int (*setattr) (struct dentry *, struct iattr *);
        int (*getattr) (const struct path *, struct kstat *, u32, unsigned int);
        ssize_t (*listxattr) (struct dentry *, char *, size_t);
index 14c31eced416a16d9649f41706994f5fa94d59b5..bf5c48066fac5a3175ae7704152c5beca185cd4a 100644 (file)
@@ -432,7 +432,7 @@ As of kernel 2.6.22, the following members are defined:
                const char *(*get_link) (struct dentry *, struct inode *,
                                         struct delayed_call *);
                int (*permission) (struct user_namespace *, struct inode *, int);
-               int (*get_acl)(struct inode *, int);
+               struct posix_acl * (*get_acl)(struct inode *, int, bool);
                int (*setattr) (struct user_namespace *, struct dentry *, struct iattr *);
                int (*getattr) (struct user_namespace *, const struct path *, struct kstat *, u32, unsigned int);
                ssize_t (*listxattr) (struct dentry *, char *, size_t);
index bb1b286c49ae47af20dc71c3b3078fa2ef80dce9..c381499f541606de9bed621bd98210f7240aff9c 100644 (file)
@@ -97,10 +97,13 @@ static struct posix_acl *v9fs_get_cached_acl(struct inode *inode, int type)
        return acl;
 }
 
-struct posix_acl *v9fs_iop_get_acl(struct inode *inode, int type)
+struct posix_acl *v9fs_iop_get_acl(struct inode *inode, int type, bool rcu)
 {
        struct v9fs_session_info *v9ses;
 
+       if (rcu)
+               return ERR_PTR(-ECHILD);
+
        v9ses = v9fs_inode2v9ses(inode);
        if (((v9ses->flags & V9FS_ACCESS_MASK) != V9FS_ACCESS_CLIENT) ||
                        ((v9ses->flags & V9FS_ACL_MASK) != V9FS_POSIX_ACL)) {
index e4f7e882272b780c9bc8391ac385a50a067cb899..d43c8949e807bc78db3404874752eef7bd724139 100644 (file)
@@ -16,7 +16,7 @@
 
 #ifdef CONFIG_9P_FS_POSIX_ACL
 extern int v9fs_get_acl(struct inode *, struct p9_fid *);
-extern struct posix_acl *v9fs_iop_get_acl(struct inode *inode, int type);
+extern struct posix_acl *v9fs_iop_get_acl(struct inode *inode, int type, bool rcu);
 extern int v9fs_acl_chmod(struct inode *, struct p9_fid *);
 extern int v9fs_set_create_acl(struct inode *, struct p9_fid *,
                               struct posix_acl *, struct posix_acl *);
index 48e16144c1f7b44963704cb117beeb89de3fbfd1..12b8fdcc445bbd115bf34390b51c7efc83eb0455 100644 (file)
@@ -121,7 +121,7 @@ static const char *bad_inode_get_link(struct dentry *dentry,
        return ERR_PTR(-EIO);
 }
 
-static struct posix_acl *bad_inode_get_acl(struct inode *inode, int type)
+static struct posix_acl *bad_inode_get_acl(struct inode *inode, int type, bool rcu)
 {
        return ERR_PTR(-EIO);
 }
index d95eb5c8cb3736e5bd204167a1e9f2358849926d..3d00bb5deded35843849d2b12f8d51c49f81b3d1 100644 (file)
 #include "btrfs_inode.h"
 #include "xattr.h"
 
-struct posix_acl *btrfs_get_acl(struct inode *inode, int type)
+struct posix_acl *btrfs_get_acl(struct inode *inode, int type, bool rcu)
 {
        int size;
        const char *name;
        char *value = NULL;
        struct posix_acl *acl;
 
+       if (rcu)
+               return ERR_PTR(-ECHILD);
+
        switch (type) {
        case ACL_TYPE_ACCESS:
                name = XATTR_NAME_POSIX_ACL_ACCESS;
index e5e53e592d4f99650423fb88f2c4c18d7e13ef97..ca5c7cb1b729ba5bc1cde108e2897fa547abb1f1 100644 (file)
@@ -3686,7 +3686,7 @@ static inline int __btrfs_fs_compat_ro(struct btrfs_fs_info *fs_info, u64 flag)
 
 /* acl.c */
 #ifdef CONFIG_BTRFS_FS_POSIX_ACL
-struct posix_acl *btrfs_get_acl(struct inode *inode, int type);
+struct posix_acl *btrfs_get_acl(struct inode *inode, int type, bool rcu);
 int btrfs_set_acl(struct user_namespace *mnt_userns, struct inode *inode,
                  struct posix_acl *acl, int type);
 int btrfs_init_acl(struct btrfs_trans_handle *trans,
index 529af59d9fd30cbc9041ca25a3f6d86a2f4d7623..f4fc8e0b847cc609e6af90a7c2afc1b96bfc1b37 100644 (file)
@@ -29,7 +29,7 @@ static inline void ceph_set_cached_acl(struct inode *inode,
        spin_unlock(&ci->i_ceph_lock);
 }
 
-struct posix_acl *ceph_get_acl(struct inode *inode, int type)
+struct posix_acl *ceph_get_acl(struct inode *inode, int type, bool rcu)
 {
        int size;
        unsigned int retry_cnt = 0;
@@ -37,6 +37,9 @@ struct posix_acl *ceph_get_acl(struct inode *inode, int type)
        char *value = NULL;
        struct posix_acl *acl;
 
+       if (rcu)
+               return ERR_PTR(-ECHILD);
+
        switch (type) {
        case ACL_TYPE_ACCESS:
                name = XATTR_NAME_POSIX_ACL_ACCESS;
index 9215a2f4535c8a36b15ece2120340321d0536ee2..b9512684e150cb8fcb16a86eaec7211ebd7de8fc 100644 (file)
@@ -1087,7 +1087,7 @@ void ceph_release_acl_sec_ctx(struct ceph_acl_sec_ctx *as_ctx);
 /* acl.c */
 #ifdef CONFIG_CEPH_FS_POSIX_ACL
 
-struct posix_acl *ceph_get_acl(struct inode *, int);
+struct posix_acl *ceph_get_acl(struct inode *, int, bool);
 int ceph_set_acl(struct user_namespace *mnt_userns,
                 struct inode *inode, struct posix_acl *acl, int type);
 int ceph_pre_init_acls(struct inode *dir, umode_t *mode,
index 8dd54b420a1d685fa49cc4c761f8520d4ec73a68..778f2c52295d1ed8901651ceaf2d3e1acba48ec1 100644 (file)
@@ -673,12 +673,15 @@ ssize_t erofs_listxattr(struct dentry *dentry,
 }
 
 #ifdef CONFIG_EROFS_FS_POSIX_ACL
-struct posix_acl *erofs_get_acl(struct inode *inode, int type)
+struct posix_acl *erofs_get_acl(struct inode *inode, int type, bool rcu)
 {
        struct posix_acl *acl;
        int prefix, rc;
        char *value = NULL;
 
+       if (rcu)
+               return ERR_PTR(-ECHILD);
+
        switch (type) {
        case ACL_TYPE_ACCESS:
                prefix = EROFS_XATTR_INDEX_POSIX_ACL_ACCESS;
index 366dcb400525f01297236a11644ce797628e033b..94090c74b3f7a37b17800ee7cfdffe92dc1c06d7 100644 (file)
@@ -80,7 +80,7 @@ static inline int erofs_getxattr(struct inode *inode, int index,
 #endif /* !CONFIG_EROFS_FS_XATTR */
 
 #ifdef CONFIG_EROFS_FS_POSIX_ACL
-struct posix_acl *erofs_get_acl(struct inode *inode, int type);
+struct posix_acl *erofs_get_acl(struct inode *inode, int type, bool rcu);
 #else
 #define erofs_get_acl  (NULL)
 #endif
index b9a9db98e94b916f904ca2217faee9ac99a3b157..bf298967c5b815b1e613abcff3bd50802e395413 100644 (file)
@@ -141,13 +141,16 @@ fail:
  * inode->i_mutex: don't care
  */
 struct posix_acl *
-ext2_get_acl(struct inode *inode, int type)
+ext2_get_acl(struct inode *inode, int type, bool rcu)
 {
        int name_index;
        char *value = NULL;
        struct posix_acl *acl;
        int retval;
 
+       if (rcu)
+               return ERR_PTR(-ECHILD);
+
        switch (type) {
        case ACL_TYPE_ACCESS:
                name_index = EXT2_XATTR_INDEX_POSIX_ACL_ACCESS;
index 917db5f6630a7b8df2d8b878912d3ef35081c0a4..925ab6287d35adfe041b8f151014f8615a5dabea 100644 (file)
@@ -55,7 +55,7 @@ static inline int ext2_acl_count(size_t size)
 #ifdef CONFIG_EXT2_FS_POSIX_ACL
 
 /* acl.c */
-extern struct posix_acl *ext2_get_acl(struct inode *inode, int type);
+extern struct posix_acl *ext2_get_acl(struct inode *inode, int type, bool rcu);
 extern int ext2_set_acl(struct user_namespace *mnt_userns, struct inode *inode,
                        struct posix_acl *acl, int type);
 extern int ext2_init_acl (struct inode *, struct inode *);
index c5eaffccecc33935ce6a14516bdf11bb0c52bf10..0613dfcbfd4aa7490096c5707ee9ce38a85a333a 100644 (file)
@@ -142,13 +142,16 @@ fail:
  * inode->i_mutex: don't care
  */
 struct posix_acl *
-ext4_get_acl(struct inode *inode, int type)
+ext4_get_acl(struct inode *inode, int type, bool rcu)
 {
        int name_index;
        char *value = NULL;
        struct posix_acl *acl;
        int retval;
 
+       if (rcu)
+               return ERR_PTR(-ECHILD);
+
        switch (type) {
        case ACL_TYPE_ACCESS:
                name_index = EXT4_XATTR_INDEX_POSIX_ACL_ACCESS;
index 84b8942a57f23e5b2ee58583294eaaee1d66794c..3219669732bf412f7429fd12ba3ca2dc6d087dfd 100644 (file)
@@ -55,7 +55,7 @@ static inline int ext4_acl_count(size_t size)
 #ifdef CONFIG_EXT4_FS_POSIX_ACL
 
 /* acl.c */
-struct posix_acl *ext4_get_acl(struct inode *inode, int type);
+struct posix_acl *ext4_get_acl(struct inode *inode, int type, bool rcu);
 int ext4_set_acl(struct user_namespace *mnt_userns, struct inode *inode,
                 struct posix_acl *acl, int type);
 extern int ext4_init_acl(handle_t *, struct inode *, struct inode *);
index 239ad9453b998b39180bc864934fe88e01a7a43b..16e826e01f095c39289c70cb3b5ce0006f83933b 100644 (file)
@@ -196,8 +196,11 @@ static struct posix_acl *__f2fs_get_acl(struct inode *inode, int type,
        return acl;
 }
 
-struct posix_acl *f2fs_get_acl(struct inode *inode, int type)
+struct posix_acl *f2fs_get_acl(struct inode *inode, int type, bool rcu)
 {
+       if (rcu)
+               return ERR_PTR(-ECHILD);
+
        return __f2fs_get_acl(inode, type, NULL);
 }
 
index 986fd1bc780bb844b7c24b495c1beb100962c5bc..a26e33cab4fffa1a942d44d2a1aa237f64cf68d2 100644 (file)
@@ -33,7 +33,7 @@ struct f2fs_acl_header {
 
 #ifdef CONFIG_F2FS_FS_POSIX_ACL
 
-extern struct posix_acl *f2fs_get_acl(struct inode *, int);
+extern struct posix_acl *f2fs_get_acl(struct inode *, int, bool);
 extern int f2fs_set_acl(struct user_namespace *, struct inode *,
                        struct posix_acl *, int);
 extern int f2fs_init_acl(struct inode *, struct inode *, struct page *,
index 52b165319be1fd26c610ca1f5017e6e1fe903b6f..337cb29a8dd5cc6719eb3c660c7ee9fff74564de 100644 (file)
@@ -11,7 +11,7 @@
 #include <linux/posix_acl.h>
 #include <linux/posix_acl_xattr.h>
 
-struct posix_acl *fuse_get_acl(struct inode *inode, int type)
+struct posix_acl *fuse_get_acl(struct inode *inode, int type, bool rcu)
 {
        struct fuse_conn *fc = get_fuse_conn(inode);
        int size;
@@ -19,6 +19,9 @@ struct posix_acl *fuse_get_acl(struct inode *inode, int type)
        void *value = NULL;
        struct posix_acl *acl;
 
+       if (rcu)
+               return ERR_PTR(-ECHILD);
+
        if (fuse_is_bad(inode))
                return ERR_PTR(-EIO);
 
index 07829ce78695b9a14c06c73d9491ff820be5dba2..f4140943311a20e86155d9f4620b5b28bf6514dc 100644 (file)
@@ -1216,7 +1216,7 @@ extern const struct xattr_handler *fuse_acl_xattr_handlers[];
 extern const struct xattr_handler *fuse_no_acl_xattr_handlers[];
 
 struct posix_acl;
-struct posix_acl *fuse_get_acl(struct inode *inode, int type);
+struct posix_acl *fuse_get_acl(struct inode *inode, int type, bool rcu);
 int fuse_set_acl(struct user_namespace *mnt_userns, struct inode *inode,
                 struct posix_acl *acl, int type);
 
index 9165d70ead077d81769ee2b3ca60b8ecad82c69a..734d1f05d8236b3160861221f86d4e9a1bb77555 100644 (file)
@@ -57,13 +57,16 @@ static struct posix_acl *__gfs2_get_acl(struct inode *inode, int type)
        return acl;
 }
 
-struct posix_acl *gfs2_get_acl(struct inode *inode, int type)
+struct posix_acl *gfs2_get_acl(struct inode *inode, int type, bool rcu)
 {
        struct gfs2_inode *ip = GFS2_I(inode);
        struct gfs2_holder gh;
        bool need_unlock = false;
        struct posix_acl *acl;
 
+       if (rcu)
+               return ERR_PTR(-ECHILD);
+
        if (!gfs2_glock_is_locked_by_me(ip->i_gl)) {
                int ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED,
                                             LM_FLAG_ANY, &gh);
index eccc6a43326c5a763672389338b0702072b33ec9..cd180ca7c95916e32162d5a251752ae2a01f0988 100644 (file)
@@ -11,7 +11,7 @@
 
 #define GFS2_ACL_MAX_ENTRIES(sdp) ((300 << (sdp)->sd_sb.sb_bsize_shift) >> 12)
 
-extern struct posix_acl *gfs2_get_acl(struct inode *inode, int type);
+extern struct posix_acl *gfs2_get_acl(struct inode *inode, int type, bool rcu);
 extern int __gfs2_set_acl(struct inode *inode, struct posix_acl *acl, int type);
 extern int gfs2_set_acl(struct user_namespace *mnt_userns, struct inode *inode,
                        struct posix_acl *acl, int type);
index 55a79df70d24a47dab6ab10472f3d587eefb585c..e945e348478803d4ec1aedac0d9c3459809edc91 100644 (file)
@@ -173,12 +173,15 @@ static void *jffs2_acl_to_medium(const struct posix_acl *acl, size_t *size)
        return ERR_PTR(-EINVAL);
 }
 
-struct posix_acl *jffs2_get_acl(struct inode *inode, int type)
+struct posix_acl *jffs2_get_acl(struct inode *inode, int type, bool rcu)
 {
        struct posix_acl *acl;
        char *value = NULL;
        int rc, xprefix;
 
+       if (rcu)
+               return ERR_PTR(-ECHILD);
+
        switch (type) {
        case ACL_TYPE_ACCESS:
                xprefix = JFFS2_XPREFIX_ACL_ACCESS;
index 62c50da9d493b97b37134f1903a0506ddb1e3dc3..9d9fb7cf093efeb8cf90e2e0dd6540a171d4d573 100644 (file)
@@ -27,7 +27,7 @@ struct jffs2_acl_header {
 
 #ifdef CONFIG_JFFS2_FS_POSIX_ACL
 
-struct posix_acl *jffs2_get_acl(struct inode *inode, int type);
+struct posix_acl *jffs2_get_acl(struct inode *inode, int type, bool rcu);
 int jffs2_set_acl(struct user_namespace *mnt_userns, struct inode *inode,
                  struct posix_acl *acl, int type);
 extern int jffs2_init_acl_pre(struct inode *, struct inode *, umode_t *);
index 43c285c3d2a78398797a7a3e1f39fcba83ec7a65..a653f34c6e263ab755b71d6701bc83753f479780 100644 (file)
 #include "jfs_xattr.h"
 #include "jfs_acl.h"
 
-struct posix_acl *jfs_get_acl(struct inode *inode, int type)
+struct posix_acl *jfs_get_acl(struct inode *inode, int type, bool rcu)
 {
        struct posix_acl *acl;
        char *ea_name;
        int size;
        char *value = NULL;
 
+       if (rcu)
+               return ERR_PTR(-ECHILD);
+
        switch(type) {
                case ACL_TYPE_ACCESS:
                        ea_name = XATTR_NAME_POSIX_ACL_ACCESS;
index 7ae389a7a36660685c8a57e8a245c02aef095a8e..3de40286d31f8bd56f5f0df6cf47286504567189 100644 (file)
@@ -7,7 +7,7 @@
 
 #ifdef CONFIG_JFS_POSIX_ACL
 
-struct posix_acl *jfs_get_acl(struct inode *inode, int type);
+struct posix_acl *jfs_get_acl(struct inode *inode, int type, bool rcu);
 int jfs_set_acl(struct user_namespace *mnt_userns, struct inode *inode,
                struct posix_acl *acl, int type);
 int jfs_init_acl(tid_t, struct inode *, struct inode *);
index c8a192802dda3fd5e670ea75183834703960b399..03a4e679fd995b24c90a290ce18b8da1bbb9fc43 100644 (file)
@@ -11,7 +11,7 @@
  * nfs3acl.c
  */
 #ifdef CONFIG_NFS_V3_ACL
-extern struct posix_acl *nfs3_get_acl(struct inode *inode, int type);
+extern struct posix_acl *nfs3_get_acl(struct inode *inode, int type, bool rcu);
 extern int nfs3_set_acl(struct user_namespace *mnt_userns, struct inode *inode,
                        struct posix_acl *acl, int type);
 extern int nfs3_proc_setacls(struct inode *inode, struct posix_acl *acl,
index 9ec560aa4a50bb2fa40ea36bddbbcf4cb17d20ff..93de0b58647a09c869fb736ad6eef8f991c2f87b 100644 (file)
@@ -44,7 +44,7 @@ static void nfs3_abort_get_acl(struct posix_acl **p)
        cmpxchg(p, sentinel, ACL_NOT_CACHED);
 }
 
-struct posix_acl *nfs3_get_acl(struct inode *inode, int type)
+struct posix_acl *nfs3_get_acl(struct inode *inode, int type, bool rcu)
 {
        struct nfs_server *server = NFS_SERVER(inode);
        struct page *pages[NFSACL_MAXPAGES] = { };
@@ -62,6 +62,9 @@ struct posix_acl *nfs3_get_acl(struct inode *inode, int type)
        };
        int status, count;
 
+       if (rcu)
+               return ERR_PTR(-ECHILD);
+
        if (!nfs_server_capable(inode, NFS_CAP_ACLS))
                return ERR_PTR(-EOPNOTSUPP);
 
index 5c72a7e6d6c58ffd050e74dac14c7247539daf8e..23a72a423955e0c1b9dc1f3cd4c99d8e99532a11 100644 (file)
@@ -289,7 +289,7 @@ unlock:
        return status;
 }
 
-struct posix_acl *ocfs2_iop_get_acl(struct inode *inode, int type)
+struct posix_acl *ocfs2_iop_get_acl(struct inode *inode, int type, bool rcu)
 {
        struct ocfs2_super *osb;
        struct buffer_head *di_bh = NULL;
@@ -297,6 +297,9 @@ struct posix_acl *ocfs2_iop_get_acl(struct inode *inode, int type)
        int had_lock;
        struct ocfs2_lock_holder oh;
 
+       if (rcu)
+               return ERR_PTR(-ECHILD);
+
        osb = OCFS2_SB(inode->i_sb);
        if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL))
                return NULL;
index f59d8d0a61fafc0da77ea3b978f5af36b3c87ae5..95a57c888ab62239bbc4ee73681a330cffe941e4 100644 (file)
@@ -16,7 +16,7 @@ struct ocfs2_acl_entry {
        __le32 e_id;
 };
 
-struct posix_acl *ocfs2_iop_get_acl(struct inode *inode, int type);
+struct posix_acl *ocfs2_iop_get_acl(struct inode *inode, int type, bool rcu);
 int ocfs2_iop_set_acl(struct user_namespace *mnt_userns, struct inode *inode,
                      struct posix_acl *acl, int type);
 extern int ocfs2_acl_chmod(struct inode *, struct buffer_head *);
index 18852b9ed82b785999ee5081d7308707348ca9ee..605e5a3506ec25b0898292eb1098e77b7f82b3d5 100644 (file)
 #include "orangefs-bufmap.h"
 #include <linux/posix_acl_xattr.h>
 
-struct posix_acl *orangefs_get_acl(struct inode *inode, int type)
+struct posix_acl *orangefs_get_acl(struct inode *inode, int type, bool rcu)
 {
        struct posix_acl *acl;
        int ret;
        char *key = NULL, *value = NULL;
 
+       if (rcu)
+               return ERR_PTR(-ECHILD);
+
        switch (type) {
        case ACL_TYPE_ACCESS:
                key = XATTR_NAME_POSIX_ACL_ACCESS;
index 0e6b97682e41ac6963740d239b984560427ebdbb..b5940ec1836a39cbdbbe4b7d218ea2108ed13988 100644 (file)
@@ -106,7 +106,7 @@ enum orangefs_vfs_op_states {
 extern int orangefs_init_acl(struct inode *inode, struct inode *dir);
 extern const struct xattr_handler *orangefs_xattr_handlers[];
 
-extern struct posix_acl *orangefs_get_acl(struct inode *inode, int type);
+extern struct posix_acl *orangefs_get_acl(struct inode *inode, int type, bool rcu);
 extern int orangefs_set_acl(struct user_namespace *mnt_userns,
                            struct inode *inode, struct posix_acl *acl,
                            int type);
index 7d52e5ef2ac74c2c23a82c46b94b2674a82bee3e..ea335d3e55cfb755f1bbbd9075b4b9cac891782f 100644 (file)
@@ -446,12 +446,15 @@ ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size)
        return res;
 }
 
-struct posix_acl *ovl_get_acl(struct inode *inode, int type)
+struct posix_acl *ovl_get_acl(struct inode *inode, int type, bool rcu)
 {
        struct inode *realinode = ovl_inode_real(inode);
        const struct cred *old_cred;
        struct posix_acl *acl;
 
+       if (rcu)
+               return ERR_PTR(-ECHILD);
+
        if (!IS_ENABLED(CONFIG_FS_POSIX_ACL) || !IS_POSIXACL(realinode))
                return NULL;
 
index e9b3e7880fc01e2301aa6c4384016d5990fa32fb..3894f3347955215f74a075bd9dfb55dd440eb637 100644 (file)
@@ -498,7 +498,7 @@ int ovl_xattr_set(struct dentry *dentry, struct inode *inode, const char *name,
 int ovl_xattr_get(struct dentry *dentry, struct inode *inode, const char *name,
                  void *value, size_t size);
 ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size);
-struct posix_acl *ovl_get_acl(struct inode *inode, int type);
+struct posix_acl *ovl_get_acl(struct inode *inode, int type, bool rcu);
 int ovl_update_time(struct inode *inode, struct timespec64 *ts, int flags);
 bool ovl_is_private_xattr(struct super_block *sb, const char *name);
 
index f3309a7edb49d3f18531d1a423334a8c31835059..4f1ef826e04043f98f360f73d69f4d693bb7e583 100644 (file)
@@ -138,7 +138,7 @@ struct posix_acl *get_acl(struct inode *inode, int type)
                set_cached_acl(inode, type, NULL);
                return NULL;
        }
-       acl = inode->i_op->get_acl(inode, type);
+       acl = inode->i_op->get_acl(inode, type, false);
 
        if (IS_ERR(acl)) {
                /*
index fd58618da3607398e60e724eb9c48028880bdc70..d9052b8ce6dd9425e093938eff0ad6a487521dac 100644 (file)
@@ -48,7 +48,7 @@ static inline int reiserfs_acl_count(size_t size)
 }
 
 #ifdef CONFIG_REISERFS_FS_POSIX_ACL
-struct posix_acl *reiserfs_get_acl(struct inode *inode, int type);
+struct posix_acl *reiserfs_get_acl(struct inode *inode, int type, bool rcu);
 int reiserfs_set_acl(struct user_namespace *mnt_userns, struct inode *inode,
                     struct posix_acl *acl, int type);
 int reiserfs_acl_chmod(struct inode *inode);
index a9547144a09995104d530add71577dd61fe02c3d..d6fcddc46f5b7f59a0d3299c814f3b57635fb40c 100644 (file)
@@ -190,13 +190,16 @@ fail:
  * inode->i_mutex: down
  * BKL held [before 2.5.x]
  */
-struct posix_acl *reiserfs_get_acl(struct inode *inode, int type)
+struct posix_acl *reiserfs_get_acl(struct inode *inode, int type, bool rcu)
 {
        char *name, *value;
        struct posix_acl *acl;
        int size;
        int retval;
 
+       if (rcu)
+               return ERR_PTR(-ECHILD);
+
        switch (type) {
        case ACL_TYPE_ACCESS:
                name = XATTR_NAME_POSIX_ACL_ACCESS;
index d02bef24b32b2c38d6118e6312c4a081c7921d06..9e8ac9fa9666958f3141eed291afff25ee1423b0 100644 (file)
@@ -125,7 +125,7 @@ xfs_acl_to_disk(struct xfs_acl *aclp, const struct posix_acl *acl)
 }
 
 struct posix_acl *
-xfs_get_acl(struct inode *inode, int type)
+xfs_get_acl(struct inode *inode, int type, bool rcu)
 {
        struct xfs_inode        *ip = XFS_I(inode);
        struct xfs_mount        *mp = ip->i_mount;
@@ -137,6 +137,9 @@ xfs_get_acl(struct inode *inode, int type)
        };
        int                     error;
 
+       if (rcu)
+               return ERR_PTR(-ECHILD);
+
        trace_xfs_get_acl(ip);
 
        switch (type) {
index 7bdb3a4ed798f990dc8a69595ddbdbc44b0ed08e..bb6abdcb265da6979d722d7345b11e8ae6ff5a6b 100644 (file)
@@ -10,13 +10,13 @@ struct inode;
 struct posix_acl;
 
 #ifdef CONFIG_XFS_POSIX_ACL
-extern struct posix_acl *xfs_get_acl(struct inode *inode, int type);
+extern struct posix_acl *xfs_get_acl(struct inode *inode, int type, bool rcu);
 extern int xfs_set_acl(struct user_namespace *mnt_userns, struct inode *inode,
                       struct posix_acl *acl, int type);
 extern int __xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type);
 void xfs_forget_acl(struct inode *inode, const char *name);
 #else
-static inline struct posix_acl *xfs_get_acl(struct inode *inode, int type)
+static inline struct posix_acl *xfs_get_acl(struct inode *inode, int type, bool rcu)
 {
        return NULL;
 }
index ae6c6c34db944391867d205e5b64184145b75a82..73376dfe28d013bbd4fb1e6e423d7c6ce879a389 100644 (file)
@@ -2065,7 +2065,7 @@ struct inode_operations {
        struct dentry * (*lookup) (struct inode *,struct dentry *, unsigned int);
        const char * (*get_link) (struct dentry *, struct inode *, struct delayed_call *);
        int (*permission) (struct user_namespace *, struct inode *, int);
-       struct posix_acl * (*get_acl)(struct inode *, int);
+       struct posix_acl * (*get_acl)(struct inode *, int, bool);
 
        int (*readlink) (struct dentry *, char __user *,int);