From 2606b87470e396e3e79269764e01f572da051e41 Mon Sep 17 00:00:00 2001 From: Raghavendra G Date: Sat, 19 May 2012 14:49:21 +0530 Subject: performance/quick-read: fix race-conditions in qr_unlink. The list of fds on which open needs to be done as part of unlink, was being modified at different places using different locks. This resulted in a race-condition where open was marked as in-transit, but fdctx was removed from the list of fds on which open was being sent even before open was done. Because of this, open_in_transit would be set forever (as an open was never actually sent, there would be no open_cbk called and hence we could not reset the variable), blocking all the future fd based fops on this fd. Change-Id: Ie84a55bee578869a9a060a094ba28480e7643ae8 BUG: 819490 Signed-off-by: Raghavendra G Reviewed-on: http://review.gluster.com/3371 Tested-by: Gluster Build System Reviewed-by: Vijay Bellur --- xlators/performance/quick-read/src/quick-read.h | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'xlators/performance/quick-read/src/quick-read.h') diff --git a/xlators/performance/quick-read/src/quick-read.h b/xlators/performance/quick-read/src/quick-read.h index 28f43a8bcb6..10a04e79c14 100644 --- a/xlators/performance/quick-read/src/quick-read.h +++ b/xlators/performance/quick-read/src/quick-read.h @@ -44,7 +44,6 @@ struct qr_fd_ctx { struct list_head waiting_ops; gf_lock_t lock; struct list_head inode_list; - struct list_head tmp_list; fd_t *fd; dict_t *xdata; }; @@ -60,7 +59,7 @@ struct qr_local { int32_t op_errno; uint32_t open_count; call_stub_t *stub; - struct list_head fd_list; + struct list_head list; gf_lock_t lock; }; typedef struct qr_local qr_local_t; @@ -106,6 +105,13 @@ struct qr_private { }; typedef struct qr_private qr_private_t; +struct qr_unlink_ctx { + struct list_head list; + qr_fd_ctx_t *fdctx; + char need_open; +}; +typedef struct qr_unlink_ctx qr_unlink_ctx_t; + void qr_local_free (qr_local_t *local); #define QR_STACK_UNWIND(op, frame, params ...) do { \ -- cgit