Fajar A. Nugraha
2012-Feb-23 06:50 UTC
PATCH: Fix incorrect "error checking ... mount status" in mkfs.btrfs
Originally reported on linux-btrfs list:
http://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg08086.html
Fix suggested on:
http://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg08386.html
loop_info.lo_name is limited to LO_NAME_SIZE (curerently 64) characters.
This can cause a problem if a file whose full path is longer than
LO_NAME_SIZE is currently mounted.
This patch changes resolve_loop_device() to:
* Check /sys/block/loopX/loop/backing_file first
* If that fails, fallback to original behaviour using loop_info.lo_name
Patch is both inline and attached (in case mail client mungles it).
Signed-off-by: Fajar A. Nugraha <github@fajar.net>
---
utils.c | 18 +++++++++++++++++-
1 files changed, 17 insertions(+), 1 deletions(-)
diff --git a/utils.c b/utils.c
index 178d1b9..a62eeee 100644
--- a/utils.c
+++ b/utils.c
@@ -649,6 +649,9 @@ int resolve_loop_device(const char* loop_dev,
char* loop_file, int max_len)
{
int loop_fd;
int ret_ioctl;
+ int sysfs_fd;
+ char sysfs_path[PATH_MAX];
+ const char* sysfs_path_format =
"/sys/block/loop%d/loop/backing_file";
struct loop_info loopinfo;
if ((loop_fd = open(loop_dev, O_RDONLY)) < 0)
@@ -658,7 +661,20 @@ int resolve_loop_device(const char* loop_dev,
char* loop_file, int max_len)
close(loop_fd);
if (ret_ioctl == 0)
- strncpy(loop_file, loopinfo.lo_name, max_len);
+ {
+ snprintf(sysfs_path, PATH_MAX, sysfs_path_format, loopinfo.lo_number);
+ sysfs_fd = open(sysfs_path, O_RDONLY);
+ if (sysfs_fd < 0)
+ {
+ strncpy(loop_file, loopinfo.lo_name, max_len);
+ }
+ else
+ {
+ read(sysfs_fd, loop_file, max_len);
+ loop_file[strlen(loop_file)-1] = ''\0'';
+ close(sysfs_fd);
+ }
+ }
else
return -errno;
--
1.7.9