diff options
Diffstat (limited to 'xlators/cluster')
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heald.c | 46 |
1 files changed, 40 insertions, 6 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heald.c b/xlators/cluster/afr/src/afr-self-heald.c index a341015303c..29f34107481 100644 --- a/xlators/cluster/afr/src/afr-self-heald.c +++ b/xlators/cluster/afr/src/afr-self-heald.c @@ -274,6 +274,8 @@ afr_shd_index_opendir (xlator_t *this, int child) #ifdef GF_LINUX_HOST_OS fd_unref (fd); fd = fd_anonymous (inode); + if (!fd) + goto out; #else /* GF_LINUX_HOST_OS */ gf_log(this->name, GF_LOG_ERROR, "opendir of %s for %s failed: %s", @@ -427,7 +429,7 @@ afr_shd_index_sweep (struct subvol_healer *healer) fd_t *fd = NULL; xlator_t *subvol = NULL; afr_private_t *priv = NULL; - off_t offset = 0; + uint64_t offset = 0; gf_dirent_t entries; gf_dirent_t *entry = NULL; uuid_t gfid; @@ -501,11 +503,12 @@ afr_shd_index_sweep (struct subvol_healer *healer) int afr_shd_full_sweep (struct subvol_healer *healer, inode_t *inode) { + loc_t loc = {0, }; fd_t *fd = NULL; xlator_t *this = NULL; xlator_t *subvol = NULL; afr_private_t *priv = NULL; - off_t offset = 0; + uint64_t offset = 0; gf_dirent_t entries; gf_dirent_t *entry = NULL; int ret = 0; @@ -514,9 +517,38 @@ afr_shd_full_sweep (struct subvol_healer *healer, inode_t *inode) priv = this->private; subvol = priv->children[healer->subvol]; - fd = fd_anonymous (inode); - if (!fd) - return -errno; + uuid_copy (loc.gfid, inode->gfid); + loc.inode = inode_ref(inode); + + fd = fd_create (inode, GF_CLIENT_PID_AFR_SELF_HEALD); + if (!fd) { + gf_log(this->name, GF_LOG_ERROR, + "fd_create of %s failed: %s", + uuid_utoa (loc.gfid), strerror(errno)); + ret = -errno; + goto out; + } + + ret = syncop_opendir (subvol, &loc, fd); + if (ret) { +#ifdef GF_LINUX_HOST_OS /* See comment in afr_shd_index_opendir() */ + fd_unref(fd); + fd = fd_anonymous (inode); + if (!fd) { + gf_log(this->name, GF_LOG_ERROR, + "fd_anonymous of %s failed: %s", + uuid_utoa (loc.gfid), strerror(errno)); + ret = -errno; + goto out; + } +#else /* GF_LINUX_HOST_OS */ + gf_log(this->name, GF_LOG_ERROR, + "opendir of %s failed: %s", + uuid_utoa (loc.gfid), strerror(errno)); + ret = -errno; + goto out; +#endif /* GF_LINUX_HOST_OS */ + } INIT_LIST_HEAD (&entries.list); @@ -558,6 +590,8 @@ afr_shd_full_sweep (struct subvol_healer *healer, inode_t *inode) break; } +out: + loc_wipe (&loc); if (fd) fd_unref (fd); return ret; @@ -947,7 +981,7 @@ afr_shd_gather_index_entries (xlator_t *this, int child, dict_t *output) fd_t *fd = NULL; xlator_t *subvol = NULL; afr_private_t *priv = NULL; - off_t offset = 0; + uint64_t offset = 0; gf_dirent_t entries; gf_dirent_t *entry = NULL; uuid_t gfid; |