summaryrefslogtreecommitdiffstats
path: root/libmount/src/utils.c
diff options
context:
space:
mode:
authorKarel Zak2012-11-26 11:21:40 +0100
committerKarel Zak2012-11-26 11:21:40 +0100
commitec8121b103bafec90bc1d2fef524f94d408caab3 (patch)
treea0993bfb03c8ebdd7111fdf46c269c0b5ae10e71 /libmount/src/utils.c
parentlscpu: remove unnecessary variable (diff)
downloadkernel-qcow2-util-linux-ec8121b103bafec90bc1d2fef524f94d408caab3.tar.gz
kernel-qcow2-util-linux-ec8121b103bafec90bc1d2fef524f94d408caab3.tar.xz
kernel-qcow2-util-linux-ec8121b103bafec90bc1d2fef524f94d408caab3.zip
libmount: correctly interpret '*' from /etc/filesystems
- single line with '*' in /etc/filesystems means that libmount has to read /proc/filesystems, otherwise /proc/filesystems has to be ignored - mount(2) ENODEV is no reason to break the do_mount_by_pattern() loop when trying to mount by /{etc,proc}/filesystems Reported-by: NeilBrown <neilb@suse.de> Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libmount/src/utils.c')
-rw-r--r--libmount/src/utils.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/libmount/src/utils.c b/libmount/src/utils.c
index 624633dd8..28eca7c82 100644
--- a/libmount/src/utils.c
+++ b/libmount/src/utils.c
@@ -453,7 +453,9 @@ static int get_filesystems(const char *filename, char ***filesystems, const char
f = fopen(filename, "r");
if (!f)
- return 0;
+ return 1;
+
+ DBG(UTILS, mnt_debug("reading filesystems list from: %s", filename));
while (fgets(line, sizeof(line), f)) {
char name[sizeof(line)];
@@ -462,6 +464,10 @@ static int get_filesystems(const char *filename, char ***filesystems, const char
continue;
if (sscanf(line, " %128[^\n ]\n", name) != 1)
continue;
+ if (strcmp(name, "*") == 0) {
+ rc = 1;
+ break; /* end of the /etc/filesystems */
+ }
if (pattern && !mnt_match_fstype(name, pattern))
continue;
rc = add_filesystem(filesystems, name);
@@ -474,8 +480,15 @@ static int get_filesystems(const char *filename, char ***filesystems, const char
}
/*
- * Returns zero also if not found any matching filesystem. Always check
- * @filesystems pointer!
+ * Always check @filesystems pointer!
+ *
+ * man mount:
+ *
+ * ...mount will try to read the file /etc/filesystems, or, if that does not
+ * exist, /proc/filesystems. All of the filesystem types listed there will
+ * be tried, except for those that are labeled "nodev" (e.g., devpts,
+ * proc and nfs). If /etc/filesystems ends in a line with a single * only,
+ * mount will read /proc/filesystems after‐ wards.
*/
int mnt_get_filesystems(char ***filesystems, const char *pattern)
{
@@ -483,12 +496,18 @@ int mnt_get_filesystems(char ***filesystems, const char *pattern)
if (!filesystems)
return -EINVAL;
+
*filesystems = NULL;
rc = get_filesystems(_PATH_FILESYSTEMS, filesystems, pattern);
- if (rc)
+ if (rc != 1)
return rc;
- return get_filesystems(_PATH_PROC_FILESYSTEMS, filesystems, pattern);
+
+ rc = get_filesystems(_PATH_PROC_FILESYSTEMS, filesystems, pattern);
+ if (rc == 1 && *filesystems)
+ rc = 0; /* not found /proc/filesystems */
+
+ return rc;
}
static size_t get_pw_record_size(void)