NFSD: fix regression with setting ACLs.
[ Upstream commit00801cd92d
] A recent patch moved ACL setting into nfsd_setattr(). Unfortunately it didn't work as nfsd_setattr() aborts early if iap->ia_valid is 0. Remove this test, and instead avoid calling notify_change() when ia_valid is 0. This means that nfsd_setattr() will now *always* lock the inode. Previously it didn't if only a ATTR_MODE change was requested on a symlink (see Commit15b7a1b86d
("[PATCH] knfsd: fix setattr-on-symlink error return")). I don't think this change really matters. Fixes:c0cbe70742
("NFSD: add posix ACLs to struct nfsd_attrs") Signed-off-by: NeilBrown <neilb@suse.de> Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
Родитель
4b910dd7fe
Коммит
c9cb32ad42
|
@ -299,6 +299,10 @@ commit_metadata(struct svc_fh *fhp)
|
|||
static void
|
||||
nfsd_sanitize_attrs(struct inode *inode, struct iattr *iap)
|
||||
{
|
||||
/* Ignore mode updates on symlinks */
|
||||
if (S_ISLNK(inode->i_mode))
|
||||
iap->ia_valid &= ~ATTR_MODE;
|
||||
|
||||
/* sanitize the mode change */
|
||||
if (iap->ia_valid & ATTR_MODE) {
|
||||
iap->ia_mode &= S_IALLUGO;
|
||||
|
@ -354,7 +358,7 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
|||
int accmode = NFSD_MAY_SATTR;
|
||||
umode_t ftype = 0;
|
||||
__be32 err;
|
||||
int host_err;
|
||||
int host_err = 0;
|
||||
bool get_write_count;
|
||||
bool size_change = (iap->ia_valid & ATTR_SIZE);
|
||||
|
||||
|
@ -392,13 +396,6 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
|||
dentry = fhp->fh_dentry;
|
||||
inode = d_inode(dentry);
|
||||
|
||||
/* Ignore any mode updates on symlinks */
|
||||
if (S_ISLNK(inode->i_mode))
|
||||
iap->ia_valid &= ~ATTR_MODE;
|
||||
|
||||
if (!iap->ia_valid)
|
||||
return 0;
|
||||
|
||||
nfsd_sanitize_attrs(inode, iap);
|
||||
|
||||
if (check_guard && guardtime != inode->i_ctime.tv_sec)
|
||||
|
@ -449,8 +446,10 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
|||
goto out_unlock;
|
||||
}
|
||||
|
||||
if (iap->ia_valid) {
|
||||
iap->ia_valid |= ATTR_CTIME;
|
||||
host_err = notify_change(&init_user_ns, dentry, iap, NULL);
|
||||
}
|
||||
|
||||
out_unlock:
|
||||
if (attr->na_seclabel && attr->na_seclabel->len)
|
||||
|
|
Загрузка…
Ссылка в новой задаче