Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 451146be authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFSv4: Fix open(O_TRUNC) and ftruncate() error handling



If the file wasn't opened for writing, then truncate and ftruncate
need to report the appropriate errors.

Reported-by: default avatarMiklos Szeredi <miklos@szeredi.hu>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
Cc: stable@vger.kernel.org
parent 55725513
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -1429,7 +1429,7 @@ static struct dentry *nfs_atomic_lookup(struct inode *dir, struct dentry *dentry
	}

	open_flags = nd->intent.open.flags;
	attr.ia_valid = 0;
	attr.ia_valid = ATTR_OPEN;

	ctx = create_nfs_open_context(dentry, open_flags);
	res = ERR_CAST(ctx);
@@ -1536,7 +1536,7 @@ static int nfs_open_revalidate(struct dentry *dentry, struct nameidata *nd)
	if (IS_ERR(ctx))
		goto out;

	attr.ia_valid = 0;
	attr.ia_valid = ATTR_OPEN;
	if (openflags & O_TRUNC) {
		attr.ia_valid |= ATTR_SIZE;
		attr.ia_size = 0;
+12 −3
Original line number Diff line number Diff line
@@ -1954,10 +1954,19 @@ static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
	};
	int err;
	do {
		err = nfs4_handle_exception(server,
				_nfs4_do_setattr(inode, cred, fattr, sattr, state),
				&exception);
		err = _nfs4_do_setattr(inode, cred, fattr, sattr, state);
		switch (err) {
		case -NFS4ERR_OPENMODE:
			if (state && !(state->state & FMODE_WRITE)) {
				err = -EBADF;
				if (sattr->ia_valid & ATTR_OPEN)
					err = -EACCES;
				goto out;
			}
		}
		err = nfs4_handle_exception(server, err, &exception);
	} while (exception.retry);
out:
	return err;
}