Message ID | 20131201120653.841554822@bombadil.infradead.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Sun 01-12-13 03:59:05, Christoph Hellwig wrote: > Factor out the code to get an ACL either from the inode or disk from > check_acl, so that it can be used elsewhere later on. > > Signed-off-by: Christoph Hellwig <hch@lst.de> Looks good. You can add: Reviewed-by: Jan Kara <jack@suse.cz> Honza > --- > fs/namei.c | 24 +++--------------------- > fs/posix_acl.c | 23 +++++++++++++++++++++++ > include/linux/posix_acl.h | 2 ++ > 3 files changed, 28 insertions(+), 21 deletions(-) > > diff --git a/fs/namei.c b/fs/namei.c > index c53d3a9..8acd1e8 100644 > --- a/fs/namei.c > +++ b/fs/namei.c > @@ -235,27 +235,9 @@ static int check_acl(struct inode *inode, int mask) > return posix_acl_permission(inode, acl, mask & ~MAY_NOT_BLOCK); > } > > - acl = get_cached_acl(inode, ACL_TYPE_ACCESS); > - > - /* > - * A filesystem can force a ACL callback by just never filling the > - * ACL cache. But normally you'd fill the cache either at inode > - * instantiation time, or on the first ->get_acl call. > - * > - * If the filesystem doesn't have a get_acl() function at all, we'll > - * just create the negative cache entry. > - */ > - if (acl == ACL_NOT_CACHED) { > - if (inode->i_op->get_acl) { > - acl = inode->i_op->get_acl(inode, ACL_TYPE_ACCESS); > - if (IS_ERR(acl)) > - return PTR_ERR(acl); > - } else { > - set_cached_acl(inode, ACL_TYPE_ACCESS, NULL); > - return -EAGAIN; > - } > - } > - > + acl = get_acl(inode, ACL_TYPE_ACCESS); > + if (IS_ERR(acl)) > + return PTR_ERR(acl); > if (acl) { > int error = posix_acl_permission(inode, acl, mask); > posix_acl_release(acl); > diff --git a/fs/posix_acl.c b/fs/posix_acl.c > index 8bd2135..9dd03e0 100644 > --- a/fs/posix_acl.c > +++ b/fs/posix_acl.c > @@ -418,3 +418,26 @@ posix_acl_chmod(struct posix_acl **acl, gfp_t gfp, umode_t mode) > return err; > } > EXPORT_SYMBOL(posix_acl_chmod); > + > +struct posix_acl *get_acl(struct inode *inode, int type) > +{ > + struct posix_acl *acl; > + > + acl = get_cached_acl(inode, type); > + if (acl != ACL_NOT_CACHED) > + return acl; > + > + /* > + * A filesystem can force a ACL callback by just never filling the > + * ACL cache. But normally you'd fill the cache either at inode > + * instantiation time, or on the first ->get_acl call. > + * > + * If the filesystem doesn't have a get_acl() function at all, we'll > + * just create the negative cache entry. > + */ > + if (!inode->i_op->get_acl) { > + set_cached_acl(inode, type, NULL); > + return ERR_PTR(-EAGAIN); > + } > + return inode->i_op->get_acl(inode, type); > +} > diff --git a/include/linux/posix_acl.h b/include/linux/posix_acl.h > index 7931efe..a8d9918 100644 > --- a/include/linux/posix_acl.h > +++ b/include/linux/posix_acl.h > @@ -175,4 +175,6 @@ static inline void cache_no_acl(struct inode *inode) > #endif > } > > +struct posix_acl *get_acl(struct inode *inode, int type); > + > #endif /* __LINUX_POSIX_ACL_H */ > -- > 1.7.10.4 > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/fs/namei.c b/fs/namei.c index c53d3a9..8acd1e8 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -235,27 +235,9 @@ static int check_acl(struct inode *inode, int mask) return posix_acl_permission(inode, acl, mask & ~MAY_NOT_BLOCK); } - acl = get_cached_acl(inode, ACL_TYPE_ACCESS); - - /* - * A filesystem can force a ACL callback by just never filling the - * ACL cache. But normally you'd fill the cache either at inode - * instantiation time, or on the first ->get_acl call. - * - * If the filesystem doesn't have a get_acl() function at all, we'll - * just create the negative cache entry. - */ - if (acl == ACL_NOT_CACHED) { - if (inode->i_op->get_acl) { - acl = inode->i_op->get_acl(inode, ACL_TYPE_ACCESS); - if (IS_ERR(acl)) - return PTR_ERR(acl); - } else { - set_cached_acl(inode, ACL_TYPE_ACCESS, NULL); - return -EAGAIN; - } - } - + acl = get_acl(inode, ACL_TYPE_ACCESS); + if (IS_ERR(acl)) + return PTR_ERR(acl); if (acl) { int error = posix_acl_permission(inode, acl, mask); posix_acl_release(acl); diff --git a/fs/posix_acl.c b/fs/posix_acl.c index 8bd2135..9dd03e0 100644 --- a/fs/posix_acl.c +++ b/fs/posix_acl.c @@ -418,3 +418,26 @@ posix_acl_chmod(struct posix_acl **acl, gfp_t gfp, umode_t mode) return err; } EXPORT_SYMBOL(posix_acl_chmod); + +struct posix_acl *get_acl(struct inode *inode, int type) +{ + struct posix_acl *acl; + + acl = get_cached_acl(inode, type); + if (acl != ACL_NOT_CACHED) + return acl; + + /* + * A filesystem can force a ACL callback by just never filling the + * ACL cache. But normally you'd fill the cache either at inode + * instantiation time, or on the first ->get_acl call. + * + * If the filesystem doesn't have a get_acl() function at all, we'll + * just create the negative cache entry. + */ + if (!inode->i_op->get_acl) { + set_cached_acl(inode, type, NULL); + return ERR_PTR(-EAGAIN); + } + return inode->i_op->get_acl(inode, type); +} diff --git a/include/linux/posix_acl.h b/include/linux/posix_acl.h index 7931efe..a8d9918 100644 --- a/include/linux/posix_acl.h +++ b/include/linux/posix_acl.h @@ -175,4 +175,6 @@ static inline void cache_no_acl(struct inode *inode) #endif } +struct posix_acl *get_acl(struct inode *inode, int type); + #endif /* __LINUX_POSIX_ACL_H */
Factor out the code to get an ACL either from the inode or disk from check_acl, so that it can be used elsewhere later on. Signed-off-by: Christoph Hellwig <hch@lst.de> --- fs/namei.c | 24 +++--------------------- fs/posix_acl.c | 23 +++++++++++++++++++++++ include/linux/posix_acl.h | 2 ++ 3 files changed, 28 insertions(+), 21 deletions(-)