[pnfs] [PATCH 27/37] pnfs: client layout cache: lseg search and compare infrastructure
Benny Halevy
bhalevy at panasas.com
Tue Jan 1 05:51:30 EST 2008
Signed-off-by: Benny Halevy <bhalevy at panasas.com>
---
fs/nfs/pnfs.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 59 insertions(+), 0 deletions(-)
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index ac3490b..f9cbe8e 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -365,6 +365,65 @@ put_lseg(struct pnfs_layout_segment *lseg)
kref_put(&lseg->kref, destroy_lseg);
}
+static inline u64
+end_offset(u64 start, u64 len)
+{
+ u64 end;
+
+ end = start + len;
+ return end >= start ? end: NFS4_LENGTH_EOF;
+}
+
+/* last octet in a range */
+static inline u64
+last_byte_offset(u64 start, u64 len)
+{
+ u64 end;
+
+ BUG_ON(!len);
+ end = start + len;
+ return end > start ? end - 1: NFS4_LENGTH_EOF;
+}
+
+/*
+ * is l2 fully contained in l1?
+ * start1 end1
+ * [----------------------------------)
+ * start2 end2
+ * [----------------)
+ */
+static inline int
+lo_seg_contained(struct nfs4_pnfs_layout_segment *l1,
+ struct nfs4_pnfs_layout_segment *l2)
+{
+ u64 start1 = l1->offset;
+ u64 end1 = end_offset(start1, l1->length);
+ u64 start2 = l2->offset;
+ u64 end2 = end_offset(start2, l2->length);
+
+ return (start1 <= start2) && (end1 >= end2);
+}
+
+/*
+ * is l1 and l2 intersecting?
+ * start1 end1
+ * [----------------------------------)
+ * start2 end2
+ * [----------------)
+ */
+static inline int
+lo_seg_intersecting(struct nfs4_pnfs_layout_segment *l1,
+ struct nfs4_pnfs_layout_segment *l2)
+{
+ u64 start1 = l1->offset;
+ u64 end1 = end_offset(start1, l1->length);
+ u64 start2 = l2->offset;
+ u64 end2 = end_offset(start2, l2->length);
+
+ return (end1 == NFS4_LENGTH_EOF || end1 > start2) &&
+ (end2 == NFS4_LENGTH_EOF || end2 > start1);
+}
+
/*
* Get layout from server.
* for now, assume that whole file layouts are requested.
--
1.5.3.3
More information about the pNFS
mailing list