diff options
author | vmallika <vmallika@redhat.com> | 2015-01-30 11:40:17 +0530 |
---|---|---|
committer | Niels de Vos <ndevos@redhat.com> | 2015-02-05 07:17:24 -0800 |
commit | 0ee6628471c27e57577dbcf4e4823f0b0b526ae2 (patch) | |
tree | 1c5ba79b14052128dc36fdfe0950114d40aa6b21 | |
parent | 4b3981d2c9b4cafa24398765b3d0c8a4d45d43b1 (diff) |
features/marker: do not call inode_path on the inode not yet linked
This is a backport of http://review.gluster.org/#/c/9320
> * in readdirp callbak marker is calling inode_path on the inodes that
> are not yet linked to the inode table.
>
> Change-Id: I7f5db29c6a7e778272044f60f8e73c60574df3a9
> BUG: 1176393
> Signed-off-by: Raghavendra Bhat <raghavendra@redhat.com>
> Reviewed-on: http://review.gluster.org/9320
> Tested-by: Gluster Build System <jenkins@build.gluster.com>
> Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
> Tested-by: Raghavendra G <rgowdapp@redhat.com>
Change-Id: I9e2c14d0e0dd52d01ff1dd65b0b50f83874eef0e
BUG: 1174250
Signed-off-by: vmallika <vmallika@redhat.com>
Reviewed-on: http://review.gluster.org/9508
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Niels de Vos <ndevos@redhat.com>
-rw-r--r-- | xlators/features/marker/src/marker.c | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/xlators/features/marker/src/marker.c b/xlators/features/marker/src/marker.c index ed0f9e8cb29..8c3789f66c5 100644 --- a/xlators/features/marker/src/marker.c +++ b/xlators/features/marker/src/marker.c @@ -2722,11 +2722,12 @@ marker_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret, int op_errno, gf_dirent_t *entries, dict_t *xdata) { - gf_dirent_t *entry = NULL; - marker_conf_t *priv = NULL; - marker_local_t *local = NULL; - loc_t loc = {0, }; - int ret = -1; + gf_dirent_t *entry = NULL; + marker_conf_t *priv = NULL; + marker_local_t *local = NULL; + loc_t loc = {0, }; + int ret = -1; + char *resolvedpath = NULL; if (op_ret <= 0) goto unwind; @@ -2743,19 +2744,30 @@ marker_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, (strcmp (entry->d_name, "..") == 0)) continue; - ret = marker_inode_loc_fill (entry->inode, - entry->d_name, &loc); - if (ret) { - gf_log (this->name, GF_LOG_WARNING, "Couln't build " - "loc for %s/%s", - uuid_utoa (local->loc.inode->gfid), - entry->d_name); + loc.parent = inode_ref (local->loc.inode); + loc.inode = inode_ref (entry->inode); + ret = inode_path (loc.parent, entry->d_name, &resolvedpath); + if (ret < 0) { + gf_log (this->name, GF_LOG_ERROR, "failed to get the " + "path for the entry %s", entry->d_name); + loc_wipe (&loc); + continue; + } + + loc.path = gf_strdup (resolvedpath); + if (!loc.path) { + gf_log (this->name, GF_LOG_ERROR, "strdup of path " + "failed for the entry %s (path: %s)", + entry->d_name, resolvedpath); + loc_wipe (&loc); continue; } mq_xattr_state (this, &loc, entry->dict, entry->d_stat); loc_wipe (&loc); + GF_FREE (resolvedpath); + resolvedpath = NULL; } unwind: |