]> err.no Git - linux-2.6/blobdiff - fs/nfs/nfs4proc.c
NFS: "const static" vs "static const" in nfs4
[linux-2.6] / fs / nfs / nfs4proc.c
index cc33a1c32cfba19183f960404675ad42be073f46..305bea201cd3cc78979716920d067266eb2e077e 100644 (file)
@@ -850,9 +850,14 @@ static int _nfs4_open_delegated(struct inode *inode, int flags, struct rpc_cred
        int open_flags = flags & (FMODE_READ|FMODE_WRITE);
        int err;
 
+       err = -ENOMEM;
+       if (!(sp = nfs4_get_state_owner(server, cred))) {
+               dprintk("%s: nfs4_get_state_owner failed!\n", __FUNCTION__);
+               return err;
+       }
        err = nfs4_recover_expired_lease(server);
        if (err != 0)
-               return err;
+               goto out_put_state_owner;
        /* Protect against reboot recovery - NOTE ORDER! */
        down_read(&clp->cl_sem);
        /* Protect against delegation recall */
@@ -862,10 +867,6 @@ static int _nfs4_open_delegated(struct inode *inode, int flags, struct rpc_cred
        if (delegation == NULL || (delegation->type & open_flags) != open_flags)
                goto out_err;
        err = -ENOMEM;
-       if (!(sp = nfs4_get_state_owner(server, cred))) {
-               dprintk("%s: nfs4_get_state_owner failed!\n", __FUNCTION__);
-               goto out_err;
-       }
        state = nfs4_get_open_state(inode, sp);
        if (state == NULL)
                goto out_err;
@@ -877,13 +878,13 @@ static int _nfs4_open_delegated(struct inode *inode, int flags, struct rpc_cred
                spin_unlock(&inode->i_lock);
                goto out_ok;
        } else if (state->state != 0)
-               goto out_err;
+               goto out_put_open_state;
 
        lock_kernel();
        err = _nfs4_do_access(inode, cred, open_flags);
        unlock_kernel();
        if (err != 0)
-               goto out_err;
+               goto out_put_open_state;
        set_bit(NFS_DELEGATED_STATE, &state->flags);
        update_open_stateid(state, &delegation->stateid, open_flags);
 out_ok:
@@ -891,17 +892,16 @@ out_ok:
        up_read(&nfsi->rwsem);
        up_read(&clp->cl_sem);
        *res = state;
-       return 0; 
+       return 0;
+out_put_open_state:
+       nfs4_put_open_state(state);
 out_err:
-       if (sp != NULL) {
-               if (state != NULL)
-                       nfs4_put_open_state(state);
-               nfs4_put_state_owner(sp);
-       }
        up_read(&nfsi->rwsem);
        up_read(&clp->cl_sem);
        if (err != -EACCES)
                nfs_inode_return_delegation(inode);
+out_put_state_owner:
+       nfs4_put_state_owner(sp);
        return err;
 }
 
@@ -941,7 +941,7 @@ static int _nfs4_do_open(struct inode *dir, struct dentry *dentry, int flags, st
        }
        status = nfs4_recover_expired_lease(server);
        if (status != 0)
-               goto out_err;
+               goto err_put_state_owner;
        down_read(&clp->cl_sem);
        status = -ENOMEM;
        opendata = nfs4_opendata_alloc(dentry, sp, flags, sattr);
@@ -1430,7 +1430,7 @@ static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
        if (status == 0)
                status = nfs4_do_fsinfo(server, fhandle, info);
 out:
-       return status;
+       return nfs4_map_errors(status);
 }
 
 static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr)
@@ -2518,26 +2518,24 @@ static const struct rpc_call_ops nfs4_renew_ops = {
        .rpc_call_done = nfs4_renew_done,
 };
 
-int
-nfs4_proc_async_renew(struct nfs4_client *clp)
+int nfs4_proc_async_renew(struct nfs4_client *clp, struct rpc_cred *cred)
 {
        struct rpc_message msg = {
                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
                .rpc_argp       = clp,
-               .rpc_cred       = clp->cl_cred,
+               .rpc_cred       = cred,
        };
 
        return rpc_call_async(clp->cl_rpcclient, &msg, RPC_TASK_SOFT,
                        &nfs4_renew_ops, (void *)jiffies);
 }
 
-int
-nfs4_proc_renew(struct nfs4_client *clp)
+int nfs4_proc_renew(struct nfs4_client *clp, struct rpc_cred *cred)
 {
        struct rpc_message msg = {
                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
                .rpc_argp       = clp,
-               .rpc_cred       = clp->cl_cred,
+               .rpc_cred       = cred,
        };
        unsigned long now = jiffies;
        int status;
@@ -2848,7 +2846,7 @@ int nfs4_handle_exception(const struct nfs_server *server, int errorcode, struct
        return nfs4_map_errors(ret);
 }
 
-int nfs4_proc_setclientid(struct nfs4_client *clp, u32 program, unsigned short port)
+int nfs4_proc_setclientid(struct nfs4_client *clp, u32 program, unsigned short port, struct rpc_cred *cred)
 {
        nfs4_verifier sc_verifier;
        struct nfs4_setclientid setclientid = {
@@ -2859,7 +2857,7 @@ int nfs4_proc_setclientid(struct nfs4_client *clp, u32 program, unsigned short p
                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID],
                .rpc_argp = &setclientid,
                .rpc_resp = clp,
-               .rpc_cred = clp->cl_cred,
+               .rpc_cred = cred,
        };
        u32 *p;
        int loop = 0;
@@ -2873,7 +2871,7 @@ int nfs4_proc_setclientid(struct nfs4_client *clp, u32 program, unsigned short p
                setclientid.sc_name_len = scnprintf(setclientid.sc_name,
                                sizeof(setclientid.sc_name), "%s/%u.%u.%u.%u %s %u",
                                clp->cl_ipaddr, NIPQUAD(clp->cl_addr.s_addr),
-                               clp->cl_cred->cr_ops->cr_name,
+                               cred->cr_ops->cr_name,
                                clp->cl_id_uniquifier);
                setclientid.sc_netid_len = scnprintf(setclientid.sc_netid,
                                sizeof(setclientid.sc_netid), "tcp");
@@ -2896,14 +2894,14 @@ int nfs4_proc_setclientid(struct nfs4_client *clp, u32 program, unsigned short p
 }
 
 int
-nfs4_proc_setclientid_confirm(struct nfs4_client *clp)
+nfs4_proc_setclientid_confirm(struct nfs4_client *clp, struct rpc_cred *cred)
 {
        struct nfs_fsinfo fsinfo;
        struct rpc_message msg = {
                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID_CONFIRM],
                .rpc_argp = clp,
                .rpc_resp = &fsinfo,
-               .rpc_cred = clp->cl_cred,
+               .rpc_cred = cred,
        };
        unsigned long now;
        int status;
@@ -2922,11 +2920,12 @@ nfs4_proc_setclientid_confirm(struct nfs4_client *clp)
 
 struct nfs4_delegreturndata {
        struct nfs4_delegreturnargs args;
+       struct nfs4_delegreturnres res;
        struct nfs_fh fh;
        nfs4_stateid stateid;
        struct rpc_cred *cred;
        unsigned long timestamp;
-       const struct nfs_server *server;
+       struct nfs_fattr fattr;
        int rpc_status;
 };
 
@@ -2936,8 +2935,10 @@ static void nfs4_delegreturn_prepare(struct rpc_task *task, void *calldata)
        struct rpc_message msg = {
                .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DELEGRETURN],
                .rpc_argp = &data->args,
+               .rpc_resp = &data->res,
                .rpc_cred = data->cred,
        };
+       nfs_fattr_init(data->res.fattr);
        rpc_call_setup(task, &msg, 0);
 }
 
@@ -2946,7 +2947,7 @@ static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
        struct nfs4_delegreturndata *data = calldata;
        data->rpc_status = task->tk_status;
        if (data->rpc_status == 0)
-               renew_lease(data->server, data->timestamp);
+               renew_lease(data->res.server, data->timestamp);
 }
 
 static void nfs4_delegreturn_release(void *calldata)
@@ -2957,7 +2958,7 @@ static void nfs4_delegreturn_release(void *calldata)
        kfree(calldata);
 }
 
-const static struct rpc_call_ops nfs4_delegreturn_ops = {
+static const struct rpc_call_ops nfs4_delegreturn_ops = {
        .rpc_call_prepare = nfs4_delegreturn_prepare,
        .rpc_call_done = nfs4_delegreturn_done,
        .rpc_release = nfs4_delegreturn_release,
@@ -2966,6 +2967,7 @@ const static struct rpc_call_ops nfs4_delegreturn_ops = {
 static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid)
 {
        struct nfs4_delegreturndata *data;
+       struct nfs_server *server = NFS_SERVER(inode);
        struct rpc_task *task;
        int status;
 
@@ -2974,11 +2976,13 @@ static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, co
                return -ENOMEM;
        data->args.fhandle = &data->fh;
        data->args.stateid = &data->stateid;
+       data->args.bitmask = server->attr_bitmask;
        nfs_copy_fh(&data->fh, NFS_FH(inode));
        memcpy(&data->stateid, stateid, sizeof(data->stateid));
+       data->res.fattr = &data->fattr;
+       data->res.server = server;
        data->cred = get_rpccred(cred);
        data->timestamp = jiffies;
-       data->server = NFS_SERVER(inode);
        data->rpc_status = 0;
 
        task = rpc_run_task(NFS_CLIENT(inode), RPC_TASK_ASYNC, &nfs4_delegreturn_ops, data);
@@ -2987,8 +2991,11 @@ static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, co
                return PTR_ERR(task);
        }
        status = nfs4_wait_for_completion_rpc_task(task);
-       if (status == 0)
+       if (status == 0) {
                status = data->rpc_status;
+               if (status == 0)
+                       nfs_post_op_update_inode(inode, &data->fattr);
+       }
        rpc_release_task(task);
        return status;
 }