summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiffin Tony Thottan <jthottan@redhat.com>2016-07-18 11:12:43 +0530
committerJeff Darcy <jdarcy@redhat.com>2016-07-19 06:16:11 -0700
commitd90307c1b0245e0e6a39044a28819cde520a100c (patch)
tree55aee84e09cdead9026b27fb218ed6ffac6e99ee
parent7bf882ed1757f8b01d18d35ef869ed2cd49f1b2f (diff)
xlator/trash : append '/' at the end in trash_notify_lookup_cbk
In the notify function in trash xlator, a lookup is performed to obtain path of old trash directory. The result usually contains path without '/' at the end. The trash xlator maintains expects '/' at the end for the values such as 'old trash dir' and 'new trash dir'. Otherwise certian checks in the code will fail. Change-Id: I89e02e4b249314fb6536297f959865feee182c83 BUG: 1357397 Signed-off-by: Jiffin Tony Thottan <jthottan@redhat.com> Reviewed-on: http://review.gluster.org/14938 Smoke: Gluster Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Anoop C S <anoopcs@redhat.com> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
-rw-r--r--tests/bugs/unclassified/bug-1357397.t29
-rw-r--r--xlators/features/trash/src/trash.c15
2 files changed, 39 insertions, 5 deletions
diff --git a/tests/bugs/unclassified/bug-1357397.t b/tests/bugs/unclassified/bug-1357397.t
new file mode 100644
index 00000000000..dc76787b505
--- /dev/null
+++ b/tests/bugs/unclassified/bug-1357397.t
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+. $(dirname $0)/../../include.rc
+. $(dirname $0)/../../volume.rc
+
+cleanup
+
+TEST glusterd
+TEST pidof glusterd
+
+TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2}
+
+TEST $CLI volume start $V0
+
+TEST [ -e $B0/${V0}1/.trashcan ]
+
+TEST [ -e $B0/${V0}1/.trashcan/internal_op ]
+
+TEST $CLI volume stop $V0
+
+rm -rf $B0/${V0}1/.trashcan/internal_op
+
+TEST [ ! -e $B0/${V0}1/.trashcan/internal_op ]
+
+TEST $CLI volume start $V0 force
+
+TEST [ -e $B0/${V0}1/.trashcan/internal_op ]
+
+cleanup
diff --git a/xlators/features/trash/src/trash.c b/xlators/features/trash/src/trash.c
index 025d2c2efc1..fd5507ff694 100644
--- a/xlators/features/trash/src/trash.c
+++ b/xlators/features/trash/src/trash.c
@@ -290,7 +290,7 @@ trash_notify_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
{
data_t *data = NULL;
trash_private_t *priv = NULL;
- int ret = 0;
+ int ret = 0;
priv = this->private;
GF_VALIDATE_OR_GOTO ("trash", priv, out);
@@ -306,14 +306,19 @@ trash_notify_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
goto out;
}
} else {
- priv->oldtrash_dir = gf_strdup (data->data);
+ priv->oldtrash_dir = GF_CALLOC (1, PATH_MAX,
+ gf_common_mt_char);
if (!priv->oldtrash_dir) {
gf_log (this->name, GF_LOG_ERROR, "out of memory");
ret = ENOMEM;
goto out;
}
- gf_log (this->name, GF_LOG_DEBUG, "old trash directory"
- " path is %s", data->data);
+ /* appending '/' if it is not present */
+ sprintf (priv->oldtrash_dir, "%s%c", data->data,
+ data->data[strlen(data->data) - 1] != '/' ? '/' : '\0'
+ );
+ gf_log (this->name, GF_LOG_DEBUG, "old trash directory path "
+ "is %s", priv->oldtrash_dir);
}
out:
@@ -378,7 +383,7 @@ trash_internal_op_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
struct iatt *buf, struct iatt *preparent,
struct iatt *postparent, dict_t *xdata)
{
- if (op_ret != 0)
+ if (op_ret != 0 && !(op_errno == EEXIST))
gf_log (this->name, GF_LOG_ERROR, "mkdir failed for "
"internal op directory : %s", strerror (op_errno));
return op_ret;