]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libmount: return tab entry for default node
authorPetr Vorel <pvorel@suse.cz>
Thu, 23 Feb 2017 18:25:13 +0000 (19:25 +0100)
committerKarel Zak <kzak@redhat.com>
Tue, 28 Feb 2017 13:41:42 +0000 (14:41 +0100)
This is useful for lsblk.

Signed-off-by: Petr Vorel <pvorel@suse.cz>
libmount/src/tab.c

index 8cf11814f2c20688834f0ff9062681f27b67f72d..c86ff79511654e112a612a11a33884744004cb7f 100644 (file)
@@ -936,6 +936,8 @@ struct libmnt_fs *mnt_table_find_target(struct libmnt_table *tb, const char *pat
  * The 2nd, 3rd and 4th iterations are not performed when the @tb cache is not
  * set (see mnt_table_set_cache()).
  *
+ * For btrfs returns tab entry for default id.
+ *
  * Note that NULL is a valid source path; it will be replaced with "none". The
  * "none" is used in /proc/{mounts,self/mountinfo} for pseudo filesystems.
  *
@@ -958,9 +960,34 @@ struct libmnt_fs *mnt_table_find_srcpath(struct libmnt_table *tb, const char *pa
 
        /* native paths */
        mnt_reset_iter(&itr, direction);
+
        while(mnt_table_next_fs(tb, &itr, &fs) == 0) {
-               if (mnt_fs_streq_srcpath(fs, path))
+
+               if (mnt_fs_streq_srcpath(fs, path)) {
+#ifdef HAVE_BTRFS_SUPPORT
+                       if (!strcmp(fs->fstype, "btrfs")) {
+                               uint64_t default_id = btrfs_get_default_subvol_id(mnt_fs_get_target(fs));
+                               uint64_t subvol_id;
+                               char *val;
+                               size_t len;
+
+                               if (default_id == UINT64_MAX) {
+                                       DBG(TAB, ul_debug("not found btrfs volume setting"));
+                                       return fs;
+                               }
+
+                               if (mnt_fs_get_option(fs, "subvolid", &val, &len) == 0) {
+                                       if (mnt_parse_offset(val, len, &subvol_id)) {
+                                               DBG(TAB, ul_debugobj(tb, "failed to parse subvolid="));
+                                               continue;
+                                       }
+                                       if (subvol_id != default_id)
+                                               continue;
+                               }
+                       }
+#endif /* HAVE_BTRFS_SUPPORT */
                        return fs;
+               }
                if (mnt_fs_get_tag(fs, NULL, NULL) == 0)
                        ntags++;
        }