Skip to content

Commit 63d8a41

Browse files
author
Trond Myklebust
committed
NFSv4/pnfs: Ensure pNFS allocation modes are consistent with nfsiod
Ensure that pNFS allocations that can be called from rpciod/nfsiod callback 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 0bae835 commit 63d8a41

2 files changed

Lines changed: 18 additions & 23 deletions

File tree

fs/nfs/nfs42proc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1017,7 +1017,7 @@ int nfs42_proc_layouterror(struct pnfs_layout_segment *lseg,
10171017
return -EOPNOTSUPP;
10181018
if (n > NFS42_LAYOUTERROR_MAX)
10191019
return -EINVAL;
1020-
data = nfs42_alloc_layouterror_data(lseg, GFP_KERNEL);
1020+
data = nfs42_alloc_layouterror_data(lseg, nfs_io_gfp_mask());
10211021
if (!data)
10221022
return -ENOMEM;
10231023
for (i = 0; i < n; i++) {

fs/nfs/pnfs.c

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1233,7 +1233,7 @@ pnfs_send_layoutreturn(struct pnfs_layout_hdr *lo,
12331233
int status = 0;
12341234

12351235
*pcred = NULL;
1236-
lrp = kzalloc(sizeof(*lrp), GFP_KERNEL);
1236+
lrp = kzalloc(sizeof(*lrp), nfs_io_gfp_mask());
12371237
if (unlikely(lrp == NULL)) {
12381238
status = -ENOMEM;
12391239
spin_lock(&ino->i_lock);
@@ -2206,7 +2206,7 @@ _pnfs_grab_empty_layout(struct inode *ino, struct nfs_open_context *ctx)
22062206
struct pnfs_layout_hdr *lo;
22072207

22082208
spin_lock(&ino->i_lock);
2209-
lo = pnfs_find_alloc_layout(ino, ctx, GFP_KERNEL);
2209+
lo = pnfs_find_alloc_layout(ino, ctx, nfs_io_gfp_mask());
22102210
if (!lo)
22112211
goto out_unlock;
22122212
if (!test_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags))
@@ -2249,8 +2249,8 @@ static void _lgopen_prepare_attached(struct nfs4_opendata *data,
22492249
lo = _pnfs_grab_empty_layout(ino, ctx);
22502250
if (!lo)
22512251
return;
2252-
lgp = pnfs_alloc_init_layoutget_args(ino, ctx, &current_stateid,
2253-
&rng, GFP_KERNEL);
2252+
lgp = pnfs_alloc_init_layoutget_args(ino, ctx, &current_stateid, &rng,
2253+
nfs_io_gfp_mask());
22542254
if (!lgp) {
22552255
pnfs_clear_first_layoutget(lo);
22562256
nfs_layoutget_end(lo);
@@ -2275,8 +2275,8 @@ static void _lgopen_prepare_floating(struct nfs4_opendata *data,
22752275
};
22762276
struct nfs4_layoutget *lgp;
22772277

2278-
lgp = pnfs_alloc_init_layoutget_args(ino, ctx, &current_stateid,
2279-
&rng, GFP_KERNEL);
2278+
lgp = pnfs_alloc_init_layoutget_args(ino, ctx, &current_stateid, &rng,
2279+
nfs_io_gfp_mask());
22802280
if (!lgp)
22812281
return;
22822282
data->lgp = lgp;
@@ -2691,13 +2691,11 @@ pnfs_generic_pg_init_read(struct nfs_pageio_descriptor *pgio, struct nfs_page *r
26912691
else
26922692
rd_size = nfs_dreq_bytes_left(pgio->pg_dreq);
26932693

2694-
pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
2695-
nfs_req_openctx(req),
2696-
req_offset(req),
2697-
rd_size,
2698-
IOMODE_READ,
2699-
false,
2700-
GFP_KERNEL);
2694+
pgio->pg_lseg =
2695+
pnfs_update_layout(pgio->pg_inode, nfs_req_openctx(req),
2696+
req_offset(req), rd_size,
2697+
IOMODE_READ, false,
2698+
nfs_io_gfp_mask());
27012699
if (IS_ERR(pgio->pg_lseg)) {
27022700
pgio->pg_error = PTR_ERR(pgio->pg_lseg);
27032701
pgio->pg_lseg = NULL;
@@ -2718,13 +2716,10 @@ pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *pgio,
27182716
pnfs_generic_pg_check_layout(pgio);
27192717
pnfs_generic_pg_check_range(pgio, req);
27202718
if (pgio->pg_lseg == NULL) {
2721-
pgio->pg_lseg = pnfs_update_layout(pgio->pg_inode,
2722-
nfs_req_openctx(req),
2723-
req_offset(req),
2724-
wb_size,
2725-
IOMODE_RW,
2726-
false,
2727-
GFP_KERNEL);
2719+
pgio->pg_lseg =
2720+
pnfs_update_layout(pgio->pg_inode, nfs_req_openctx(req),
2721+
req_offset(req), wb_size, IOMODE_RW,
2722+
false, nfs_io_gfp_mask());
27282723
if (IS_ERR(pgio->pg_lseg)) {
27292724
pgio->pg_error = PTR_ERR(pgio->pg_lseg);
27302725
pgio->pg_lseg = NULL;
@@ -3183,7 +3178,7 @@ pnfs_layoutcommit_inode(struct inode *inode, bool sync)
31833178

31843179
status = -ENOMEM;
31853180
/* Note kzalloc ensures data->res.seq_res.sr_slot == NULL */
3186-
data = kzalloc(sizeof(*data), GFP_NOFS);
3181+
data = kzalloc(sizeof(*data), nfs_io_gfp_mask());
31873182
if (!data)
31883183
goto clear_layoutcommitting;
31893184

@@ -3250,7 +3245,7 @@ struct nfs4_threshold *pnfs_mdsthreshold_alloc(void)
32503245
{
32513246
struct nfs4_threshold *thp;
32523247

3253-
thp = kzalloc(sizeof(*thp), GFP_KERNEL);
3248+
thp = kzalloc(sizeof(*thp), nfs_io_gfp_mask());
32543249
if (!thp) {
32553250
dprintk("%s mdsthreshold allocation failed\n", __func__);
32563251
return NULL;

0 commit comments

Comments
 (0)