summaryrefslogtreecommitdiff
path: root/libmount/src/context_loopdev.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmount/src/context_loopdev.c')
-rw-r--r--libmount/src/context_loopdev.c39
1 files changed, 19 insertions, 20 deletions
diff --git a/libmount/src/context_loopdev.c b/libmount/src/context_loopdev.c
index 576b7f55a..44a7216b8 100644
--- a/libmount/src/context_loopdev.c
+++ b/libmount/src/context_loopdev.c
@@ -47,10 +47,10 @@ int mnt_context_is_loopdev(struct libmnt_context *cxt)
/* Automatically create a loop device from a regular file if a
* filesystem is not specified or the filesystem is known for libblkid
* (these filesystems work with block devices only). The file size
- * should be at least 1KiB otherwise we will create empty loopdev where
- * is no mountable filesystem...
+ * should be at least 1KiB, otherwise we will create an empty loopdev with
+ * no mountable filesystem...
*
- * Note that there is not a restriction (on kernel side) that prevents regular
+ * Note that there is no restriction (on kernel side) that would prevent a regular
* file as a mount(2) source argument. A filesystem that is able to mount
* regular files could be implemented.
*/
@@ -73,7 +73,7 @@ int mnt_context_is_loopdev(struct libmnt_context *cxt)
}
-/* Check, if there already exists a mounted loop device on the mountpoint node
+/* Check if there already exists a mounted loop device on the mountpoint node
* with the same parameters.
*/
static int __attribute__((nonnull))
@@ -86,6 +86,8 @@ is_mounted_same_loopfile(struct libmnt_context *cxt,
struct libmnt_iter itr;
struct libmnt_fs *fs;
struct libmnt_cache *cache;
+ const char *bf;
+ int rc = 0;
assert(cxt);
assert(cxt->fs);
@@ -100,39 +102,36 @@ is_mounted_same_loopfile(struct libmnt_context *cxt,
cache = mnt_context_get_cache(cxt);
mnt_reset_iter(&itr, MNT_ITER_BACKWARD);
- /* Search for mountpoint node in mtab, procceed if any of these has the
+ bf = cache ? mnt_resolve_path(backing_file, cache) : backing_file;
+
+ /* Search for a mountpoint node in mtab, proceed if any of these have the
* loop option set or the device is a loop device
*/
- while (mnt_table_next_fs(tb, &itr, &fs) == 0) {
+ while (rc == 0 && mnt_table_next_fs(tb, &itr, &fs) == 0) {
const char *src = mnt_fs_get_source(fs);
const char *opts = mnt_fs_get_user_options(fs);
char *val;
size_t len;
- int res = 0;
if (!src || !mnt_fs_match_target(fs, target, cache))
continue;
+ rc = 0;
+
if (strncmp(src, "/dev/loop", 9) == 0) {
- res = loopdev_is_used((char *) src, backing_file,
- offset, LOOPDEV_FL_OFFSET);
+ rc = loopdev_is_used((char *) src, bf, offset, LOOPDEV_FL_OFFSET);
} else if (opts && (cxt->user_mountflags & MNT_MS_LOOP) &&
mnt_optstr_get_option(opts, "loop", &val, &len) == 0 && val) {
val = strndup(val, len);
- res = loopdev_is_used((char *) val, backing_file,
- offset, LOOPDEV_FL_OFFSET);
+ rc = loopdev_is_used((char *) val, bf, offset, LOOPDEV_FL_OFFSET);
free(val);
}
-
- if (res) {
- DBG(CXT, mnt_debug_h(cxt, "%s already mounted", backing_file));
- return 1;
- }
}
-
- return 0;
+ if (rc)
+ DBG(CXT, mnt_debug_h(cxt, "%s already mounted", backing_file));
+ return rc;
}
int mnt_context_setup_loopdev(struct libmnt_context *cxt)
@@ -282,7 +281,7 @@ int mnt_context_setup_loopdev(struct libmnt_context *cxt)
if ((cxt->user_mountflags & MNT_MS_LOOP) &&
loopcxt_is_autoclear(&lc)) {
/*
- * autoclear flag accepted by kernel, don't store
+ * autoclear flag accepted by the kernel, don't store
* the "loop=" option to mtab.
*/
cxt->user_mountflags &= ~MNT_MS_LOOP;
@@ -298,7 +297,7 @@ int mnt_context_setup_loopdev(struct libmnt_context *cxt)
mnt_context_set_mflags(cxt, cxt->mountflags | MS_RDONLY);
/* we have to keep the device open until mount(1),
- * otherwise it will auto-cleared by kernel
+ * otherwise it will be auto-cleared by kernel
*/
cxt->loopdev_fd = loopcxt_get_fd(&lc);
loopcxt_set_fd(&lc, -1, 0);