summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/afr
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/cluster/afr')
-rw-r--r--xlators/cluster/afr/src/afr.c16
-rw-r--r--xlators/cluster/afr/src/afr.h3
2 files changed, 18 insertions, 1 deletions
diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c
index c60e1b33cd7..d4f8b18654a 100644
--- a/xlators/cluster/afr/src/afr.c
+++ b/xlators/cluster/afr/src/afr.c
@@ -441,6 +441,9 @@ afr_lookup_cbk (call_frame_t *frame, void *cookie,
int first_up_child = -1;
uint32_t open_fd_count = 0;
+ uint32_t inodelk_count = 0;
+ uint32_t entrylk_count = 0;
+
int ret = 0;
child_index = (long) cookie;
@@ -484,6 +487,13 @@ afr_lookup_cbk (call_frame_t *frame, void *cookie,
&open_fd_count);
local->open_fd_count += open_fd_count;
+ ret = dict_get_uint32 (xattr, GLUSTERFS_INODELK_COUNT,
+ &inodelk_count);
+ local->inodelk_count += inodelk_count;
+
+ ret = dict_get_uint32 (xattr, GLUSTERFS_ENTRYLK_COUNT,
+ &entrylk_count);
+ local->entrylk_count += entrylk_count;
first_up_child = afr_first_up_child (priv);
@@ -618,7 +628,9 @@ unlock:
if ((local->need_metadata_self_heal
|| local->need_data_self_heal
|| local->need_entry_self_heal)
- && (!local->open_fd_count)) {
+ && (!local->open_fd_count &&
+ !local->inodelk_count &&
+ !local->entrylk_count)) {
if (!local->cont.lookup.inode->st_mode) {
/* fix for RT #602 */
@@ -705,6 +717,8 @@ afr_lookup (call_frame_t *frame, xlator_t *this,
}
ret = dict_set_uint64 (local->xattr_req, GLUSTERFS_OPEN_FD_COUNT, 0);
+ ret = dict_set_uint64 (local->xattr_req, GLUSTERFS_INODELK_COUNT, 0);
+ ret = dict_set_uint64 (local->xattr_req, GLUSTERFS_ENTRYLK_COUNT, 0);
for (i = 0; i < priv->child_count; i++) {
STACK_WIND_COOKIE (frame, afr_lookup_cbk, (void *) (long) i,
diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h
index baad63bdc39..45a1c986348 100644
--- a/xlators/cluster/afr/src/afr.h
+++ b/xlators/cluster/afr/src/afr.h
@@ -192,6 +192,9 @@ typedef struct _afr_local {
dict_t *xattr_req;
int open_fd_count;
+ int32_t inodelk_count;
+ int32_t entrylk_count;
+
/*
This struct contains the arguments for the "continuation"
(scheme-like) of fops