From 66113e3473555c31926045218dc8b79c61751d5d Mon Sep 17 00:00:00 2001 From: Raghavendra G Date: Sat, 18 May 2013 11:52:09 +0530 Subject: features/marker-quota: more stringent error handling in rename. If an error occurs and op_errno is not set to non-zero value, we can end up in loosing a frame resulting in a hung syscall. This patch adds code setting op_errno appropriately in storage/posix and makes marker to set err to a default non-zero value in case of op_errno being zero. Change-Id: Idc2c3e843b932709a69b32ba67deb284547168f2 BUG: 833586 Signed-off-by: Raghavendra G Reviewed-on: http://review.gluster.org/5032 Tested-by: Gluster Build System Reviewed-by: Anand Avati --- xlators/storage/posix/src/posix.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'xlators/storage') diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index ba928de2a..fde322099 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -3383,7 +3383,7 @@ posix_getxattr (call_frame_t *frame, xlator_t *this, dict = dict_new (); if (!dict) { - op_errno = ENOMEM; + op_errno = ENOMEM; goto out; } @@ -3550,6 +3550,7 @@ posix_getxattr (call_frame_t *frame, xlator_t *this, value = GF_CALLOC (size + 1, sizeof(char), gf_posix_mt_char); if (!value) { op_ret = -1; + op_errno = ENOMEM; goto out; } size = sys_lgetxattr (real_path, key, value, size); @@ -3565,6 +3566,7 @@ posix_getxattr (call_frame_t *frame, xlator_t *this, value [size] = '\0'; op_ret = dict_set_dynptr (dict, key, value, size); if (op_ret < 0) { + op_errno = -op_ret; gf_log (this->name, GF_LOG_ERROR, "dict set operation " "on %s for the key %s failed.", real_path, key); GF_FREE (value); @@ -3642,6 +3644,7 @@ posix_getxattr (call_frame_t *frame, xlator_t *this, value [size] = '\0'; op_ret = dict_set_dynptr (dict, key, value, size); if (op_ret < 0) { + op_errno = -op_ret; gf_log (this->name, GF_LOG_ERROR, "dict set operation " "on %s for the key %s failed.", real_path, key); GF_FREE (value); -- cgit