diff options
Diffstat (limited to 'fs/nfs/flexfilelayout')
-rw-r--r-- | fs/nfs/flexfilelayout/flexfilelayout.c | 21 | ||||
-rw-r--r-- | fs/nfs/flexfilelayout/flexfilelayout.h | 4 | ||||
-rw-r--r-- | fs/nfs/flexfilelayout/flexfilelayoutdev.c | 19 |
3 files changed, 32 insertions, 12 deletions
diff --git a/fs/nfs/flexfilelayout/flexfilelayout.c b/fs/nfs/flexfilelayout/flexfilelayout.c index 86bcba40ca61..74b36ed883ca 100644 --- a/fs/nfs/flexfilelayout/flexfilelayout.c +++ b/fs/nfs/flexfilelayout/flexfilelayout.c | |||
@@ -1361,12 +1361,7 @@ static void ff_layout_read_prepare_v4(struct rpc_task *task, void *data) | |||
1361 | task)) | 1361 | task)) |
1362 | return; | 1362 | return; |
1363 | 1363 | ||
1364 | if (ff_layout_read_prepare_common(task, hdr)) | 1364 | ff_layout_read_prepare_common(task, hdr); |
1365 | return; | ||
1366 | |||
1367 | if (nfs4_set_rw_stateid(&hdr->args.stateid, hdr->args.context, | ||
1368 | hdr->args.lock_context, FMODE_READ) == -EIO) | ||
1369 | rpc_exit(task, -EIO); /* lost lock, terminate I/O */ | ||
1370 | } | 1365 | } |
1371 | 1366 | ||
1372 | static void ff_layout_read_call_done(struct rpc_task *task, void *data) | 1367 | static void ff_layout_read_call_done(struct rpc_task *task, void *data) |
@@ -1542,12 +1537,7 @@ static void ff_layout_write_prepare_v4(struct rpc_task *task, void *data) | |||
1542 | task)) | 1537 | task)) |
1543 | return; | 1538 | return; |
1544 | 1539 | ||
1545 | if (ff_layout_write_prepare_common(task, hdr)) | 1540 | ff_layout_write_prepare_common(task, hdr); |
1546 | return; | ||
1547 | |||
1548 | if (nfs4_set_rw_stateid(&hdr->args.stateid, hdr->args.context, | ||
1549 | hdr->args.lock_context, FMODE_WRITE) == -EIO) | ||
1550 | rpc_exit(task, -EIO); /* lost lock, terminate I/O */ | ||
1551 | } | 1541 | } |
1552 | 1542 | ||
1553 | static void ff_layout_write_call_done(struct rpc_task *task, void *data) | 1543 | static void ff_layout_write_call_done(struct rpc_task *task, void *data) |
@@ -1742,6 +1732,10 @@ ff_layout_read_pagelist(struct nfs_pgio_header *hdr) | |||
1742 | fh = nfs4_ff_layout_select_ds_fh(lseg, idx); | 1732 | fh = nfs4_ff_layout_select_ds_fh(lseg, idx); |
1743 | if (fh) | 1733 | if (fh) |
1744 | hdr->args.fh = fh; | 1734 | hdr->args.fh = fh; |
1735 | |||
1736 | if (!nfs4_ff_layout_select_ds_stateid(lseg, idx, &hdr->args.stateid)) | ||
1737 | goto out_failed; | ||
1738 | |||
1745 | /* | 1739 | /* |
1746 | * Note that if we ever decide to split across DSes, | 1740 | * Note that if we ever decide to split across DSes, |
1747 | * then we may need to handle dense-like offsets. | 1741 | * then we may need to handle dense-like offsets. |
@@ -1804,6 +1798,9 @@ ff_layout_write_pagelist(struct nfs_pgio_header *hdr, int sync) | |||
1804 | if (fh) | 1798 | if (fh) |
1805 | hdr->args.fh = fh; | 1799 | hdr->args.fh = fh; |
1806 | 1800 | ||
1801 | if (!nfs4_ff_layout_select_ds_stateid(lseg, idx, &hdr->args.stateid)) | ||
1802 | goto out_failed; | ||
1803 | |||
1807 | /* | 1804 | /* |
1808 | * Note that if we ever decide to split across DSes, | 1805 | * Note that if we ever decide to split across DSes, |
1809 | * then we may need to handle dense-like offsets. | 1806 | * then we may need to handle dense-like offsets. |
diff --git a/fs/nfs/flexfilelayout/flexfilelayout.h b/fs/nfs/flexfilelayout/flexfilelayout.h index 411798346e48..de50a342d5a5 100644 --- a/fs/nfs/flexfilelayout/flexfilelayout.h +++ b/fs/nfs/flexfilelayout/flexfilelayout.h | |||
@@ -215,6 +215,10 @@ unsigned int ff_layout_fetch_ds_ioerr(struct pnfs_layout_hdr *lo, | |||
215 | unsigned int maxnum); | 215 | unsigned int maxnum); |
216 | struct nfs_fh * | 216 | struct nfs_fh * |
217 | nfs4_ff_layout_select_ds_fh(struct pnfs_layout_segment *lseg, u32 mirror_idx); | 217 | nfs4_ff_layout_select_ds_fh(struct pnfs_layout_segment *lseg, u32 mirror_idx); |
218 | int | ||
219 | nfs4_ff_layout_select_ds_stateid(struct pnfs_layout_segment *lseg, | ||
220 | u32 mirror_idx, | ||
221 | nfs4_stateid *stateid); | ||
218 | 222 | ||
219 | struct nfs4_pnfs_ds * | 223 | struct nfs4_pnfs_ds * |
220 | nfs4_ff_layout_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx, | 224 | nfs4_ff_layout_prepare_ds(struct pnfs_layout_segment *lseg, u32 ds_idx, |
diff --git a/fs/nfs/flexfilelayout/flexfilelayoutdev.c b/fs/nfs/flexfilelayout/flexfilelayoutdev.c index 74d8d5352438..d23347389626 100644 --- a/fs/nfs/flexfilelayout/flexfilelayoutdev.c +++ b/fs/nfs/flexfilelayout/flexfilelayoutdev.c | |||
@@ -370,6 +370,25 @@ out: | |||
370 | return fh; | 370 | return fh; |
371 | } | 371 | } |
372 | 372 | ||
373 | int | ||
374 | nfs4_ff_layout_select_ds_stateid(struct pnfs_layout_segment *lseg, | ||
375 | u32 mirror_idx, | ||
376 | nfs4_stateid *stateid) | ||
377 | { | ||
378 | struct nfs4_ff_layout_mirror *mirror = FF_LAYOUT_COMP(lseg, mirror_idx); | ||
379 | |||
380 | if (!ff_layout_mirror_valid(lseg, mirror, false)) { | ||
381 | pr_err_ratelimited("NFS: %s: No data server for mirror offset index %d\n", | ||
382 | __func__, mirror_idx); | ||
383 | goto out; | ||
384 | } | ||
385 | |||
386 | nfs4_stateid_copy(stateid, &mirror->stateid); | ||
387 | return 1; | ||
388 | out: | ||
389 | return 0; | ||
390 | } | ||
391 | |||
373 | /** | 392 | /** |
374 | * nfs4_ff_layout_prepare_ds - prepare a DS connection for an RPC call | 393 | * nfs4_ff_layout_prepare_ds - prepare a DS connection for an RPC call |
375 | * @lseg: the layout segment we're operating on | 394 | * @lseg: the layout segment we're operating on |