Skip to content

Commit 3e5f151

Browse files
author
Trond Myklebust
committed
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: Trond Myklebust <trond.myklebust@hammerspace.com>
1 parent 63d8a41 commit 3e5f151

1 file changed

Lines changed: 21 additions & 29 deletions

File tree

fs/nfs/flexfilelayout/flexfilelayout.c

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -663,7 +663,7 @@ nfs4_ff_layout_stat_io_start_read(struct inode *inode,
663663
spin_unlock(&mirror->lock);
664664

665665
if (report)
666-
pnfs_report_layoutstat(inode, GFP_KERNEL);
666+
pnfs_report_layoutstat(inode, nfs_io_gfp_mask());
667667
}
668668

669669
static void
@@ -694,7 +694,7 @@ nfs4_ff_layout_stat_io_start_write(struct inode *inode,
694694
spin_unlock(&mirror->lock);
695695

696696
if (report)
697-
pnfs_report_layoutstat(inode, GFP_KERNEL);
697+
pnfs_report_layoutstat(inode, nfs_io_gfp_mask());
698698
}
699699

700700
static void
@@ -806,13 +806,10 @@ ff_layout_pg_get_read(struct nfs_pageio_descriptor *pgio,
806806
bool strict_iomode)
807807
{
808808
pnfs_put_lseg(pgio->pg_lseg);
809-
pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
810-
nfs_req_openctx(req),
811-
req_offset(req),
812-
req->wb_bytes,
813-
IOMODE_READ,
814-
strict_iomode,
815-
GFP_KERNEL);
809+
pgio->pg_lseg =
810+
pnfs_update_layout(pgio->pg_inode, nfs_req_openctx(req),
811+
req_offset(req), req->wb_bytes, IOMODE_READ,
812+
strict_iomode, nfs_io_gfp_mask());
816813
if (IS_ERR(pgio->pg_lseg)) {
817814
pgio->pg_error = PTR_ERR(pgio->pg_lseg);
818815
pgio->pg_lseg = NULL;
@@ -894,13 +891,10 @@ ff_layout_pg_init_write(struct nfs_pageio_descriptor *pgio,
894891
retry:
895892
ff_layout_pg_check_layout(pgio, req);
896893
if (!pgio->pg_lseg) {
897-
pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
898-
nfs_req_openctx(req),
899-
req_offset(req),
900-
req->wb_bytes,
901-
IOMODE_RW,
902-
false,
903-
GFP_KERNEL);
894+
pgio->pg_lseg =
895+
pnfs_update_layout(pgio->pg_inode, nfs_req_openctx(req),
896+
req_offset(req), req->wb_bytes,
897+
IOMODE_RW, false, nfs_io_gfp_mask());
904898
if (IS_ERR(pgio->pg_lseg)) {
905899
pgio->pg_error = PTR_ERR(pgio->pg_lseg);
906900
pgio->pg_lseg = NULL;
@@ -953,13 +947,10 @@ ff_layout_pg_get_mirror_count_write(struct nfs_pageio_descriptor *pgio,
953947
struct nfs_page *req)
954948
{
955949
if (!pgio->pg_lseg) {
956-
pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
957-
nfs_req_openctx(req),
958-
req_offset(req),
959-
req->wb_bytes,
960-
IOMODE_RW,
961-
false,
962-
GFP_KERNEL);
950+
pgio->pg_lseg =
951+
pnfs_update_layout(pgio->pg_inode, nfs_req_openctx(req),
952+
req_offset(req), req->wb_bytes,
953+
IOMODE_RW, false, nfs_io_gfp_mask());
963954
if (IS_ERR(pgio->pg_lseg)) {
964955
pgio->pg_error = PTR_ERR(pgio->pg_lseg);
965956
pgio->pg_lseg = NULL;
@@ -1258,7 +1249,7 @@ static void ff_layout_io_track_ds_error(struct pnfs_layout_segment *lseg,
12581249
mirror = FF_LAYOUT_COMP(lseg, idx);
12591250
err = ff_layout_track_ds_error(FF_LAYOUT_FROM_HDR(lseg->pls_layout),
12601251
mirror, offset, length, status, opnum,
1261-
GFP_KERNEL);
1252+
nfs_io_gfp_mask());
12621253

12631254
switch (status) {
12641255
case NFS4ERR_DELAY:
@@ -1973,7 +1964,8 @@ ff_layout_setup_ds_info(struct pnfs_ds_commit_info *fl_cinfo,
19731964
struct inode *inode = lseg->pls_layout->plh_inode;
19741965
struct pnfs_commit_array *array, *new;
19751966

1976-
new = pnfs_alloc_commit_array(flseg->mirror_array_cnt, GFP_KERNEL);
1967+
new = pnfs_alloc_commit_array(flseg->mirror_array_cnt,
1968+
nfs_io_gfp_mask());
19771969
if (new) {
19781970
spin_lock(&inode->i_lock);
19791971
array = pnfs_add_commit_array(fl_cinfo, new, lseg);
@@ -2152,10 +2144,10 @@ ff_layout_prepare_layoutreturn(struct nfs4_layoutreturn_args *args)
21522144
struct nfs4_flexfile_layoutreturn_args *ff_args;
21532145
struct nfs4_flexfile_layout *ff_layout = FF_LAYOUT_FROM_HDR(args->layout);
21542146

2155-
ff_args = kmalloc(sizeof(*ff_args), GFP_KERNEL);
2147+
ff_args = kmalloc(sizeof(*ff_args), nfs_io_gfp_mask());
21562148
if (!ff_args)
21572149
goto out_nomem;
2158-
ff_args->pages[0] = alloc_page(GFP_KERNEL);
2150+
ff_args->pages[0] = alloc_page(nfs_io_gfp_mask());
21592151
if (!ff_args->pages[0])
21602152
goto out_nomem_free;
21612153

@@ -2193,7 +2185,7 @@ ff_layout_send_layouterror(struct pnfs_layout_segment *lseg)
21932185
return;
21942186

21952187
errors = kmalloc_array(NFS42_LAYOUTERROR_MAX, sizeof(*errors),
2196-
GFP_KERNEL);
2188+
nfs_io_gfp_mask());
21972189
if (errors != NULL) {
21982190
const struct nfs4_ff_layout_ds_err *pos;
21992191
size_t n = 0;
@@ -2445,7 +2437,7 @@ ff_layout_prepare_layoutstats(struct nfs42_layoutstat_args *args)
24452437

24462438
/* For now, send at most PNFS_LAYOUTSTATS_MAXDEV statistics */
24472439
args->devinfo = kmalloc_array(dev_count, sizeof(*args->devinfo),
2448-
GFP_KERNEL);
2440+
nfs_io_gfp_mask());
24492441
if (!args->devinfo)
24502442
return -ENOMEM;
24512443

0 commit comments

Comments
 (0)