NFS: Relax requirements in nfs_flush_incompatible
If two processes share the same credentials and NFSv4 open stateid, then allow them both to dirty the same page, even if their nfs_open_context differs. Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
parent
b20135d0b2
commit
138a2935dc
|
@ -264,6 +264,12 @@ static inline bool nfs_pgio_has_mirroring(struct nfs_pageio_descriptor *desc)
|
||||||
return desc->pg_mirror_count > 1;
|
return desc->pg_mirror_count > 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool nfs_match_open_context(const struct nfs_open_context *ctx1,
|
||||||
|
const struct nfs_open_context *ctx2)
|
||||||
|
{
|
||||||
|
return ctx1->cred == ctx2->cred && ctx1->state == ctx2->state;
|
||||||
|
}
|
||||||
|
|
||||||
/* nfs2xdr.c */
|
/* nfs2xdr.c */
|
||||||
extern struct rpc_procinfo nfs_procedures[];
|
extern struct rpc_procinfo nfs_procedures[];
|
||||||
extern int nfs2_decode_dirent(struct xdr_stream *,
|
extern int nfs2_decode_dirent(struct xdr_stream *,
|
||||||
|
|
|
@ -903,12 +903,6 @@ static void nfs_pageio_cleanup_mirroring(struct nfs_pageio_descriptor *pgio)
|
||||||
pgio->pg_mirrors_dynamic = NULL;
|
pgio->pg_mirrors_dynamic = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool nfs_match_open_context(const struct nfs_open_context *ctx1,
|
|
||||||
const struct nfs_open_context *ctx2)
|
|
||||||
{
|
|
||||||
return ctx1->cred == ctx2->cred && ctx1->state == ctx2->state;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool nfs_match_lock_context(const struct nfs_lock_context *l1,
|
static bool nfs_match_lock_context(const struct nfs_lock_context *l1,
|
||||||
const struct nfs_lock_context *l2)
|
const struct nfs_lock_context *l2)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1130,7 +1130,8 @@ int nfs_flush_incompatible(struct file *file, struct page *page)
|
||||||
if (req == NULL)
|
if (req == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
l_ctx = req->wb_lock_context;
|
l_ctx = req->wb_lock_context;
|
||||||
do_flush = req->wb_page != page || req->wb_context != ctx;
|
do_flush = req->wb_page != page ||
|
||||||
|
!nfs_match_open_context(req->wb_context, ctx);
|
||||||
/* for now, flush if more than 1 request in page_group */
|
/* for now, flush if more than 1 request in page_group */
|
||||||
do_flush |= req->wb_this_page != req;
|
do_flush |= req->wb_this_page != req;
|
||||||
if (l_ctx && flctx &&
|
if (l_ctx && flctx &&
|
||||||
|
|
Loading…
Reference in New Issue