NFSv4: change nfs4_do_setattr to take an open_context instead of a nfs4_state.
authorNeilBrown <neilb@suse.com>
Thu, 13 Oct 2016 04:26:47 +0000 (15:26 +1100)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Thu, 1 Dec 2016 22:57:45 +0000 (17:57 -0500)
The open_context can always lead directly to the state, and is always easily
available, so this is a straightforward change.
Doing this makes more information available to _nfs4_do_setattr() for use
in the next patch.

Signed-off-by: NeilBrown <neilb@suse.com>
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/nfs4proc.c

index 68a75bf431f87c56f0a7976cffc3f9f58f62e586..3ab4dd5f7cfb0b30b746445ed5bffef68a87f6a0 100644 (file)
@@ -94,7 +94,7 @@ static int nfs4_proc_getattr(struct nfs_server *, struct nfs_fh *, struct nfs_fa
 static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr, struct nfs4_label *label);
 static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
                            struct nfs_fattr *fattr, struct iattr *sattr,
-                           struct nfs4_state *state, struct nfs4_label *ilabel,
+                           struct nfs_open_context *ctx, struct nfs4_label *ilabel,
                            struct nfs4_label *olabel);
 #ifdef CONFIG_NFS_V4_1
 static int nfs41_test_stateid(struct nfs_server *, nfs4_stateid *,
@@ -2826,7 +2826,7 @@ static int _nfs4_do_open(struct inode *dir,
                        nfs_fattr_init(opendata->o_res.f_attr);
                        status = nfs4_do_setattr(state->inode, cred,
                                        opendata->o_res.f_attr, sattr,
-                                       state, label, olabel);
+                                       ctx, label, olabel);
                        if (status == 0) {
                                nfs_setattr_update_inode(state->inode, sattr,
                                                opendata->o_res.f_attr);
@@ -2921,7 +2921,7 @@ static int _nfs4_do_setattr(struct inode *inode,
                            struct nfs_setattrargs *arg,
                            struct nfs_setattrres *res,
                            struct rpc_cred *cred,
-                           struct nfs4_state *state)
+                           struct nfs_open_context *ctx)
 {
        struct nfs_server *server = NFS_SERVER(inode);
         struct rpc_message msg = {
@@ -2944,13 +2944,13 @@ static int _nfs4_do_setattr(struct inode *inode,
 
        if (nfs4_copy_delegation_stateid(inode, fmode, &arg->stateid, &delegation_cred)) {
                /* Use that stateid */
-       } else if (truncate && state != NULL) {
+       } else if (truncate && ctx != NULL) {
                struct nfs_lockowner lockowner = {
                        .l_owner = current->files,
                };
-               if (!nfs4_valid_open_stateid(state))
+               if (!nfs4_valid_open_stateid(ctx->state))
                        return -EBADF;
-               if (nfs4_select_rw_stateid(state, FMODE_WRITE, &lockowner,
+               if (nfs4_select_rw_stateid(ctx->state, FMODE_WRITE, &lockowner,
                                &arg->stateid, &delegation_cred) == -EIO)
                        return -EBADF;
        } else
@@ -2961,7 +2961,7 @@ static int _nfs4_do_setattr(struct inode *inode,
        status = nfs4_call_sync(server->client, server, &msg, &arg->seq_args, &res->seq_res, 1);
 
        put_rpccred(delegation_cred);
-       if (status == 0 && state != NULL)
+       if (status == 0 && ctx != NULL)
                renew_lease(server, timestamp);
        trace_nfs4_setattr(inode, &arg->stateid, status);
        return status;
@@ -2969,10 +2969,11 @@ static int _nfs4_do_setattr(struct inode *inode,
 
 static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
                           struct nfs_fattr *fattr, struct iattr *sattr,
-                          struct nfs4_state *state, struct nfs4_label *ilabel,
+                          struct nfs_open_context *ctx, struct nfs4_label *ilabel,
                           struct nfs4_label *olabel)
 {
        struct nfs_server *server = NFS_SERVER(inode);
+       struct nfs4_state *state = ctx ? ctx->state : NULL;
         struct nfs_setattrargs  arg = {
                 .fh             = NFS_FH(inode),
                 .iap            = sattr,
@@ -2997,7 +2998,7 @@ static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
                arg.bitmask = nfs4_bitmask(server, olabel);
 
        do {
-               err = _nfs4_do_setattr(inode, &arg, &res, cred, state);
+               err = _nfs4_do_setattr(inode, &arg, &res, cred, ctx);
                switch (err) {
                case -NFS4ERR_OPENMODE:
                        if (!(sattr->ia_valid & ATTR_SIZE)) {
@@ -3724,7 +3725,7 @@ nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
 {
        struct inode *inode = d_inode(dentry);
        struct rpc_cred *cred = NULL;
-       struct nfs4_state *state = NULL;
+       struct nfs_open_context *ctx = NULL;
        struct nfs4_label *label = NULL;
        int status;
 
@@ -3745,20 +3746,17 @@ nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
 
        /* Search for an existing open(O_WRITE) file */
        if (sattr->ia_valid & ATTR_FILE) {
-               struct nfs_open_context *ctx;
 
                ctx = nfs_file_open_context(sattr->ia_file);
-               if (ctx) {
+               if (ctx)
                        cred = ctx->cred;
-                       state = ctx->state;
-               }
        }
 
        label = nfs4_label_alloc(NFS_SERVER(inode), GFP_KERNEL);
        if (IS_ERR(label))
                return PTR_ERR(label);
 
-       status = nfs4_do_setattr(inode, cred, fattr, sattr, state, NULL, label);
+       status = nfs4_do_setattr(inode, cred, fattr, sattr, ctx, NULL, label);
        if (status == 0) {
                nfs_setattr_update_inode(inode, sattr, fattr);
                nfs_setsecurity(inode, fattr, label);