diff options
Diffstat (limited to 'libmount/src/context_loopdev.c')
| -rw-r--r-- | libmount/src/context_loopdev.c | 39 |
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); |
