[pnfs] [PATCH 30/37] pnfs: client layout cache: free_layout infrastructure

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


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

diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 116383d..6c5f527 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -461,6 +461,37 @@ get_layout(struct inode *ino,
 	return status;
 }
 
+static inline int
+free_matching_lseg(struct pnfs_layout_segment *lseg,
+		   struct nfs4_pnfs_layout_segment *range)
+{
+	return (range->iomode == IOMODE_ANY ||
+		lseg->range.iomode == range->iomode) &&
+	       lo_seg_intersecting(&lseg->range, range);
+}
+
+static void
+pnfs_free_layout(struct pnfs_layout_type *lo,
+		 struct nfs4_pnfs_layout_segment *range)
+{
+	struct pnfs_layout_segment *lseg, *next;
+	dprintk("%s:Begin\n", __FUNCTION__);
+
+	BUG_ON_UNLOCKED_LO(lo);
+	list_for_each_entry_safe (lseg, next, &lo->segs, fi_list) {
+		if (!free_matching_lseg(lseg, range))
+			continue;
+		dprintk("%s: freeing lseg %p iomode %d "
+			"offset %llu length %lld\n", __FUNCTION__,
+			lseg, lseg->range.iomode, lseg->range.offset,
+			lseg->range.length);
+		list_del(&lseg->fi_list);
+		put_lseg(lseg);
+	}
+
+	dprintk("%s:Return\n", __FUNCTION__);
+}
+
 int
 pnfs_return_layout(struct inode *ino, struct nfs4_pnfs_layout_segment *range)
 {
-- 
1.5.3.3



More information about the pNFS mailing list