summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarel Zak <kzak@redhat.com>2015-03-10 13:35:56 +0100
committerKarel Zak <kzak@redhat.com>2015-03-12 10:21:58 +0100
commit93f9a8838963a1e6dad496c658954c41d3c854fd (patch)
tree2c9af37629820e17fccc9f7d0f1ec27466013121
parent48367e2d9921d696dda937038cf2da6052590794 (diff)
downloadutil-linux-93f9a8838963a1e6dad496c658954c41d3c854fd.tar.gz
libmount: cleanup fs root detection code
Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r--libmount/src/mountP.h5
-rw-r--r--libmount/src/tab.c32
-rw-r--r--libmount/src/utils.c34
-rw-r--r--tests/expected/libmount/utils-fs-root1
-rw-r--r--tests/expected/libmount/utils-fs-root-subdir1
-rw-r--r--tests/expected/libmount/utils-fs-root-subdir21
-rwxr-xr-xtests/ts/libmount/utils12
7 files changed, 26 insertions, 60 deletions
diff --git a/libmount/src/mountP.h b/libmount/src/mountP.h
index cdd57cc5b..5eefa7110 100644
--- a/libmount/src/mountP.h
+++ b/libmount/src/mountP.h
@@ -99,7 +99,6 @@ extern int mnt_get_uid(const char *username, uid_t *uid);
extern int mnt_get_gid(const char *groupname, gid_t *gid);
extern int mnt_in_group(gid_t gid);
-extern char *mnt_get_fs_root(const char *path, const char *mountpoint);
extern int mnt_open_uniq_filename(const char *filename, char **name);
extern int mnt_has_regular_utab(const char **utab, int *writable);
@@ -116,10 +115,6 @@ extern int mnt_table_set_parser_fltrcb( struct libmnt_table *tb,
int (*cb)(struct libmnt_fs *, void *),
void *data);
-extern struct libmnt_fs *mnt_table_get_fs_root(struct libmnt_table *tb,
- struct libmnt_fs *fs,
- unsigned long mountflags,
- char **fsroot);
extern int __mnt_table_parse_mtab(struct libmnt_table *tb,
const char *filename,
struct libmnt_table *u_tb);
diff --git a/libmount/src/tab.c b/libmount/src/tab.c
index cd20ad0b2..09896ccb6 100644
--- a/libmount/src/tab.c
+++ b/libmount/src/tab.c
@@ -47,6 +47,7 @@
#include "strutils.h"
#include "loopdev.h"
#include "fileutils.h"
+#include "canonicalize.h"
int is_mountinfo(struct libmnt_table *tb)
{
@@ -1166,6 +1167,20 @@ struct libmnt_fs *mnt_table_find_devno(struct libmnt_table *tb,
return NULL;
}
+static char *remove_mountpoint_from_path(const char *path, const char *mnt)
+{
+ char *res;
+ const char *p;
+ size_t sz;
+
+ sz = strlen(mnt);
+ p = sz > 1 ? path + sz : path;
+
+ res = *p ? strdup(p) : strdup("/");
+ DBG(UTILS, ul_debug("%s fs-root is %s", path, res));
+ return res;
+}
+
/*
* tb: /proc/self/mountinfo
* fs: filesystem
@@ -1185,7 +1200,8 @@ struct libmnt_fs *mnt_table_get_fs_root(struct libmnt_table *tb,
unsigned long mountflags,
char **fsroot)
{
- char *root = NULL, *mnt = NULL;
+ char *root = NULL;
+ const char *mnt = NULL;
const char *fstype;
struct libmnt_fs *src_fs = NULL;
@@ -1203,10 +1219,15 @@ struct libmnt_fs *mnt_table_get_fs_root(struct libmnt_table *tb,
DBG(TAB, ul_debug("fs-root for bind"));
src = xsrc = mnt_resolve_spec(mnt_fs_get_source(fs), tb->cache);
- if (src)
- mnt = mnt_get_mountpoint(src);
+ if (src) {
+ struct libmnt_fs *fs = mnt_table_find_mountpoint(tb,
+ src, MNT_ITER_BACKWARD);
+ if (fs)
+ mnt = mnt_fs_get_target(fs);
+ }
+
if (mnt)
- root = mnt_get_fs_root(src, mnt);
+ root = remove_mountpoint_from_path(src, mnt);
if (xsrc && !tb->cache) {
free(xsrc);
@@ -1273,11 +1294,9 @@ dflt:
DBG(TAB, ul_debug("FS root result: %s", root));
- free(mnt);
return src_fs;
err:
free(root);
- free(mnt);
return NULL;
}
@@ -1710,6 +1729,7 @@ done:
return rc;
}
+
int main(int argc, char *argv[])
{
struct libmnt_test tss[] = {
diff --git a/libmount/src/utils.c b/libmount/src/utils.c
index 6f4d1a19f..bc43a85cf 100644
--- a/libmount/src/utils.c
+++ b/libmount/src/utils.c
@@ -1010,28 +1010,6 @@ err:
return NULL;
}
-char *mnt_get_fs_root(const char *path, const char *mnt)
-{
- char *m = (char *) mnt, *res;
- const char *p;
- size_t sz;
-
- if (!m)
- m = mnt_get_mountpoint(path);
- if (!m)
- return NULL;
-
- sz = strlen(m);
- p = sz > 1 ? path + sz : path;
-
- if (m != mnt)
- free(m);
-
- res = *p ? strdup(p) : strdup("/");
- DBG(UTILS, ul_debug("%s fs-root is %s", path, res));
- return res;
-}
-
/*
* Search for @name kernel command parametr.
*
@@ -1176,17 +1154,6 @@ int test_mountpoint(struct libmnt_test *ts, int argc, char *argv[])
return 0;
}
-int test_fsroot(struct libmnt_test *ts, int argc, char *argv[])
-{
- char *path = canonicalize_path(argv[1]),
- *mnt = path ? mnt_get_fs_root(path, NULL) : NULL;
-
- printf("%s: %s\n", argv[1], mnt ? : "unknown");
- free(mnt);
- free(path);
- return 0;
-}
-
int test_filesystems(struct libmnt_test *ts, int argc, char *argv[])
{
char **filesystems = NULL;
@@ -1277,7 +1244,6 @@ int main(int argc, char *argv[])
{ "--ends-with", test_endswith, "<string> <prefix>" },
{ "--append-string", test_appendstr, "<string> <appendix>" },
{ "--mountpoint", test_mountpoint, "<path>" },
- { "--fs-root", test_fsroot, "<path>" },
{ "--cd-parent", test_chdir, "<path>" },
{ "--kernel-cmdline",test_kernel_cmdline, "<option> | <option>=" },
{ "--mkdir", test_mkdir, "<path>" },
diff --git a/tests/expected/libmount/utils-fs-root b/tests/expected/libmount/utils-fs-root
deleted file mode 100644
index 7746b2850..000000000
--- a/tests/expected/libmount/utils-fs-root
+++ /dev/null
@@ -1 +0,0 @@
-/proc: /
diff --git a/tests/expected/libmount/utils-fs-root-subdir b/tests/expected/libmount/utils-fs-root-subdir
deleted file mode 100644
index 09cdb8d46..000000000
--- a/tests/expected/libmount/utils-fs-root-subdir
+++ /dev/null
@@ -1 +0,0 @@
-/proc/sys/kernel: /sys/kernel
diff --git a/tests/expected/libmount/utils-fs-root-subdir2 b/tests/expected/libmount/utils-fs-root-subdir2
deleted file mode 100644
index 2e8b89a2e..000000000
--- a/tests/expected/libmount/utils-fs-root-subdir2
+++ /dev/null
@@ -1 +0,0 @@
-/etc: /etc
diff --git a/tests/ts/libmount/utils b/tests/ts/libmount/utils
index 211f015a9..8e087e34f 100755
--- a/tests/ts/libmount/utils
+++ b/tests/ts/libmount/utils
@@ -64,18 +64,6 @@ ts_init_subtest "mountpoint-root"
ts_valgrind $TESTPROG --mountpoint / &> $TS_OUTPUT
ts_finalize_subtest
-ts_init_subtest "fs-root"
-ts_valgrind $TESTPROG --fs-root /proc &> $TS_OUTPUT
-ts_finalize_subtest
-
-ts_init_subtest "fs-root-subdir"
-ts_valgrind $TESTPROG --fs-root /proc/sys/kernel &> $TS_OUTPUT
-ts_finalize_subtest
-
-ts_init_subtest "fs-root-subdir2"
-ts_valgrind $TESTPROG --fs-root /etc &> $TS_OUTPUT
-ts_finalize_subtest
-
ts_init_subtest "kernel-cmdline"
export LIBMOUNT_KERNEL_CMDLINE="$TS_SELF/files/kernel_cmdline"
ts_valgrind $TESTPROG --kernel-cmdline selinux= &>> $TS_OUTPUT