[Pkg-libvirt-commits] [libguestfs] 161/384: daemon: use btrfs(1) to get btrfs labels

Hilko Bengen bengen at moszumanska.debian.org
Sun Mar 29 16:56:45 UTC 2015


This is an automated email from the git hooks/post-receive script.

bengen pushed a commit to branch experimental
in repository libguestfs.

commit 6db3c100e7c18820ff9ecc22415940eb5fedc64e
Author: Pino Toscano <ptoscano at redhat.com>
Date:   Wed Jan 14 18:55:13 2015 +0100

    daemon: use btrfs(1) to get btrfs labels
    
    blkid(1) (or actually, libblkid) seems to handle filesystem labels up
    to 127 characters. Considering that btrfs labels can be up to 255
    characters, this means long labels are not read correctly (i.e. get
    truncated) by blkid.
    
    Get the filesystem type, and if btrfs is available invoke
    `btrfs filesystem` to get the label of btrfs filesystems.
    
    Related to RHBZ#1164708.
---
 daemon/blkid.c  |  8 ++++++++
 daemon/btrfs.c  | 24 ++++++++++++++++++++++++
 daemon/daemon.h |  3 +++
 3 files changed, 35 insertions(+)

diff --git a/daemon/blkid.c b/daemon/blkid.c
index b98c155..e8e7b58 100644
--- a/daemon/blkid.c
+++ b/daemon/blkid.c
@@ -26,6 +26,7 @@
 
 #include "daemon.h"
 #include "actions.h"
+#include "optgroups.h"
 
 GUESTFSD_EXT_CMD(str_blkid, blkid);
 
@@ -76,6 +77,13 @@ do_vfs_type (const mountable_t *mountable)
 char *
 do_vfs_label (const mountable_t *mountable)
 {
+  CLEANUP_FREE char *type = do_vfs_type (mountable);
+
+  if (type) {
+    if (STREQ (type, "btrfs") && optgroup_btrfs_available ())
+      return btrfs_get_label (mountable->device);
+  }
+
   return get_blkid_tag (mountable->device, "LABEL");
 }
 
diff --git a/daemon/btrfs.c b/daemon/btrfs.c
index 150c089..cf1507d 100644
--- a/daemon/btrfs.c
+++ b/daemon/btrfs.c
@@ -44,6 +44,30 @@ optgroup_btrfs_available (void)
   return prog_exists (str_btrfs) && filesystem_available ("btrfs") > 0;
 }
 
+char *
+btrfs_get_label (const char *device)
+{
+  int r;
+  CLEANUP_FREE char *err = NULL;
+  char *out = NULL;
+  size_t len;
+
+  r = command (&out, &err, str_btrfs, "filesystem", "label",
+               device, NULL);
+  if (r == -1) {
+    reply_with_error ("%s", err);
+    free (out);
+    return NULL;
+  }
+
+  /* Trim trailing \n if present. */
+  len = strlen (out);
+  if (len > 0 && out[len-1] == '\n')
+    out[len-1] = '\0';
+
+  return out;
+}
+
 /* Takes optional arguments, consult optargs_bitmask. */
 int
 do_btrfs_filesystem_resize (const char *filesystem, int64_t size)
diff --git a/daemon/daemon.h b/daemon/daemon.h
index 08af577..2057bb1 100644
--- a/daemon/daemon.h
+++ b/daemon/daemon.h
@@ -262,6 +262,9 @@ extern char *debug_bmap (const char *subcmd, size_t argc, char *const *const arg
 extern char *debug_bmap_file (const char *subcmd, size_t argc, char *const *const argv);
 extern char *debug_bmap_device (const char *subcmd, size_t argc, char *const *const argv);
 
+/*-- in btrfs.c --*/
+extern char *btrfs_get_label (const char *device);
+
 /* ordinary daemon functions use these to indicate errors
  * NB: you don't need to prefix the string with the current command,
  * it is added automatically by the client-side RPC stubs.

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-libvirt/libguestfs.git



More information about the Pkg-libvirt-commits mailing list