From 04d12788678fe1c83c2dbd518774ab314d7db995 Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Wed, 29 Nov 2006 16:01:23 +0000 Subject: [PATCH] Print a more helpful message in case the kernel doesn't support the 'fuseblk' filesystem type --- ChangeLog | 6 ++++++ kernel/dir.c | 3 +++ util/fusermount.c | 23 ++++++++++++++++++++++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index dc1737d..ef3acf5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2006-11-29 Miklos Szeredi + + * fusermount: Print a more helpful message in case the kernel + doesn't support the 'fuseblk' filesystem type. This has been + biting ntfs-3g users. Reported by Yura Pakhuchiy + 2006-11-19 Miklos Szeredi * Fix bug in certain error paths of lookup routines. The request diff --git a/kernel/dir.c b/kernel/dir.c index bc69a06..0f01688 100644 --- a/kernel/dir.c +++ b/kernel/dir.c @@ -1086,6 +1086,9 @@ static int fuse_setattr(struct dentry *entry, struct iattr *attr) memset(&inarg, 0, sizeof(inarg)); iattr_to_fattr(attr, &inarg); + /* Defend against future expansion of ATTR_FILE use */ + if (S_ISDIR(inode->i_mode)) + inarg.valid &= ~FATTR_FH; req->in.h.opcode = FUSE_SETATTR; req->in.h.nodeid = get_node_id(inode); req->in.numargs = 1; diff --git a/util/fusermount.c b/util/fusermount.c index 014d4ea..9326037 100644 --- a/util/fusermount.c +++ b/util/fusermount.c @@ -575,6 +575,23 @@ static int check_mountpoint_empty(const char *mnt, mode_t rootmode, return 0; } +static int has_fuseblk(void) +{ + char buf[256]; + FILE *f = fopen("/proc/filesystems", "r"); + if (!f) + return 1; + + while (fgets(buf, sizeof(buf), f)) + if (strcmp(buf, "fuseblk\n") == 0) { + fclose(f); + return 1; + } + + fclose(f); + return 0; +} + static int do_mount(const char *mnt, const char **type, mode_t rootmode, int fd, const char *opts, const char *dev, char **fsnamep, char **mnt_optsp, off_t rootsize) @@ -686,7 +703,11 @@ static int do_mount(const char *mnt, const char **type, mode_t rootmode, res = mount(fsname, mnt, *type, flags, optbuf); } if (res == -1) { - fprintf(stderr, "%s: mount failed: %s\n", progname, strerror(errno)); + int errno_save = errno; + if (blkdev && errno == ENODEV && !has_fuseblk()) + fprintf(stderr, "%s: 'fuseblk' support missing; try the kernel module from fuse-2.6.0 or later\n", progname); + else + fprintf(stderr, "%s: mount failed: %s\n", progname, strerror(errno_save)); goto err; } else { *fsnamep = fsname; -- 2.30.2