From: Karel Zak Date: Wed, 24 Oct 2012 21:44:11 +0000 (+0200) Subject: libmount: support loopdevs in mnt_table_is_fs_mounted() X-Git-Tag: v2.23-rc1~575 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b2cbe99f3317bcc98fa4ff0f9ad5772aad828457;p=thirdparty%2Futil-linux.git libmount: support loopdevs in mnt_table_is_fs_mounted() Signed-off-by: Karel Zak --- diff --git a/libmount/src/tab.c b/libmount/src/tab.c index 5b286538e2..e5eb1063ea 100644 --- a/libmount/src/tab.c +++ b/libmount/src/tab.c @@ -45,6 +45,7 @@ #include "mountP.h" #include "strutils.h" +#include "loopdev.h" /** * mnt_new_table: @@ -948,8 +949,31 @@ int mnt_table_is_fs_mounted(struct libmnt_table *tb, struct libmnt_fs *fstab_fs) while (mnt_table_next_fs(tb, &itr, &fs) == 0) { - if (!mnt_fs_streq_srcpath(fs, src)) - continue; + if (!mnt_fs_streq_srcpath(fs, src)) { + /* The source does not match. Maybe the source is a loop + * device backing file. + */ + uint64_t offset = 0; + char *val; + size_t len; + int flags; + + if (!mnt_fs_is_kernel(fs) || + !mnt_fs_get_srcpath(fs) || + !startswith(mnt_fs_get_srcpath(fs), "/dev/loop")) + continue; /* does not look like loopdev */ + + if (mnt_fs_get_option(fstab_fs, "offset", &val, &len) == 0 && + mnt_parse_offset(val, len, &offset)) { + DBG(FS, mnt_debug_h(fstab_fs, "failed to parse offset=")); + continue; + } else + flags = LOOPDEV_FL_OFFSET; + + if (loopdev_is_used(mnt_fs_get_srcpath(fs), src, offset, flags)) + break; + } + if (root) { const char *r = mnt_fs_get_root(fs); if (!r || strcmp(r, root) != 0) @@ -975,6 +999,8 @@ int mnt_table_is_fs_mounted(struct libmnt_table *tb, struct libmnt_fs *fstab_fs) rc = 1; /* success */ done: free(root); + + DBG(TAB, mnt_debug_h(tb, "mnt_table_is_fs_mounted: %s [rc=%d]", src, rc)); return rc; }