diff options
| author | Raghavendra G <raghavendra@gluster.com> | 2011-06-14 23:55:30 +0000 | 
|---|---|---|
| committer | Anand Avati <avati@gluster.com> | 2011-06-16 22:01:31 -0700 | 
| commit | 5c1c571ad6582142772351e4c106a5b1182a77bc (patch) | |
| tree | 8168421553f8b59666723da16afad2cd607e1baa | |
| parent | d773462f7c6d1c3c81fa691fc5911641c5bf4394 (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
| -rw-r--r-- | xlators/features/marker/src/marker-quota-helper.c | 5 | ||||
| -rw-r--r-- | xlators/features/marker/src/marker-quota-helper.h | 12 | ||||
| -rw-r--r-- | xlators/features/marker/src/marker-quota.c | 9 | ||||
| -rw-r--r-- | xlators/features/marker/src/marker-quota.h | 8 | 
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 c56f8eac7..a559da808 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 c72cd94e8..1c925ec7c 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 84d0da918..2cf505ce0 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 10fffc730..384a96ccc 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;  | 
