glusterfsd: Make sure mountpoint is an absolute path

If the mountpoint path given to glusterfs is not an absolute path, convert it to
an absolute path by concatenating it with the curren working directory.
This prevents cases, where in gluster cannot perform clean unmounts when mount
is done with a relative path.

Change-Id: Ie25add4e1dc59171e522c4244c79a6c148844ab3
BUG: 819466
Signed-off-by: Kaushal M <kaushal@redhat.com>
Reviewed-on: http://review.gluster.com/3302
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Amar Tumballi <amarts@redhat.com>
Reviewed-by: Anand Avati <avati@redhat.com>
This commit is contained in:
Kaushal M 2012-05-08 13:57:31 +05:30 committed by Anand Avati
parent 27fb213be6
commit fc481386d2
2 changed files with 25 additions and 3 deletions

View File

@ -206,6 +206,8 @@ create_fuse_mount (glusterfs_ctx_t *ctx)
int ret = 0;
cmd_args_t *cmd_args = NULL;
xlator_t *master = NULL;
char *mount_point = NULL;
char cwd[PATH_MAX] = {0,};
cmd_args = &ctx->cmd_args;
@ -242,8 +244,28 @@ create_fuse_mount (glusterfs_ctx_t *ctx)
if (!master->options)
goto err;
ret = dict_set_static_ptr (master->options, ZR_MOUNTPOINT_OPT,
cmd_args->mount_point);
/* Check if mount-point is absolute path,
* if not convert to absolute path by concating with CWD
*/
if (cmd_args->mount_point[0] != '/') {
if (getcwd (cwd, PATH_MAX) != NULL) {
ret = gf_asprintf (&mount_point, "%s/%s", cwd,
cmd_args->mount_point);
if (ret == -1) {
gf_log ("glusterfsd", GF_LOG_ERROR,
"Could not create absolute mountpoint "
"path");
goto err;
}
} else {
gf_log ("glusterfsd", GF_LOG_ERROR,
"Could not get current working directory");
goto err;
}
} else
mount_point = gf_strdup (cmd_args->mount_point);
ret = dict_set_dynstr (master->options, ZR_MOUNTPOINT_OPT, mount_point);
if (ret < 0) {
gf_log ("glusterfsd", GF_LOG_ERROR,
"failed to set mount-point to options dictionary");

View File

@ -4648,9 +4648,9 @@ fini (xlator_t *this_xl)
gf_log (this_xl->name, GF_LOG_INFO,
"Unmounting '%s'.", mount_point);
dict_del (this_xl->options, ZR_MOUNTPOINT_OPT);
gf_fuse_unmount (mount_point, priv->fd);
close (priv->fuse_dump_fd);
dict_del (this_xl->options, ZR_MOUNTPOINT_OPT);
}
/* Process should terminate once fuse xlator is finished.
* Required for AUTH_FAILED event.