|
@@ -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;
|
|
|
}
|
|
|
|