Am Mo., 20. Apr. 2020 um 14:15 Uhr schrieb Trond Myklebust <trondmy@xxxxxxxxxxxxxxx>: > I don't really see any alternative to adding a 'dfalloc' to track the > allocated dfacl separately. Something like the attached patch should work as well. Thanks, Andreas --- fs/nfs/nfs3acl.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/fs/nfs/nfs3acl.c b/fs/nfs/nfs3acl.c index c5c3fc6e6c60..f1581f11c220 100644 --- a/fs/nfs/nfs3acl.c +++ b/fs/nfs/nfs3acl.c @@ -253,37 +253,41 @@ int nfs3_proc_setacls(struct inode *inode, struct posix_acl *acl, int nfs3_set_acl(struct inode *inode, struct posix_acl *acl, int type) { - struct posix_acl *alloc = NULL, *dfacl = NULL; + struct posix_acl *orig = acl, *dfacl = NULL; int status; if (S_ISDIR(inode->i_mode)) { switch(type) { case ACL_TYPE_ACCESS: - alloc = dfacl = get_acl(inode, ACL_TYPE_DEFAULT); - if (IS_ERR(alloc)) - goto fail; + dfacl = get_acl(inode, ACL_TYPE_DEFAULT); + status = PTR_ERR(dfacl); + if (IS_ERR(dfacl)) + goto out; break; case ACL_TYPE_DEFAULT: dfacl = acl; - alloc = acl = get_acl(inode, ACL_TYPE_ACCESS); - if (IS_ERR(alloc)) - goto fail; + acl = get_acl(inode, ACL_TYPE_ACCESS); + status = PTR_ERR(acl); + if (IS_ERR(acl)) + goto out; break; } } if (acl == NULL) { - alloc = acl = posix_acl_from_mode(inode->i_mode, GFP_KERNEL); - if (IS_ERR(alloc)) - goto fail; + acl = posix_acl_from_mode(inode->i_mode, GFP_KERNEL); + status = PTR_ERR(acl); + if (IS_ERR(acl)) + goto out; } status = __nfs3_proc_setacls(inode, acl, dfacl); - posix_acl_release(alloc); +out: + if (acl != orig) + posix_acl_release(acl); + if (dfacl != orig) + posix_acl_release(dfacl); return status; - -fail: - return PTR_ERR(alloc); } const struct xattr_handler *nfs3_xattr_handlers[] = { base-commit: ae83d0b416db002fe95601e7f97f64b59514d936 -- 2.25.3