[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