Commit af9b6d75 authored by Trond Myklebust's avatar Trond Myklebust

pNFS: Parse the results of layoutget on open even if permissions checks fail

Even if the results of the permissions checks failed, we should parse
the results of the layout on open call so that we can return the
layout if required.
Note that we also want to ignore the sequence counter for whether or not
a layout recall occurred. If the recall pertained to our OPEN, then the
callback will know, and will attempt to wait for us to finih processing
anyway.
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent b2b1ff3d
...@@ -331,8 +331,6 @@ static u32 initiate_bulk_draining(struct nfs_client *clp, ...@@ -331,8 +331,6 @@ static u32 initiate_bulk_draining(struct nfs_client *clp,
static u32 do_callback_layoutrecall(struct nfs_client *clp, static u32 do_callback_layoutrecall(struct nfs_client *clp,
struct cb_layoutrecallargs *args) struct cb_layoutrecallargs *args)
{ {
write_seqcount_begin(&clp->cl_callback_count);
write_seqcount_end(&clp->cl_callback_count);
if (args->cbl_recall_type == RETURN_FILE) if (args->cbl_recall_type == RETURN_FILE)
return initiate_file_draining(clp, args); return initiate_file_draining(clp, args);
return initiate_bulk_draining(clp, args); return initiate_bulk_draining(clp, args);
......
...@@ -2843,6 +2843,9 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata, ...@@ -2843,6 +2843,9 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,
nfs_save_change_attribute(d_inode(opendata->dir))); nfs_save_change_attribute(d_inode(opendata->dir)));
} }
/* Parse layoutget results before we check for access */
pnfs_parse_lgopen(state->inode, opendata->lgp, ctx);
ret = nfs4_opendata_access(sp->so_cred, opendata, state, fmode, flags); ret = nfs4_opendata_access(sp->so_cred, opendata, state, fmode, flags);
if (ret != 0) if (ret != 0)
goto out; goto out;
...@@ -2851,8 +2854,6 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata, ...@@ -2851,8 +2854,6 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,
nfs_inode_attach_open_context(ctx); nfs_inode_attach_open_context(ctx);
if (read_seqcount_retry(&sp->so_reclaim_seqcount, seq)) if (read_seqcount_retry(&sp->so_reclaim_seqcount, seq))
nfs4_schedule_stateid_recovery(server, state); nfs4_schedule_stateid_recovery(server, state);
else
pnfs_parse_lgopen(state->inode, opendata->lgp, ctx);
} }
out: out:
......
...@@ -1018,7 +1018,6 @@ pnfs_alloc_init_layoutget_args(struct inode *ino, ...@@ -1018,7 +1018,6 @@ pnfs_alloc_init_layoutget_args(struct inode *ino,
nfs4_stateid_copy(&lgp->args.stateid, stateid); nfs4_stateid_copy(&lgp->args.stateid, stateid);
lgp->gfp_flags = gfp_flags; lgp->gfp_flags = gfp_flags;
lgp->cred = get_rpccred(ctx->cred); lgp->cred = get_rpccred(ctx->cred);
lgp->callback_count = raw_seqcount_begin(&server->nfs_client->cl_callback_count);
return lgp; return lgp;
} }
...@@ -2181,9 +2180,6 @@ void pnfs_parse_lgopen(struct inode *ino, struct nfs4_layoutget *lgp, ...@@ -2181,9 +2180,6 @@ void pnfs_parse_lgopen(struct inode *ino, struct nfs4_layoutget *lgp,
} else } else
lo = NFS_I(lgp->args.inode)->layout; lo = NFS_I(lgp->args.inode)->layout;
if (read_seqcount_retry(&srv->nfs_client->cl_callback_count,
lgp->callback_count))
return;
lseg = pnfs_layout_process(lgp); lseg = pnfs_layout_process(lgp);
if (!IS_ERR(lseg)) { if (!IS_ERR(lseg)) {
iomode = lgp->args.range.iomode; iomode = lgp->args.range.iomode;
......
...@@ -28,7 +28,6 @@ struct nfs41_impl_id; ...@@ -28,7 +28,6 @@ struct nfs41_impl_id;
struct nfs_client { struct nfs_client {
refcount_t cl_count; refcount_t cl_count;
atomic_t cl_mds_count; atomic_t cl_mds_count;
seqcount_t cl_callback_count;
int cl_cons_state; /* current construction state (-ve: init error) */ int cl_cons_state; /* current construction state (-ve: init error) */
#define NFS_CS_READY 0 /* ready to be used */ #define NFS_CS_READY 0 /* ready to be used */
#define NFS_CS_INITING 1 /* busy initialising */ #define NFS_CS_INITING 1 /* busy initialising */
......
...@@ -271,7 +271,6 @@ struct nfs4_layoutget { ...@@ -271,7 +271,6 @@ struct nfs4_layoutget {
struct nfs4_layoutget_args args; struct nfs4_layoutget_args args;
struct nfs4_layoutget_res res; struct nfs4_layoutget_res res;
struct rpc_cred *cred; struct rpc_cred *cred;
unsigned callback_count;
gfp_t gfp_flags; gfp_t gfp_flags;
}; };
......
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