Use image file device/inode to find the correct loop device in kpartx
authorRisto Kankkunen <risto.kankkunen@f-secure.com>
Mon, 29 Jun 2015 15:39:48 +0000 (18:39 +0300)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Tue, 6 Oct 2015 07:13:46 +0000 (09:13 +0200)
Previously kpartx used the "lo_name" field of struct loop_info to store
and match the image file name. That field is not intended to store path
names (it's not big enough). Therefore kpartx was unable to delete
mappings to file paths longer than 63 characters. It also didn't
properly handle relative file paths: two different files with identical
relative path names could not be mapped. Instead kpartx would modify
the existing mapping when seeing a new file with the same relative path.

The "loopinfo" structure contains the image file device and inode
numbers. Use those to uniquely identify the correct loop device.

kpartx/lopart.c

index 6f83048..26f3011 100644 (file)
@@ -103,6 +103,14 @@ find_loop_by_file (const char * filename)
        int i, j, fd;
        struct stat statbuf;
        struct loop_info loopinfo;
+       dev_t file_dev;
+       ino_t file_ino;
+
+       if (stat (filename, &statbuf) != 0) {
+               return NULL;
+       }
+       file_dev = statbuf.st_dev;
+       file_ino = statbuf.st_ino;
 
        for (j = 0; j < SIZE(loop_formats); j++) {
 
@@ -123,7 +131,7 @@ find_loop_by_file (const char * filename)
                                continue;
                        }
 
-                       if (0 == strcmp(filename, loopinfo.lo_name)) {
+                       if (loopinfo.lo_device == file_dev && loopinfo.lo_inode == file_ino) {
                                close (fd);
                                return xstrdup(dev); /*found */
                        }