diff options
author | Miklos Szeredi <mszeredi@suse.cz> | 2011-03-11 13:46:13 +0100 |
---|---|---|
committer | Miklos Szeredi <mszeredi@suse.cz> | 2011-03-11 13:46:13 +0100 |
commit | 2250aae7bca132006081b51b46c240759240a680 (patch) | |
tree | 16bbfd4ec074b1ae1b1a0a94c754414593e07903 /util | |
parent | 337a2e4b24e1cfbe60551341d2c303113847ff24 (diff) | |
download | android_external_fuse-2250aae7bca132006081b51b46c240759240a680.tar.gz android_external_fuse-2250aae7bca132006081b51b46c240759240a680.tar.bz2 android_external_fuse-2250aae7bca132006081b51b46c240759240a680.zip |
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.
Diffstat (limited to 'util')
-rw-r--r-- | util/fusermount.c | 36 |
1 files changed, 6 insertions, 30 deletions
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); |