<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>Acked-by: Maxim Patlasov <a class="moz-txt-link-rfc2396E"
        href="mailto:mpatlasov@virtuozzo.com">&lt;mpatlasov@virtuozzo.com&gt;</a></p>
    <br>
    <div class="moz-cite-prefix">On 07/13/2017 05:10 PM, Andrei Vagin
      wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:1499991005-19199-1-git-send-email-avagin@openvz.org">
      <pre wrap="">Currently we can get an image file for a ploop delta from sysfs, but
there is a problem, if a ploop was mounted or snapshoted from another
mount namespace. In this case, we can't report a full path to a delta in
a current mount namespace, because the origin namespace may be already
destroyed or a mount with ploop deltas can be mounted into another place
in the current mntns.

Here is an example of one of such cases:

$ unshare -m ploop mount /mnt/vstorage/test/DiskDescriptor.xml
Opening delta /mnt/vstorage/test/test
Opening delta /mnt/vstorage/test/test
Adding delta dev=/dev/ploop64360 img=/mnt/vstorage/test/test (rw)

$ cat /sys/block/ploop64360/pdelta/0/image
/test/test

$ cat /sys/block/ploop64360/pdelta/0/image_info
ino:254
sdev:0:38

$ stat /mnt/vstorage/test/test
Device: 26h/38d        Inode: 254         Links: 1

The ploop tool uses delta names to find a proper device by
Diskdescriptor.xml. Actually, a path to a delta file isn't required in
this case, it is enough to know a pair of ino and s_dev.

This patch introduces one more file in sysfs, which is called image_info
and contains an inode number and a source devices for a delta file.

<a class="moz-txt-link-freetext" href="https://jira.sw.ru/browse/PSBM-68404">https://jira.sw.ru/browse/PSBM-68404</a>
Signed-off-by: Andrei Vagin <a class="moz-txt-link-rfc2396E" href="mailto:avagin@openvz.org">&lt;avagin@openvz.org&gt;</a>
---
 drivers/block/ploop/sysfs.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/drivers/block/ploop/sysfs.c b/drivers/block/ploop/sysfs.c
index 0395ccf..acd18ff 100644
--- a/drivers/block/ploop/sysfs.c
+++ b/drivers/block/ploop/sysfs.c
@@ -102,6 +102,22 @@ static ssize_t delta_image_show(struct ploop_delta *delta, char *page)
         return len;
 }
 
+static ssize_t delta_image_info_show(struct ploop_delta *delta, char *page)
+{
+        int len = -ENOENT;
+
+        mutex_lock(&amp;delta-&gt;plo-&gt;sysfs_mutex);
+        if (delta-&gt;io.files.file) {
+                struct inode *inode = file_inode(delta-&gt;io.files.file);
+                len = snprintf(page, PAGE_SIZE, "ino:%lu\nsdev:%u:%u\n",
+                                inode-&gt;i_ino,
+                                MAJOR(inode-&gt;i_sb-&gt;s_dev),
+                                MINOR(inode-&gt;i_sb-&gt;s_dev));
+        }
+        mutex_unlock(&amp;delta-&gt;plo-&gt;sysfs_mutex);
+        return len;
+}
+
 static ssize_t delta_format_show(struct ploop_delta *delta, char *page)
 {
         return delta_string_show(delta-&gt;ops-&gt;name, page);
@@ -147,6 +163,12 @@ static struct delta_sysfs_entry delta_image_entry = {
         .store = NULL,
 };
 
+static struct delta_sysfs_entry delta_image_info_entry = {
+        .attr = {.name = "image_info", .mode = S_IRUGO },
+        .show = delta_image_info_show,
+        .store = NULL,
+};
+
 static struct delta_sysfs_entry delta_format_entry = {
         .attr = {.name = "format", .mode = S_IRUGO },
         .show = delta_format_show,
@@ -179,6 +201,7 @@ static struct delta_sysfs_entry delta_dump_entry = {
 static struct attribute *default_attrs[] = {
         &amp;delta_level_entry.attr,
         &amp;delta_image_entry.attr,
+        &amp;delta_image_info_entry.attr,
         &amp;delta_format_entry.attr,
         &amp;delta_io_entry.attr,
         &amp;delta_ro_entry.attr,
</pre>
    </blockquote>
    <br>
  </body>
</html>