|
@@ -105,6 +105,8 @@ static int nfs4_map_errors(int err)
|
|
|
return -EINVAL;
|
|
|
case -NFS4ERR_SHARE_DENIED:
|
|
|
return -EACCES;
|
|
|
+ case -NFS4ERR_MINOR_VERS_MISMATCH:
|
|
|
+ return -EPROTONOSUPPORT;
|
|
|
default:
|
|
|
dprintk("%s could not handle NFSv4 error %d\n",
|
|
|
__func__, -err);
|
|
@@ -116,7 +118,7 @@ static int nfs4_map_errors(int err)
|
|
|
/*
|
|
|
* This is our standard bitmap for GETATTR requests.
|
|
|
*/
|
|
|
-const u32 nfs4_fattr_bitmap[2] = {
|
|
|
+const u32 nfs4_fattr_bitmap[3] = {
|
|
|
FATTR4_WORD0_TYPE
|
|
|
| FATTR4_WORD0_CHANGE
|
|
|
| FATTR4_WORD0_SIZE
|
|
@@ -133,6 +135,24 @@ const u32 nfs4_fattr_bitmap[2] = {
|
|
|
| FATTR4_WORD1_TIME_MODIFY
|
|
|
};
|
|
|
|
|
|
+static const u32 nfs4_pnfs_open_bitmap[3] = {
|
|
|
+ FATTR4_WORD0_TYPE
|
|
|
+ | FATTR4_WORD0_CHANGE
|
|
|
+ | FATTR4_WORD0_SIZE
|
|
|
+ | FATTR4_WORD0_FSID
|
|
|
+ | FATTR4_WORD0_FILEID,
|
|
|
+ FATTR4_WORD1_MODE
|
|
|
+ | FATTR4_WORD1_NUMLINKS
|
|
|
+ | FATTR4_WORD1_OWNER
|
|
|
+ | FATTR4_WORD1_OWNER_GROUP
|
|
|
+ | FATTR4_WORD1_RAWDEV
|
|
|
+ | FATTR4_WORD1_SPACE_USED
|
|
|
+ | FATTR4_WORD1_TIME_ACCESS
|
|
|
+ | FATTR4_WORD1_TIME_METADATA
|
|
|
+ | FATTR4_WORD1_TIME_MODIFY,
|
|
|
+ FATTR4_WORD2_MDSTHRESHOLD
|
|
|
+};
|
|
|
+
|
|
|
const u32 nfs4_statfs_bitmap[2] = {
|
|
|
FATTR4_WORD0_FILES_AVAIL
|
|
|
| FATTR4_WORD0_FILES_FREE
|
|
@@ -844,6 +864,7 @@ static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry,
|
|
|
p->o_arg.name = &dentry->d_name;
|
|
|
p->o_arg.server = server;
|
|
|
p->o_arg.bitmask = server->attr_bitmask;
|
|
|
+ p->o_arg.open_bitmap = &nfs4_fattr_bitmap[0];
|
|
|
p->o_arg.claim = NFS4_OPEN_CLAIM_NULL;
|
|
|
if (attrs != NULL && attrs->ia_valid != 0) {
|
|
|
__be32 verf[2];
|
|
@@ -1820,6 +1841,7 @@ static int _nfs4_do_open(struct inode *dir,
|
|
|
opendata->f_attr.mdsthreshold = pnfs_mdsthreshold_alloc();
|
|
|
if (!opendata->f_attr.mdsthreshold)
|
|
|
goto err_opendata_put;
|
|
|
+ opendata->o_arg.open_bitmap = &nfs4_pnfs_open_bitmap[0];
|
|
|
}
|
|
|
if (dentry->d_inode != NULL)
|
|
|
opendata->state = nfs4_get_open_state(dentry->d_inode, sp);
|
|
@@ -1880,6 +1902,7 @@ static struct nfs4_state *nfs4_do_open(struct inode *dir,
|
|
|
struct nfs4_state *res;
|
|
|
int status;
|
|
|
|
|
|
+ fmode &= FMODE_READ|FMODE_WRITE;
|
|
|
do {
|
|
|
status = _nfs4_do_open(dir, dentry, fmode, flags, sattr, cred,
|
|
|
&res, ctx_th);
|
|
@@ -2526,6 +2549,14 @@ nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
|
|
|
|
|
|
nfs_fattr_init(fattr);
|
|
|
|
|
|
+ /* Deal with open(O_TRUNC) */
|
|
|
+ if (sattr->ia_valid & ATTR_OPEN)
|
|
|
+ sattr->ia_valid &= ~(ATTR_MTIME|ATTR_CTIME|ATTR_OPEN);
|
|
|
+
|
|
|
+ /* Optimization: if the end result is no change, don't RPC */
|
|
|
+ if ((sattr->ia_valid & ~(ATTR_FILE)) == 0)
|
|
|
+ return 0;
|
|
|
+
|
|
|
/* Search for an existing open(O_WRITE) file */
|
|
|
if (sattr->ia_valid & ATTR_FILE) {
|
|
|
struct nfs_open_context *ctx;
|
|
@@ -2537,10 +2568,6 @@ nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /* Deal with open(O_TRUNC) */
|
|
|
- if (sattr->ia_valid & ATTR_OPEN)
|
|
|
- sattr->ia_valid &= ~(ATTR_MTIME|ATTR_CTIME|ATTR_OPEN);
|
|
|
-
|
|
|
status = nfs4_do_setattr(inode, cred, fattr, sattr, state);
|
|
|
if (status == 0)
|
|
|
nfs_setattr_update_inode(inode, sattr);
|
|
@@ -5275,7 +5302,7 @@ static int _nfs4_proc_destroy_clientid(struct nfs_client *clp,
|
|
|
|
|
|
status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
|
|
|
if (status)
|
|
|
- pr_warn("NFS: Got error %d from the server %s on "
|
|
|
+ dprintk("NFS: Got error %d from the server %s on "
|
|
|
"DESTROY_CLIENTID.", status, clp->cl_hostname);
|
|
|
return status;
|
|
|
}
|
|
@@ -5746,8 +5773,7 @@ int nfs4_proc_destroy_session(struct nfs4_session *session,
|
|
|
status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
|
|
|
|
|
|
if (status)
|
|
|
- printk(KERN_WARNING
|
|
|
- "NFS: Got error %d from the server on DESTROY_SESSION. "
|
|
|
+ dprintk("NFS: Got error %d from the server on DESTROY_SESSION. "
|
|
|
"Session has been destroyed regardless...\n", status);
|
|
|
|
|
|
dprintk("<-- nfs4_proc_destroy_session\n");
|