[pnfs] [PATCH 1/1] panlayout: implement 64-bit atomic ops for non-64-bit architectures.

Benny Halevy bhalevy at panasas.com
Thu Mar 20 09:02:08 EDT 2008


delta_space_used was defined as atomic64_t which is not avaiable on
non-64 bit architectures.  Define it using a spin_lock and a signed 64-bit
counter where atomic64_t is not avaiable.

Signed-off-by: Benny Halevy <bhalevy at panasas.com>
---
 fs/nfs/panlayout/panlayout.c |   10 ++++--
 fs/nfs/panlayout/panlayout.h |   77 +++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 83 insertions(+), 4 deletions(-)

diff --git a/fs/nfs/panlayout/panlayout.c b/fs/nfs/panlayout/panlayout.c
index 34e11f2..debe212 100644
--- a/fs/nfs/panlayout/panlayout.c
+++ b/fs/nfs/panlayout/panlayout.c
@@ -62,6 +62,10 @@ panlayout_alloc_layout(struct pnfs_mount_type *mountid, struct inode *inode)
 
 	pnfslay = kzalloc(sizeof(struct pnfs_layout_type) +
 			  sizeof(struct panlayout), GFP_KERNEL);
+	if (pnfslay) {
+		struct panlayout *panlay = PNFS_LD_DATA(pnfslay);
+		panlayout_atomic64_init(&panlay->delta_space_used);
+	}
 	dprintk("%s: Return %p\n", __func__, pnfslay);
 	return pnfslay;
 }
@@ -294,8 +298,8 @@ panlayout_write_done(struct panlayout_io_state *state)
 
 		wdata->res.count = state->status;
 		wdata->verf.committed = state->committed;
-		atomic64_add(state->delta_space_used,
-			     &panlay->delta_space_used);
+		panlayout_atomic64_add(state->delta_space_used,
+				       &panlay->delta_space_used);
 		dprintk("%s: Return status %d committed %d space_used %lld\n",
 			__func__, wdata->task.tk_status,
 			wdata->verf.committed, state->delta_space_used);
@@ -365,7 +369,7 @@ panlayout_setup_layoutcommit(struct pnfs_layout_type *pnfslay,
 
 	panlay = PNFS_LD_DATA(pnfslay);
 
-	delta = atomic64_xchg(&panlay->delta_space_used, 0);
+	delta = panlayout_atomic64_xchg(&panlay->delta_space_used, 0);
 
 	if (!delta)
 		goto out;
diff --git a/fs/nfs/panlayout/panlayout.h b/fs/nfs/panlayout/panlayout.h
index 1f3f7ba..6514bfc 100644
--- a/fs/nfs/panlayout/panlayout.h
+++ b/fs/nfs/panlayout/panlayout.h
@@ -63,11 +63,86 @@ struct panlayout_segment {
 	u8 pnfs_osd_layout[];
 };
 
+#if BITS_PER_LONG == 64
+struct panlayout_atomic64 {
+	atomic64_t val;
+};
+
+static inline void panlayout_atomic64_init(struct panlayout_atomic64 *p)
+{
+}
+
+static inline s64 panlayout_atomic64_read(struct panlayout_atomic64 *p)
+{
+	return atomic64_read(&p->val);
+}
+
+static inline void panlayout_atomic64_set(struct panlayout_atomic64 *p, s64 val)
+{
+	atomic64_set(&p->val, val);
+}
+
+static inline void panlayout_atomic64_add(s64 val, struct panlayout_atomic64 *p)
+{
+	atomic64_add(val, &p->val);
+}
+
+static inline s64 panlayout_atomic64_xchg(struct panlayout_atomic64 *p, s64 val)
+{
+	return atomic64_xchg(&p->val, val);
+}
+#else  /* BITS_PER_LONG == 64 */
+struct panlayout_atomic64 {
+	spin_lock_t lock;
+	s64 val;
+};
+
+static inline void panlayout_atomic64_init(struct panlayout_atomic64 *p)
+{
+	spin_lock_init(&p->lock);
+}
+
+static inline s64 panlayout_atomic64_read(struct panlayout_atomic64 *p)
+{
+	s64 val;
+
+	spin_lock(&p->lock);
+	val = p->val;
+	spin_unlock(&p->lock);
+	return val;
+}
+
+static inline void panlayout_atomic64_set(struct panlayout_atomic64 *p, s64 val)
+{
+	spin_lock(&p->lock);
+	p->val = val;
+	spin_unlock(&p->lock);
+}
+
+static inline void panlayout_atomic64_add(s64 val, struct panlayout_atomic64 *p)
+{
+	spin_lock(&p->lock);
+	p->val += val;
+	spin_unlock(&p->lock);
+}
+
+static inline s64 panlayout_atomic64_xchg(struct panlayout_atomic64 *p, s64 val)
+{
+	s64 old;
+
+	spin_lock(&p->lock);
+	old = p->val;
+	p->val = val;
+	spin_unlock(&p->lock);
+	return old;
+}
+#endif /* BITS_PER_LONG == 64 */
+
 /*
  * per-inode layout
  */
 struct panlayout {
-	atomic64_t delta_space_used;       /* space consumed by write ops */
+	struct panlayout_atomic64 delta_space_used;  /* consumed by write ops */
 };
 
 /*
-- 
1.5.3.3



More information about the pNFS mailing list