[pnfs] [PATCH 28/37] pnfs: client layout cache: has_layout infrastructure

Benny Halevy bhalevy at panasas.com
Tue Jan 1 05:51:35 EST 2008


Signed-off-by: Benny Halevy <bhalevy at panasas.com>
---
 fs/nfs/pnfs.c |   34 ++++++++++++++++++++++++++++++++++
 1 files changed, 34 insertions(+), 0 deletions(-)

diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index f9cbe8e..55ec489 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -626,6 +626,40 @@ err:
 	return lo;
 }
 
+static inline int
+has_matching_lseg(struct pnfs_layout_segment *lseg,
+		  struct nfs4_pnfs_layout_segment *range)
+{
+	return (range->iomode == IOMODE_READ ||
+		lseg->range.iomode == IOMODE_RW) &&
+	       lo_seg_contained(&lseg->range, range);
+}
+
+/*
+ * lookup range in layout
+ */
+static struct pnfs_layout_segment *
+pnfs_has_layout(struct pnfs_layout_type *lo,
+		struct nfs4_pnfs_layout_segment *range,
+		int take_ref)
+{
+	struct pnfs_layout_segment *lseg, *ret = NULL;
+
+	dprintk("%s:Begin\n", __FUNCTION__);
+
+	BUG_ON_UNLOCKED_LO(lo);
+	list_for_each_entry (lseg, &lo->segs, fi_list) {
+		if (!has_matching_lseg(lseg, range))
+			continue;
+		ret = lseg;
+		if (take_ref)
+			kref_get(&ret->kref);
+	}
+
+	dprintk("%s:Return %p\n", __FUNCTION__, ret);
+	return ret;
+}
+
 /* Update the file's layout for the given range and iomode.
  * Layout is retreived from the server if needed.
  */
-- 
1.5.3.3



More information about the pNFS mailing list