From 2250aae7bca132006081b51b46c240759240a680 Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Fri, 11 Mar 2011 13:46:13 +0100 Subject: Revert "Fix cleanup in case of failed mount" This reverts commit bf5ffb5fd8558bd799791834def431c0cee5a11f. Cleanup of mount doesn't work the way it was envisioned, because the kernel doesn't follow mounts on the umount() call, hence it will find a non-mounted directory. --- util/fusermount.c | 36 ++++++------------------------------ 1 file changed, 6 insertions(+), 30 deletions(-) (limited to 'util') diff --git a/util/fusermount.c b/util/fusermount.c index 94a5dbc..48f23fa 100644 --- a/util/fusermount.c +++ b/util/fusermount.c @@ -896,8 +896,7 @@ static int check_version(const char *dev) return 0; } -static int check_perm(const char **mntp, struct stat *stbuf, - int *mountpoint_fd, int *isdir) +static int check_perm(const char **mntp, struct stat *stbuf, int *mountpoint_fd) { int res; const char *mnt = *mntp; @@ -915,17 +914,10 @@ static int check_perm(const char **mntp, struct stat *stbuf, return 0; if (S_ISDIR(stbuf->st_mode)) { - *isdir = 1; - *mountpoint_fd = open(mnt, O_RDONLY); - if (*mountpoint_fd == -1) { - fprintf(stderr, "%s: failed to open %s: %s\n", - progname, mnt, strerror(errno)); - return -1; - } - res = fchdir(*mountpoint_fd); + res = chdir(mnt); if (res == -1) { fprintf(stderr, - "%s: failed to fchdir to mountpoint: %s\n", + "%s: failed to chdir to mountpoint: %s\n", progname, strerror(errno)); return -1; } @@ -1050,7 +1042,6 @@ static int mount_fuse(const char *mnt, const char *opts) char *mnt_opts = NULL; const char *real_mnt = mnt; int mountpoint_fd = -1; - int isdir = 0; fd = open_fuse_device(&dev); if (fd == -1) @@ -1070,7 +1061,7 @@ static int mount_fuse(const char *mnt, const char *opts) res = check_version(dev); if (res != -1) { - res = check_perm(&real_mnt, &stbuf, &mountpoint_fd, &isdir); + res = check_perm(&real_mnt, &stbuf, &mountpoint_fd); restore_privs(); if (res != -1) res = do_mount(real_mnt, &type, stbuf.st_mode & S_IFMT, @@ -1081,37 +1072,22 @@ static int mount_fuse(const char *mnt, const char *opts) chdir("/"); if (mountpoint_fd != -1) - fcntl(mountpoint_fd, F_SETFD, FD_CLOEXEC); + close(mountpoint_fd); if (res == -1) { close(fd); - if (mountpoint_fd != -1) - close(mountpoint_fd); return -1; } if (geteuid() == 0) { res = add_mount(source, mnt, type, mnt_opts); if (res == -1) { - if (isdir && mountpoint_fd != -1) { - res = fchdir(mountpoint_fd); - if (res == -1) { - close(mountpoint_fd); - close(fd); - return -1; - } - } - umount2(real_mnt, UMOUNT_DETACH); /* lazy umount */ - if (mountpoint_fd != -1) - close(mountpoint_fd); + umount2(mnt, UMOUNT_DETACH); /* lazy umount */ close(fd); return -1; } } - if (mountpoint_fd != -1) - close(mountpoint_fd); - free(source); free(type); free(mnt_opts); -- cgit v1.2.3