summaryrefslogtreecommitdiffstats
path: root/xlators
diff options
context:
space:
mode:
authorRaghavendra G <raghavendra@gluster.com>2011-06-14 23:55:30 +0000
committerAnand Avati <avati@gluster.com>2011-06-16 22:01:31 -0700
commit5c1c571ad6582142772351e4c106a5b1182a77bc (patch)
tree8168421553f8b59666723da16afad2cd607e1baa /xlators
parentd773462f7c6d1c3c81fa691fc5911641c5bf4394 (diff)
features/marker-quota: check for refcount being zero holding lock in quota_local_unref.
Signed-off-by: Raghavendra G <raghavendra@gluster.com> Signed-off-by: Anand Avati <avati@gluster.com> BUG: 2697 (Quota: add-brick creates the size go awkward, though it was perfect earlier) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2697
Diffstat (limited to 'xlators')
-rw-r--r--xlators/features/marker/src/marker-quota-helper.c5
-rw-r--r--xlators/features/marker/src/marker-quota-helper.h12
-rw-r--r--xlators/features/marker/src/marker-quota.c9
-rw-r--r--xlators/features/marker/src/marker-quota.h8
4 files changed, 13 insertions, 21 deletions
diff --git a/xlators/features/marker/src/marker-quota-helper.c b/xlators/features/marker/src/marker-quota-helper.c
index c56f8eac7d5..a559da808f8 100644
--- a/xlators/features/marker/src/marker-quota-helper.c
+++ b/xlators/features/marker/src/marker-quota-helper.c
@@ -356,12 +356,13 @@ quota_local_ref (quota_local_t *local)
int32_t
quota_local_unref (xlator_t *this, quota_local_t *local)
{
+ int32_t ref = 0;
if (local == NULL)
goto out;
- QUOTA_SAFE_DECREMENT (&local->lock, local->ref);
+ QUOTA_SAFE_DECREMENT (&local->lock, local->ref, ref);
- if (local->ref > 0)
+ if (ref > 0)
goto out;
if (local->fd != NULL)
diff --git a/xlators/features/marker/src/marker-quota-helper.h b/xlators/features/marker/src/marker-quota-helper.h
index c72cd94e814..1c925ec7c14 100644
--- a/xlators/features/marker/src/marker-quota-helper.h
+++ b/xlators/features/marker/src/marker-quota-helper.h
@@ -38,11 +38,13 @@
UNLOCK (lock); \
} while (0)
-#define QUOTA_SAFE_DECREMENT(lock, var) \
- do { \
- LOCK (lock); \
- var --; \
- UNLOCK (lock); \
+#define QUOTA_SAFE_DECREMENT(lock, var, value) \
+ do { \
+ LOCK (lock); \
+ { \
+ value = --var; \
+ } \
+ UNLOCK (lock); \
} while (0)
inode_contribution_t *
diff --git a/xlators/features/marker/src/marker-quota.c b/xlators/features/marker/src/marker-quota.c
index 84d0da9184a..2cf505ce0f2 100644
--- a/xlators/features/marker/src/marker-quota.c
+++ b/xlators/features/marker/src/marker-quota.c
@@ -108,11 +108,12 @@ dirty_inode_updation_done (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno)
{
quota_local_t *local = NULL;
+ int32_t value = 0;
local = frame->local;
if (!local->err)
- QUOTA_SAFE_DECREMENT (&local->lock, local->ref);
+ QUOTA_SAFE_DECREMENT (&local->lock, local->ref, value);
else
frame->local = NULL;
@@ -374,7 +375,7 @@ out:
if (val== 0) {
if (local->err) {
- QUOTA_SAFE_DECREMENT (&local->lock, local->ref);
+ QUOTA_SAFE_DECREMENT (&local->lock, local->ref, val);
quota_local_unref (this, local);
} else
@@ -1869,10 +1870,6 @@ mq_reduce_parent_size_xattr (call_frame_t *frame, void *cookie,
goto err;
}
- if (local->size < 0) {
- local->size = contribution->contribution;
- }
-
QUOTA_ALLOC_OR_GOTO (size, int64_t, ret, err);
*size = hton64 (-local->size);
diff --git a/xlators/features/marker/src/marker-quota.h b/xlators/features/marker/src/marker-quota.h
index 10fffc73071..384a96ccc05 100644
--- a/xlators/features/marker/src/marker-quota.h
+++ b/xlators/features/marker/src/marker-quota.h
@@ -88,14 +88,6 @@
UNLOCK (lock); \
} while (0)
-#define QUOTA_SAFE_DECREMENT(lock, var) \
- do { \
- LOCK (lock); \
- var --; \
- UNLOCK (lock); \
- } while (0)
-
-
struct quota_inode_ctx {
int64_t size;
int8_t dirty;