diff options
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-rebalance.c | 7 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix.c | 25 | 
2 files changed, 32 insertions, 0 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-rebalance.c b/xlators/mgmt/glusterd/src/glusterd-rebalance.c index 934fc7030..f3c5b9591 100644 --- a/xlators/mgmt/glusterd/src/glusterd-rebalance.c +++ b/xlators/mgmt/glusterd/src/glusterd-rebalance.c @@ -53,6 +53,7 @@ gf_glusterd_rebalance_move_data (glusterd_volinfo_t *volinfo, const char *dir)          struct stat             new_stbuf          = {0,};          char                    full_path[1024]    = {0,};          char                    tmp_filename[1024] = {0,}; +        char                    value[16]          = {0,};          if (!volinfo->defrag)                  goto out; @@ -82,6 +83,12 @@ gf_glusterd_rebalance_move_data (glusterd_volinfo_t *volinfo, const char *dir)                        ((stbuf.st_mode & 01000) == 01000)))                          continue; +                /* If the file is open, don't run rebalance on it */ +                ret = sys_lgetxattr (full_path, GLUSTERFS_OPEN_FD_COUNT, +                                     &value, 16); +                if ((ret < 0) || !strncmp (value, "1", 1)) +                        continue; +                  /* If its a regular file, and sticky bit is set, we need to                     rebalance that */                  snprintf (tmp_filename, 1024, "%s/.%s.gfs%llu", dir, diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index fbdc2a13d..28857b09f 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -3031,6 +3031,22 @@ posix_getxattr (call_frame_t *frame, xlator_t *this,                  goto out;          } +        if (loc->inode && !strcmp (name, GLUSTERFS_OPEN_FD_COUNT)) { +		if (!list_empty (&loc->inode->fd_list)) { +			ret = dict_set_uint32 (dict, (char *)name, 1); +                        if (ret < 0) +                                gf_log (this->name, GF_LOG_WARNING, +                                        "Failed to set dictionary value for %s", +                                        name); +		} else { +			ret = dict_set_uint32 (dict, (char *)name, 0); +                        if (ret < 0) +                                gf_log (this->name, GF_LOG_WARNING, +                                        "Failed to set dictionary value for %s", +                                        name); +		} +                goto done; +        }  	if (loc->inode && IA_ISREG (loc->inode->ia_type) && name &&  	    (strcmp (name, GF_XATTR_PATHINFO_KEY) == 0)) {                  snprintf (host_buf, 1024, "%s:%s", priv->hostname, @@ -3171,6 +3187,15 @@ posix_fgetxattr (call_frame_t *frame, xlator_t *this,                  goto out;          } +        if (!strcmp (name, GLUSTERFS_OPEN_FD_COUNT)) { +                ret = dict_set_uint32 (dict, (char *)name, 1); +                if (ret < 0) +                        gf_log (this->name, GF_LOG_WARNING, +                                "Failed to set dictionary value for %s", +                                name); +                goto done; +        } +          size = sys_flistxattr (_fd, NULL, 0);          if (size == -1) {                  op_errno = errno;  | 
