Commit 643168c2 authored by Al Viro's avatar Al Viro

nfs4_closedata doesn't need to mess with struct path

instead of path_get()/path_put(), we can just use nfs_sb_{,de}active()
to pin the superblock down.
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 7c97c200
...@@ -238,7 +238,7 @@ extern int nfs4_proc_async_renew(struct nfs_client *, struct rpc_cred *); ...@@ -238,7 +238,7 @@ extern int nfs4_proc_async_renew(struct nfs_client *, struct rpc_cred *);
extern int nfs4_proc_renew(struct nfs_client *, struct rpc_cred *); extern int nfs4_proc_renew(struct nfs_client *, struct rpc_cred *);
extern int nfs4_init_clientid(struct nfs_client *, struct rpc_cred *); extern int nfs4_init_clientid(struct nfs_client *, struct rpc_cred *);
extern int nfs41_init_clientid(struct nfs_client *, struct rpc_cred *); extern int nfs41_init_clientid(struct nfs_client *, struct rpc_cred *);
extern int nfs4_do_close(struct path *path, struct nfs4_state *state, gfp_t gfp_mask, int wait, bool roc); extern int nfs4_do_close(struct nfs4_state *state, gfp_t gfp_mask, int wait, bool roc);
extern int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle); extern int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle);
extern int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name, extern int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
struct nfs4_fs_locations *fs_locations, struct page *page); struct nfs4_fs_locations *fs_locations, struct page *page);
...@@ -341,8 +341,8 @@ extern struct nfs4_state_owner * nfs4_get_state_owner(struct nfs_server *, struc ...@@ -341,8 +341,8 @@ extern struct nfs4_state_owner * nfs4_get_state_owner(struct nfs_server *, struc
extern void nfs4_put_state_owner(struct nfs4_state_owner *); extern void nfs4_put_state_owner(struct nfs4_state_owner *);
extern struct nfs4_state * nfs4_get_open_state(struct inode *, struct nfs4_state_owner *); extern struct nfs4_state * nfs4_get_open_state(struct inode *, struct nfs4_state_owner *);
extern void nfs4_put_open_state(struct nfs4_state *); extern void nfs4_put_open_state(struct nfs4_state *);
extern void nfs4_close_state(struct path *, struct nfs4_state *, fmode_t); extern void nfs4_close_state(struct nfs4_state *, fmode_t);
extern void nfs4_close_sync(struct path *, struct nfs4_state *, fmode_t); extern void nfs4_close_sync(struct nfs4_state *, fmode_t);
extern void nfs4_state_set_mode_locked(struct nfs4_state *, fmode_t); extern void nfs4_state_set_mode_locked(struct nfs4_state *, fmode_t);
extern void nfs4_schedule_lease_recovery(struct nfs_client *); extern void nfs4_schedule_lease_recovery(struct nfs_client *);
extern void nfs4_schedule_state_manager(struct nfs_client *); extern void nfs4_schedule_state_manager(struct nfs_client *);
...@@ -373,8 +373,8 @@ extern struct svc_version nfs4_callback_version4; ...@@ -373,8 +373,8 @@ extern struct svc_version nfs4_callback_version4;
#else #else
#define nfs4_close_state(a, b, c) do { } while (0) #define nfs4_close_state(a, b) do { } while (0)
#define nfs4_close_sync(a, b, c) do { } while (0) #define nfs4_close_sync(a, b) do { } while (0)
#endif /* CONFIG_NFS_V4 */ #endif /* CONFIG_NFS_V4 */
#endif /* __LINUX_FS_NFS_NFS4_FS.H */ #endif /* __LINUX_FS_NFS_NFS4_FS.H */
...@@ -1154,7 +1154,7 @@ static int nfs4_open_recover_helper(struct nfs4_opendata *opendata, fmode_t fmod ...@@ -1154,7 +1154,7 @@ static int nfs4_open_recover_helper(struct nfs4_opendata *opendata, fmode_t fmod
newstate = nfs4_opendata_to_nfs4_state(opendata); newstate = nfs4_opendata_to_nfs4_state(opendata);
if (IS_ERR(newstate)) if (IS_ERR(newstate))
return PTR_ERR(newstate); return PTR_ERR(newstate);
nfs4_close_state(&opendata->path, newstate, fmode); nfs4_close_state(newstate, fmode);
*res = newstate; *res = newstate;
return 0; return 0;
} }
...@@ -1352,7 +1352,7 @@ static void nfs4_open_confirm_release(void *calldata) ...@@ -1352,7 +1352,7 @@ static void nfs4_open_confirm_release(void *calldata)
goto out_free; goto out_free;
state = nfs4_opendata_to_nfs4_state(data); state = nfs4_opendata_to_nfs4_state(data);
if (!IS_ERR(state)) if (!IS_ERR(state))
nfs4_close_state(&data->path, state, data->o_arg.fmode); nfs4_close_state(state, data->o_arg.fmode);
out_free: out_free:
nfs4_opendata_put(data); nfs4_opendata_put(data);
} }
...@@ -1497,7 +1497,7 @@ static void nfs4_open_release(void *calldata) ...@@ -1497,7 +1497,7 @@ static void nfs4_open_release(void *calldata)
goto out_free; goto out_free;
state = nfs4_opendata_to_nfs4_state(data); state = nfs4_opendata_to_nfs4_state(data);
if (!IS_ERR(state)) if (!IS_ERR(state))
nfs4_close_state(&data->path, state, data->o_arg.fmode); nfs4_close_state(state, data->o_arg.fmode);
out_free: out_free:
nfs4_opendata_put(data); nfs4_opendata_put(data);
} }
...@@ -1873,7 +1873,6 @@ static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred, ...@@ -1873,7 +1873,6 @@ static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
} }
struct nfs4_closedata { struct nfs4_closedata {
struct path path;
struct inode *inode; struct inode *inode;
struct nfs4_state *state; struct nfs4_state *state;
struct nfs_closeargs arg; struct nfs_closeargs arg;
...@@ -1888,13 +1887,14 @@ static void nfs4_free_closedata(void *data) ...@@ -1888,13 +1887,14 @@ static void nfs4_free_closedata(void *data)
{ {
struct nfs4_closedata *calldata = data; struct nfs4_closedata *calldata = data;
struct nfs4_state_owner *sp = calldata->state->owner; struct nfs4_state_owner *sp = calldata->state->owner;
struct super_block *sb = calldata->state->inode->i_sb;
if (calldata->roc) if (calldata->roc)
pnfs_roc_release(calldata->state->inode); pnfs_roc_release(calldata->state->inode);
nfs4_put_open_state(calldata->state); nfs4_put_open_state(calldata->state);
nfs_free_seqid(calldata->arg.seqid); nfs_free_seqid(calldata->arg.seqid);
nfs4_put_state_owner(sp); nfs4_put_state_owner(sp);
path_put(&calldata->path); nfs_sb_deactive(sb);
kfree(calldata); kfree(calldata);
} }
...@@ -2014,7 +2014,7 @@ static const struct rpc_call_ops nfs4_close_ops = { ...@@ -2014,7 +2014,7 @@ static const struct rpc_call_ops nfs4_close_ops = {
* *
* NOTE: Caller must be holding the sp->so_owner semaphore! * NOTE: Caller must be holding the sp->so_owner semaphore!
*/ */
int nfs4_do_close(struct path *path, struct nfs4_state *state, gfp_t gfp_mask, int wait, bool roc) int nfs4_do_close(struct nfs4_state *state, gfp_t gfp_mask, int wait, bool roc)
{ {
struct nfs_server *server = NFS_SERVER(state->inode); struct nfs_server *server = NFS_SERVER(state->inode);
struct nfs4_closedata *calldata; struct nfs4_closedata *calldata;
...@@ -2050,8 +2050,7 @@ int nfs4_do_close(struct path *path, struct nfs4_state *state, gfp_t gfp_mask, i ...@@ -2050,8 +2050,7 @@ int nfs4_do_close(struct path *path, struct nfs4_state *state, gfp_t gfp_mask, i
calldata->res.seqid = calldata->arg.seqid; calldata->res.seqid = calldata->arg.seqid;
calldata->res.server = server; calldata->res.server = server;
calldata->roc = roc; calldata->roc = roc;
path_get(path); nfs_sb_active(calldata->inode->i_sb);
calldata->path = *path;
msg.rpc_argp = &calldata->arg; msg.rpc_argp = &calldata->arg;
msg.rpc_resp = &calldata->res; msg.rpc_resp = &calldata->res;
...@@ -2092,9 +2091,9 @@ static void nfs4_close_context(struct nfs_open_context *ctx, int is_sync) ...@@ -2092,9 +2091,9 @@ static void nfs4_close_context(struct nfs_open_context *ctx, int is_sync)
if (ctx->state == NULL) if (ctx->state == NULL)
return; return;
if (is_sync) if (is_sync)
nfs4_close_sync(&ctx->path, ctx->state, ctx->mode); nfs4_close_sync(ctx->state, ctx->mode);
else else
nfs4_close_state(&ctx->path, ctx->state, ctx->mode); nfs4_close_state(ctx->state, ctx->mode);
} }
static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle) static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
...@@ -2642,7 +2641,7 @@ nfs4_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr, ...@@ -2642,7 +2641,7 @@ nfs4_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
if (ctx != NULL) if (ctx != NULL)
ctx->state = state; ctx->state = state;
else else
nfs4_close_sync(path, state, fmode); nfs4_close_sync(state, fmode);
out: out:
return status; return status;
} }
......
...@@ -641,7 +641,7 @@ void nfs4_put_open_state(struct nfs4_state *state) ...@@ -641,7 +641,7 @@ void nfs4_put_open_state(struct nfs4_state *state)
/* /*
* Close the current file. * Close the current file.
*/ */
static void __nfs4_close(struct path *path, struct nfs4_state *state, static void __nfs4_close(struct nfs4_state *state,
fmode_t fmode, gfp_t gfp_mask, int wait) fmode_t fmode, gfp_t gfp_mask, int wait)
{ {
struct nfs4_state_owner *owner = state->owner; struct nfs4_state_owner *owner = state->owner;
...@@ -685,18 +685,18 @@ static void __nfs4_close(struct path *path, struct nfs4_state *state, ...@@ -685,18 +685,18 @@ static void __nfs4_close(struct path *path, struct nfs4_state *state,
} else { } else {
bool roc = pnfs_roc(state->inode); bool roc = pnfs_roc(state->inode);
nfs4_do_close(path, state, gfp_mask, wait, roc); nfs4_do_close(state, gfp_mask, wait, roc);
} }
} }
void nfs4_close_state(struct path *path, struct nfs4_state *state, fmode_t fmode) void nfs4_close_state(struct nfs4_state *state, fmode_t fmode)
{ {
__nfs4_close(path, state, fmode, GFP_NOFS, 0); __nfs4_close(state, fmode, GFP_NOFS, 0);
} }
void nfs4_close_sync(struct path *path, struct nfs4_state *state, fmode_t fmode) void nfs4_close_sync(struct nfs4_state *state, fmode_t fmode)
{ {
__nfs4_close(path, state, fmode, GFP_KERNEL, 1); __nfs4_close(state, fmode, GFP_KERNEL, 1);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment