Commit 3e5f151e authored by Trond Myklebust's avatar Trond Myklebust

pNFS/flexfiles: Ensure pNFS allocation modes are consistent with nfsiod

Ensure that pNFS flexfile allocations in rpciod/nfsiod callbacks can
fail in low memory mode, so that the threads don't block and loop
forever.
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent 63d8a41b
...@@ -663,7 +663,7 @@ nfs4_ff_layout_stat_io_start_read(struct inode *inode, ...@@ -663,7 +663,7 @@ nfs4_ff_layout_stat_io_start_read(struct inode *inode,
spin_unlock(&mirror->lock); spin_unlock(&mirror->lock);
if (report) if (report)
pnfs_report_layoutstat(inode, GFP_KERNEL); pnfs_report_layoutstat(inode, nfs_io_gfp_mask());
} }
static void static void
...@@ -694,7 +694,7 @@ nfs4_ff_layout_stat_io_start_write(struct inode *inode, ...@@ -694,7 +694,7 @@ nfs4_ff_layout_stat_io_start_write(struct inode *inode,
spin_unlock(&mirror->lock); spin_unlock(&mirror->lock);
if (report) if (report)
pnfs_report_layoutstat(inode, GFP_KERNEL); pnfs_report_layoutstat(inode, nfs_io_gfp_mask());
} }
static void static void
...@@ -806,13 +806,10 @@ ff_layout_pg_get_read(struct nfs_pageio_descriptor *pgio, ...@@ -806,13 +806,10 @@ ff_layout_pg_get_read(struct nfs_pageio_descriptor *pgio,
bool strict_iomode) bool strict_iomode)
{ {
pnfs_put_lseg(pgio->pg_lseg); pnfs_put_lseg(pgio->pg_lseg);
pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode, pgio->pg_lseg =
nfs_req_openctx(req), pnfs_update_layout(pgio->pg_inode, nfs_req_openctx(req),
req_offset(req), req_offset(req), req->wb_bytes, IOMODE_READ,
req->wb_bytes, strict_iomode, nfs_io_gfp_mask());
IOMODE_READ,
strict_iomode,
GFP_KERNEL);
if (IS_ERR(pgio->pg_lseg)) { if (IS_ERR(pgio->pg_lseg)) {
pgio->pg_error = PTR_ERR(pgio->pg_lseg); pgio->pg_error = PTR_ERR(pgio->pg_lseg);
pgio->pg_lseg = NULL; pgio->pg_lseg = NULL;
...@@ -894,13 +891,10 @@ ff_layout_pg_init_write(struct nfs_pageio_descriptor *pgio, ...@@ -894,13 +891,10 @@ ff_layout_pg_init_write(struct nfs_pageio_descriptor *pgio,
retry: retry:
ff_layout_pg_check_layout(pgio, req); ff_layout_pg_check_layout(pgio, req);
if (!pgio->pg_lseg) { if (!pgio->pg_lseg) {
pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode, pgio->pg_lseg =
nfs_req_openctx(req), pnfs_update_layout(pgio->pg_inode, nfs_req_openctx(req),
req_offset(req), req_offset(req), req->wb_bytes,
req->wb_bytes, IOMODE_RW, false, nfs_io_gfp_mask());
IOMODE_RW,
false,
GFP_KERNEL);
if (IS_ERR(pgio->pg_lseg)) { if (IS_ERR(pgio->pg_lseg)) {
pgio->pg_error = PTR_ERR(pgio->pg_lseg); pgio->pg_error = PTR_ERR(pgio->pg_lseg);
pgio->pg_lseg = NULL; pgio->pg_lseg = NULL;
...@@ -953,13 +947,10 @@ ff_layout_pg_get_mirror_count_write(struct nfs_pageio_descriptor *pgio, ...@@ -953,13 +947,10 @@ ff_layout_pg_get_mirror_count_write(struct nfs_pageio_descriptor *pgio,
struct nfs_page *req) struct nfs_page *req)
{ {
if (!pgio->pg_lseg) { if (!pgio->pg_lseg) {
pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode, pgio->pg_lseg =
nfs_req_openctx(req), pnfs_update_layout(pgio->pg_inode, nfs_req_openctx(req),
req_offset(req), req_offset(req), req->wb_bytes,
req->wb_bytes, IOMODE_RW, false, nfs_io_gfp_mask());
IOMODE_RW,
false,
GFP_KERNEL);
if (IS_ERR(pgio->pg_lseg)) { if (IS_ERR(pgio->pg_lseg)) {
pgio->pg_error = PTR_ERR(pgio->pg_lseg); pgio->pg_error = PTR_ERR(pgio->pg_lseg);
pgio->pg_lseg = NULL; pgio->pg_lseg = NULL;
...@@ -1258,7 +1249,7 @@ static void ff_layout_io_track_ds_error(struct pnfs_layout_segment *lseg, ...@@ -1258,7 +1249,7 @@ static void ff_layout_io_track_ds_error(struct pnfs_layout_segment *lseg,
mirror = FF_LAYOUT_COMP(lseg, idx); mirror = FF_LAYOUT_COMP(lseg, idx);
err = ff_layout_track_ds_error(FF_LAYOUT_FROM_HDR(lseg->pls_layout), err = ff_layout_track_ds_error(FF_LAYOUT_FROM_HDR(lseg->pls_layout),
mirror, offset, length, status, opnum, mirror, offset, length, status, opnum,
GFP_KERNEL); nfs_io_gfp_mask());
switch (status) { switch (status) {
case NFS4ERR_DELAY: case NFS4ERR_DELAY:
...@@ -1973,7 +1964,8 @@ ff_layout_setup_ds_info(struct pnfs_ds_commit_info *fl_cinfo, ...@@ -1973,7 +1964,8 @@ ff_layout_setup_ds_info(struct pnfs_ds_commit_info *fl_cinfo,
struct inode *inode = lseg->pls_layout->plh_inode; struct inode *inode = lseg->pls_layout->plh_inode;
struct pnfs_commit_array *array, *new; struct pnfs_commit_array *array, *new;
new = pnfs_alloc_commit_array(flseg->mirror_array_cnt, GFP_KERNEL); new = pnfs_alloc_commit_array(flseg->mirror_array_cnt,
nfs_io_gfp_mask());
if (new) { if (new) {
spin_lock(&inode->i_lock); spin_lock(&inode->i_lock);
array = pnfs_add_commit_array(fl_cinfo, new, lseg); array = pnfs_add_commit_array(fl_cinfo, new, lseg);
...@@ -2152,10 +2144,10 @@ ff_layout_prepare_layoutreturn(struct nfs4_layoutreturn_args *args) ...@@ -2152,10 +2144,10 @@ ff_layout_prepare_layoutreturn(struct nfs4_layoutreturn_args *args)
struct nfs4_flexfile_layoutreturn_args *ff_args; struct nfs4_flexfile_layoutreturn_args *ff_args;
struct nfs4_flexfile_layout *ff_layout = FF_LAYOUT_FROM_HDR(args->layout); struct nfs4_flexfile_layout *ff_layout = FF_LAYOUT_FROM_HDR(args->layout);
ff_args = kmalloc(sizeof(*ff_args), GFP_KERNEL); ff_args = kmalloc(sizeof(*ff_args), nfs_io_gfp_mask());
if (!ff_args) if (!ff_args)
goto out_nomem; goto out_nomem;
ff_args->pages[0] = alloc_page(GFP_KERNEL); ff_args->pages[0] = alloc_page(nfs_io_gfp_mask());
if (!ff_args->pages[0]) if (!ff_args->pages[0])
goto out_nomem_free; goto out_nomem_free;
...@@ -2193,7 +2185,7 @@ ff_layout_send_layouterror(struct pnfs_layout_segment *lseg) ...@@ -2193,7 +2185,7 @@ ff_layout_send_layouterror(struct pnfs_layout_segment *lseg)
return; return;
errors = kmalloc_array(NFS42_LAYOUTERROR_MAX, sizeof(*errors), errors = kmalloc_array(NFS42_LAYOUTERROR_MAX, sizeof(*errors),
GFP_KERNEL); nfs_io_gfp_mask());
if (errors != NULL) { if (errors != NULL) {
const struct nfs4_ff_layout_ds_err *pos; const struct nfs4_ff_layout_ds_err *pos;
size_t n = 0; size_t n = 0;
...@@ -2445,7 +2437,7 @@ ff_layout_prepare_layoutstats(struct nfs42_layoutstat_args *args) ...@@ -2445,7 +2437,7 @@ ff_layout_prepare_layoutstats(struct nfs42_layoutstat_args *args)
/* For now, send at most PNFS_LAYOUTSTATS_MAXDEV statistics */ /* For now, send at most PNFS_LAYOUTSTATS_MAXDEV statistics */
args->devinfo = kmalloc_array(dev_count, sizeof(*args->devinfo), args->devinfo = kmalloc_array(dev_count, sizeof(*args->devinfo),
GFP_KERNEL); nfs_io_gfp_mask());
if (!args->devinfo) if (!args->devinfo)
return -ENOMEM; return -ENOMEM;
......
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