From 6cbb306c24400b0a6df5cb71f540f1f0190fcc25 Mon Sep 17 00:00:00 2001 From: vmallika Date: Wed, 29 Jul 2015 16:42:20 +0530 Subject: quota/marker: set lk_owner when taking lock on parent in rename This is a backport of http://review.gluster.org/#/c/11561/ Before doing a rename operation marker takes inode lock on the file parent, here lk_owner is NULL and this can cause accounting problem with multiple rename on the same directory This patch fix the problem by setting lk_owner > Change-Id: Ibb789e39b2833e425d0a5fca85282ff1465206cb > BUG: 1240598 > Signed-off-by: vmallika > Reviewed-on: http://review.gluster.org/11561 > Tested-by: Gluster Build System > Tested-by: NetBSD Build System > Reviewed-by: Raghavendra G Change-Id: I54db6c27791862e84eaa958fc9fdc363a22eb2e8 BUG: 1247972 Signed-off-by: vmallika Reviewed-on: http://review.gluster.org/11795 Tested-by: Gluster Build System Reviewed-by: Raghavendra G Reviewed-by: Raghavendra Bhat --- libglusterfs/src/lkowner.h | 19 +++++++++++++++++++ xlators/features/marker/src/marker.c | 3 +++ 2 files changed, 22 insertions(+) diff --git a/libglusterfs/src/lkowner.h b/libglusterfs/src/lkowner.h index 969d13e5044..cf1e471e820 100644 --- a/libglusterfs/src/lkowner.h +++ b/libglusterfs/src/lkowner.h @@ -80,4 +80,23 @@ is_same_lkowner (gf_lkowner_t *l1, gf_lkowner_t *l2) return ((l1->len == l2->len) && !memcmp(l1->data, l2->data, l1->len)); } +static inline int +is_lk_owner_null (gf_lkowner_t *lkowner) +{ + int is_null = 1; + int i = 0; + + if (lkowner == NULL || lkowner->len == 0) + goto out; + + for (i = 0; i < lkowner->len; i++) { + if (lkowner->data[i] != 0) { + is_null = 0; + break; + } + } +out: + return is_null; +} + #endif /* _LK_OWNER_H */ diff --git a/xlators/features/marker/src/marker.c b/xlators/features/marker/src/marker.c index 1814cdc8f8e..8e026ec79a9 100644 --- a/xlators/features/marker/src/marker.c +++ b/xlators/features/marker/src/marker.c @@ -1575,6 +1575,9 @@ marker_rename (call_frame_t *frame, xlator_t *this, loc_t *oldloc, lock.l_type = F_WRLCK; lock.l_whence = SEEK_SET; + if (is_lk_owner_null (&frame->root->lk_owner)) + set_lk_owner_from_ptr (&frame->root->lk_owner, frame->root); + STACK_WIND (frame, marker_rename_inodelk_cbk, FIRST_CHILD(this), -- cgit