[pnfs] [PATCH 3/5] pNFS: Fix start_server_index handling in file_layout
Dean Hildebrand
seattleplus at gmail.com
Tue May 6 19:45:40 EDT 2008
Signed-off-by: Dean Hildebrand <dhildeb at us.ibm.com>
---
fs/nfs/nfs4filelayoutdev.c | 16 ++++++++++------
1 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/fs/nfs/nfs4filelayoutdev.c b/fs/nfs/nfs4filelayoutdev.c
index d5fc9a6..dce1bd1 100644
--- a/fs/nfs/nfs4filelayoutdev.c
+++ b/fs/nfs/nfs4filelayoutdev.c
@@ -707,7 +707,7 @@ nfs4_pnfs_dserver_get(struct pnfs_layout_segment *lseg,
struct nfs4_filelayout_segment *layout = LSEG_LD_DATA(lseg);
struct inode *inode = PNFS_INODE(lseg->layout);
struct nfs4_pnfs_dev_item *di;
- u64 tmp;
+ u64 tmp, tmp2;
u32 stripe_idx, end_idx;
if (!layout)
@@ -718,24 +718,28 @@ nfs4_pnfs_dserver_get(struct pnfs_layout_segment *lseg,
if (di == NULL)
return 1;
- /* Want ((offset / layout->stripe_unit) % di->stripe_count)
- * n_str = stripe for offset */
+ /* Want res = ((offset / layout->stripe_unit) % di->stripe_count)
+ * Then: ((res + fsi) % di->stripe_count)
+ */
tmp = offset;
do_div(tmp, layout->stripe_unit);
- stripe_idx = do_div(tmp, di->stripe_count) + layout->first_stripe_index;
+ tmp2 = do_div(tmp, di->stripe_count) + layout->first_stripe_index;
+ stripe_idx = do_div(tmp2, di->stripe_count);
tmp = offset + count - 1;
do_div(tmp, layout->stripe_unit);
- end_idx = do_div(tmp, di->stripe_count) + layout->first_stripe_index;
+ tmp2 = do_div(tmp, di->stripe_count) + layout->first_stripe_index;
+ end_idx = do_div(tmp2, di->stripe_count);
dprintk("%s: offset=%Lu, count=%Zu, si=%u, dsi=%u, "
- "stripe_count=%u, stripe_unit=%u first_stripe_index %d\n",
+ "stripe_count=%u, stripe_unit=%u first_stripe_index %u\n",
__func__,
offset, count, stripe_idx, end_idx, di->stripe_count,
layout->stripe_unit, layout->first_stripe_index);
BUG_ON(end_idx != stripe_idx);
+ BUG_ON(stripe_idx >= di->stripe_count);
dserver->dev = &di->stripe_devs[stripe_idx];
if (dserver->dev == NULL)
--
1.5.3.3
More information about the pNFS
mailing list