|
@@ -1525,6 +1525,7 @@ static void nfs4_open_prepare(struct rpc_task *task, void *calldata)
|
|
{
|
|
{
|
|
struct nfs4_opendata *data = calldata;
|
|
struct nfs4_opendata *data = calldata;
|
|
struct nfs4_state_owner *sp = data->owner;
|
|
struct nfs4_state_owner *sp = data->owner;
|
|
|
|
+ struct nfs_client *clp = sp->so_server->nfs_client;
|
|
|
|
|
|
if (nfs_wait_on_sequence(data->o_arg.seqid, task) != 0)
|
|
if (nfs_wait_on_sequence(data->o_arg.seqid, task) != 0)
|
|
goto out_wait;
|
|
goto out_wait;
|
|
@@ -1545,7 +1546,7 @@ static void nfs4_open_prepare(struct rpc_task *task, void *calldata)
|
|
rcu_read_unlock();
|
|
rcu_read_unlock();
|
|
}
|
|
}
|
|
/* Update client id. */
|
|
/* Update client id. */
|
|
- data->o_arg.clientid = sp->so_server->nfs_client->cl_clientid;
|
|
|
|
|
|
+ data->o_arg.clientid = clp->cl_clientid;
|
|
if (data->o_arg.claim == NFS4_OPEN_CLAIM_PREVIOUS) {
|
|
if (data->o_arg.claim == NFS4_OPEN_CLAIM_PREVIOUS) {
|
|
task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR];
|
|
task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR];
|
|
data->o_arg.open_bitmap = &nfs4_open_noattr_bitmap[0];
|
|
data->o_arg.open_bitmap = &nfs4_open_noattr_bitmap[0];
|
|
@@ -1557,6 +1558,16 @@ static void nfs4_open_prepare(struct rpc_task *task, void *calldata)
|
|
&data->o_res.seq_res,
|
|
&data->o_res.seq_res,
|
|
task) != 0)
|
|
task) != 0)
|
|
nfs_release_seqid(data->o_arg.seqid);
|
|
nfs_release_seqid(data->o_arg.seqid);
|
|
|
|
+
|
|
|
|
+ /* Set the create mode (note dependency on the session type) */
|
|
|
|
+ data->o_arg.createmode = NFS4_CREATE_UNCHECKED;
|
|
|
|
+ if (data->o_arg.open_flags & O_EXCL) {
|
|
|
|
+ data->o_arg.createmode = NFS4_CREATE_EXCLUSIVE;
|
|
|
|
+ if (nfs4_has_persistent_session(clp))
|
|
|
|
+ data->o_arg.createmode = NFS4_CREATE_GUARDED;
|
|
|
|
+ else if (clp->cl_mvops->minor_version > 0)
|
|
|
|
+ data->o_arg.createmode = NFS4_CREATE_EXCLUSIVE4_1;
|
|
|
|
+ }
|
|
return;
|
|
return;
|
|
unlock_no_action:
|
|
unlock_no_action:
|
|
rcu_read_unlock();
|
|
rcu_read_unlock();
|
|
@@ -2000,7 +2011,8 @@ static int _nfs4_do_open(struct inode *dir,
|
|
if (status != 0)
|
|
if (status != 0)
|
|
goto err_opendata_put;
|
|
goto err_opendata_put;
|
|
|
|
|
|
- if (opendata->o_arg.open_flags & O_EXCL) {
|
|
|
|
|
|
+ if ((opendata->o_arg.open_flags & O_EXCL) &&
|
|
|
|
+ (opendata->o_arg.createmode != NFS4_CREATE_GUARDED)) {
|
|
nfs4_exclusive_attrset(opendata, sattr);
|
|
nfs4_exclusive_attrset(opendata, sattr);
|
|
|
|
|
|
nfs_fattr_init(opendata->o_res.f_attr);
|
|
nfs_fattr_init(opendata->o_res.f_attr);
|