All of lore.kernel.org
 help / color / mirror / Atom feed
From: Florian Margaine <florian.margaine@commerceguys.com>
To: Karel Zak <kzak@redhat.com>
Cc: linux-btrfs@vger.kernel.org
Subject: Re: [PATCH] btrfs-progs: Fix partitioned loop devices resolve.
Date: Thu, 12 Nov 2015 10:10:51 +0100	[thread overview]
Message-ID: <5644579B.3000102@commerceguys.com> (raw)
In-Reply-To: <20151110115018.GY19508@ws.net.home>


[-- Attachment #1.1: Type: text/plain, Size: 568 bytes --]

New patch is attached.

On 11/10/2015 12:50 PM, Karel Zak wrote:
> 
> Yep, first try /sys/... and when unsuccessful then try ioctl.
> 
> losetup example:
> https://github.com/karelzak/util-linux/blob/master/lib/loopdev.c#L686
> 
> (it's probably too complex, but the basic idea is obvious)
> 
> Maybe we need libloop.so to share all these things between various
> project :-)

That would be lovely indeed.

> 
>     Karel
> 

Regards,

-- 
Florian Margaine

Product Engineer @ Platform.sh
https://platform.sh

https://keybase.io/fmargaine

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: fix-partitioned-loop-devices-resolve.patch --]
[-- Type: text/x-patch; name="fix-partitioned-loop-devices-resolve.patch", Size: 2001 bytes --]

When using partitions on a loop device, the device's name can be
/dev/loop0p1 or similar, and no relevant entry exists in the /sys
filesystem, so the current resolve_loop_device function fails.

This patch adds a fallback to using loopdev API which will get the
correct backing file even for partitioned loop devices, at the expense
of using more memory, hence using it as a fallback only.
---
 utils.c | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/utils.c b/utils.c
index d546bea..5e4813d 100644
--- a/utils.c
+++ b/utils.c
@@ -1170,2 +1170,2 @@ static int is_loop_device (const char* device) {
 		MAJOR(statbuf.st_rdev) == LOOP_MAJOR);
 }

+/*
+ * Takes a loop device path (e.g. /dev/loop0) and returns
+ * the associated file (e.g. /images/my_btrfs.img) using
+ * loopdev API
+ */
+static int resolve_loop_device_with_loopdev(const char* loop_dev, char* loop_file)
+{
+	int fd;
+	struct loop_info64 lo64;
+
+	if (!(fd = open(loop_dev, O_RDONLY | O_NONBLOCK)))
+		return -errno;
+	if (ioctl(fd, LOOP_GET_STATUS64, &lo64) != 0)
+		return -errno;
+
+	memcpy(loop_file, lo64.lo_file_name, strlen(lo64.lo_file_name) + 1);
+	if (close(fd) != 0)
+		return -errno;
+
+	return 0;
+}

 /* Takes a loop device path (e.g. /dev/loop0) and returns
  * the associated file (e.g. /images/my_btrfs.img) */
@@ -1185,5 +1206,10 @@ static int resolve_loop_device(const char* loop_dev, char* loop_file,
 	if (!realpath(loop_dev, real_loop_dev))
 		return -errno;
 	snprintf(p, PATH_MAX, "/sys/block/%s/loop/backing_file", strrchr(real_loop_dev, '/'));
-	if (!(f = fopen(p, "r")))
+	if (!(f = fopen(p, "r"))) {
+		if (errno == ENOENT)
+			/* It's possibly a partitioned loop device, which
+			   is resolvable with loopdev API. */
+			return resolve_loop_device_with_loopdev(loop_dev, loop_file);
 		return -errno;
+	}

 	snprintf(fmt, 20, "%%%i[^\n]", max_len-1);
 	ret = fscanf(f, fmt, loop_file);
--
2.6.1

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

  reply	other threads:[~2015-11-12  9:10 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-09 13:06 [PATCH] btrfs-progs: Fix partitioned loop devices resolve Florian Margaine
2015-11-09 14:12 ` Karel Zak
2015-11-09 14:14   ` Florian Margaine
2015-11-10  8:35   ` Florian Margaine
2015-11-10 11:50     ` Karel Zak
2015-11-12  9:10       ` Florian Margaine [this message]
2015-11-13 17:16         ` David Sterba

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5644579B.3000102@commerceguys.com \
    --to=florian.margaine@commerceguys.com \
    --cc=kzak@redhat.com \
    --cc=linux-btrfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.