[Libguestfs] [PATCH] mkfs: add 'label' optional argument

Richard W.M. Jones rjones at redhat.com
Mon Jan 19 14:41:19 UTC 2015


On Tue, Jan 13, 2015 at 10:38:09AM +0100, Pino Toscano wrote:
> Add the 'label' optional argument to the mkfs action, so it is possible
> to set a filesystem label direct when creating it. There may be
> filesystems not supporting changing the label of existing filesystems
> but only setting it at creation time, so this new optarg will help.
> 
> Implement it for the most common filesystems (ext*, fat, ntfs, btrfs,
> xfs), giving an error for all the others, just like set_label does.
> ---
>  daemon/mkfs.c        | 45 +++++++++++++++++++++++++++++++++++++++++++--
>  generator/actions.ml | 42 +++++++++++++++++++++++-------------------
>  2 files changed, 66 insertions(+), 21 deletions(-)
> 
> diff --git a/daemon/mkfs.c b/daemon/mkfs.c
> index 95ab874..2994307 100644
> --- a/daemon/mkfs.c
> +++ b/daemon/mkfs.c
> @@ -36,7 +36,7 @@ GUESTFSD_EXT_CMD(str_mkfs, mkfs);
>  /* Takes optional arguments, consult optargs_bitmask. */
>  int
>  do_mkfs (const char *fstype, const char *device, int blocksize,
> -         const char *features, int inode, int sectorsize)
> +         const char *features, int inode, int sectorsize, const char *label)
>  {
>    const char *argv[MAX_ARGS];
>    size_t i = 0;
> @@ -194,6 +194,47 @@ do_mkfs (const char *fstype, const char *device, int blocksize,
>      ADD_ARG (argv, i, sectorsize_str);
>    }
>  
> +  if (optargs_bitmask & GUESTFS_MKFS_LABEL_BITMASK) {
> +    if (extfs) {
> +      if (strlen (label) > EXT2_LABEL_MAX) {
> +        reply_with_error ("%s: ext2 labels are limited to %d bytes",
> +                          label, EXT2_LABEL_MAX);
> +        return -1;
> +      }
> +
> +      ADD_ARG (argv, i, "-L");
> +      ADD_ARG (argv, i, label);
> +    }
> +    else if (STREQ (fstype, "fat") || STREQ (fstype, "vfat") ||
> +             STREQ (fstype, "msdos")) {
> +      ADD_ARG (argv, i, "-n");
> +      ADD_ARG (argv, i, label);
> +    }
> +    else if (STREQ (fstype, "ntfs")) {
> +      ADD_ARG (argv, i, "-L");
> +      ADD_ARG (argv, i, label);
> +    }
> +    else if (STREQ (fstype, "xfs")) {
> +      if (strlen (label) > XFS_LABEL_MAX) {
> +        reply_with_error ("%s: xfs labels are limited to %d bytes",
> +                          label, XFS_LABEL_MAX);
> +        return -1;
> +      }
> +
> +      ADD_ARG (argv, i, "-L");
> +      ADD_ARG (argv, i, label);
> +    }
> +    else if (STREQ (fstype, "btrfs")) {
> +      ADD_ARG (argv, i, "-L");
> +      ADD_ARG (argv, i, label);
> +    }
> +    else {
> +      reply_with_error ("don't know how to set the label for '%s' filesystems",
> +                        fstype);
> +      return -1;
> +    }
> +  }
> +
>    ADD_ARG (argv, i, device);
>    ADD_ARG (argv, i, NULL);
>  
> @@ -212,5 +253,5 @@ int
>  do_mkfs_b (const char *fstype, int blocksize, const char *device)
>  {
>    optargs_bitmask = GUESTFS_MKFS_BLOCKSIZE_BITMASK;
> -  return do_mkfs (fstype, device, blocksize, 0, 0, 0);
> +  return do_mkfs (fstype, device, blocksize, 0, 0, 0, NULL);
>  }
> diff --git a/generator/actions.ml b/generator/actions.ml
> index a6a6dad..96a9dd6 100644
> --- a/generator/actions.ml
> +++ b/generator/actions.ml
> @@ -3324,7 +3324,7 @@ let daemon_functions = [
>      tests = [
>        InitEmpty, Always, TestResultString (
>          [["part_disk"; "/dev/sda"; "mbr"];
> -         ["mkfs"; "ext2"; "/dev/sda1"; ""; "NOARG"; ""; ""];
> +         ["mkfs"; "ext2"; "/dev/sda1"; ""; "NOARG"; ""; ""; "NOARG"];
>           ["mount"; "/dev/sda1"; "/"];
>           ["write"; "/new"; "new file contents"];
>           ["cat"; "/new"]], "new file contents"), []
> @@ -4138,12 +4138,12 @@ characters does I<not> work, even if the length is specified." };
>      tests = [
>        InitEmpty, Always, TestResult (
>          [["part_disk"; "/dev/sda"; "mbr"];
> -         ["mkfs"; "ext2"; "/dev/sda1"; ""; "NOARG"; ""; ""];
> +         ["mkfs"; "ext2"; "/dev/sda1"; ""; "NOARG"; ""; ""; "NOARG"];
>           ["mount"; "/dev/sda1"; "/"];
>           ["mounts"]], "is_device_list (ret, 1, \"/dev/sda1\")"), [];
>        InitEmpty, Always, TestResult (
>          [["part_disk"; "/dev/sda"; "mbr"];
> -         ["mkfs"; "ext2"; "/dev/sda1"; ""; "NOARG"; ""; ""];
> +         ["mkfs"; "ext2"; "/dev/sda1"; ""; "NOARG"; ""; ""; "NOARG"];
>           ["mount"; "/dev/sda1"; "/"];
>           ["umount"; "/"; "false"; "false"];
>           ["mounts"]], "is_string_list (ret, 0)"), []
> @@ -4186,9 +4186,9 @@ See also: C<guestfs_mountpoints>" };
>           ["part_add"; "/dev/sda"; "p"; "64"; "204799"];
>           ["part_add"; "/dev/sda"; "p"; "204800"; "409599"];
>           ["part_add"; "/dev/sda"; "p"; "409600"; "-64"];
> -         ["mkfs"; "ext2"; "/dev/sda1"; ""; "NOARG"; ""; ""];
> -         ["mkfs"; "ext2"; "/dev/sda2"; ""; "NOARG"; ""; ""];
> -         ["mkfs"; "ext2"; "/dev/sda3"; ""; "NOARG"; ""; ""];
> +         ["mkfs"; "ext2"; "/dev/sda1"; ""; "NOARG"; ""; ""; "NOARG"];
> +         ["mkfs"; "ext2"; "/dev/sda2"; ""; "NOARG"; ""; ""; "NOARG"];
> +         ["mkfs"; "ext2"; "/dev/sda3"; ""; "NOARG"; ""; ""; "NOARG"];
>           ["mount"; "/dev/sda1"; "/"];
>           ["mkdir"; "/mp1"];
>           ["mount"; "/dev/sda2"; "/mp1"];
> @@ -5478,7 +5478,7 @@ the human-readable, canonical hex dump of the file." };
>      tests = [
>        InitNone, Always, TestResultString (
>          [["part_disk"; "/dev/sda"; "mbr"];
> -         ["mkfs"; "ext3"; "/dev/sda1"; ""; "NOARG"; ""; ""];
> +         ["mkfs"; "ext3"; "/dev/sda1"; ""; "NOARG"; ""; ""; "NOARG"];
>           ["mount"; "/dev/sda1"; "/"];
>           ["write"; "/new"; "test file"];
>           ["umount"; "/dev/sda1"; "false"; "false"];
> @@ -5602,7 +5602,7 @@ are activated or deactivated." };
>           ["pvcreate"; "/dev/sda1"];
>           ["vgcreate"; "VG"; "/dev/sda1"];
>           ["lvcreate"; "LV"; "VG"; "10"];
> -         ["mkfs"; "ext2"; "/dev/VG/LV"; ""; "NOARG"; ""; ""];
> +         ["mkfs"; "ext2"; "/dev/VG/LV"; ""; "NOARG"; ""; ""; "NOARG"];
>           ["mount"; "/dev/VG/LV"; "/"];
>           ["write"; "/new"; "test content"];
>           ["umount"; "/"; "false"; "false"];
> @@ -5669,11 +5669,11 @@ Sleep for C<secs> seconds." };
>      tests = [
>        InitNone, Always, TestResult (
>          [["part_disk"; "/dev/sda"; "mbr"];
> -         ["mkfs"; "ntfs"; "/dev/sda1"; ""; "NOARG"; ""; ""];
> +         ["mkfs"; "ntfs"; "/dev/sda1"; ""; "NOARG"; ""; ""; "NOARG"];
>           ["ntfs_3g_probe"; "true"; "/dev/sda1"]], "ret == 0"), [];
>        InitNone, Always, TestResult (
>          [["part_disk"; "/dev/sda"; "mbr"];
> -         ["mkfs"; "ext2"; "/dev/sda1"; ""; "NOARG"; ""; ""];
> +         ["mkfs"; "ext2"; "/dev/sda1"; ""; "NOARG"; ""; ""; "NOARG"];
>           ["ntfs_3g_probe"; "true"; "/dev/sda1"]], "ret == 12"), []
>      ];
>      shortdesc = "probe NTFS volume";
> @@ -8543,7 +8543,11 @@ a file in the host and attach it as a device." };
>      tests = [
>        InitBasicFS, Always, TestResultString (
>          [["set_label"; "/dev/sda1"; "LTEST"];
> -         ["vfs_label"; "/dev/sda1"]], "LTEST"), []
> +         ["vfs_label"; "/dev/sda1"]], "LTEST"), [];
> +      InitEmpty, Always, TestResultString (
> +        [["part_disk"; "/dev/sda"; "mbr"];
> +         ["mkfs"; "ext2"; "/dev/sda1"; ""; "NOARG"; ""; ""; "test-label"];
> +         ["vfs_label"; "/dev/sda1"]], "test-label"), [];
>      ];
>      shortdesc = "get the filesystem label";
>      longdesc = "\
> @@ -9015,13 +9019,13 @@ See also C<guestfs_is_lv>, C<guestfs_canonical_device_name>." };
>  
>    { defaults with
>      name = "mkfs";
> -    style = RErr, [String "fstype"; Device "device"], [OInt "blocksize"; OString "features"; OInt "inode"; OInt "sectorsize"];
> +    style = RErr, [String "fstype"; Device "device"], [OInt "blocksize"; OString "features"; OInt "inode"; OInt "sectorsize"; OString "label"];
>      proc_nr = Some 278;
>      once_had_no_optargs = true;
>      tests = [
>        InitEmpty, Always, TestResultString (
>          [["part_disk"; "/dev/sda"; "mbr"];
> -         ["mkfs"; "ext2"; "/dev/sda1"; ""; "NOARG"; ""; ""];
> +         ["mkfs"; "ext2"; "/dev/sda1"; ""; "NOARG"; ""; ""; "NOARG"];
>           ["mount"; "/dev/sda1"; "/"];
>           ["write"; "/new"; "new file contents"];
>           ["cat"; "/new"]], "new file contents"), []
> @@ -9761,7 +9765,7 @@ device." };
>      optional = Some "ntfs3g";
>      tests = [
>        InitPartition, Always, TestRun (
> -        [["mkfs"; "ntfs"; "/dev/sda1"; ""; "NOARG"; ""; ""];
> +        [["mkfs"; "ntfs"; "/dev/sda1"; ""; "NOARG"; ""; ""; "NOARG"];
>           ["ntfsfix"; "/dev/sda1"; "false"]]), []
>      ];
>      shortdesc = "fix common errors and force Windows to check NTFS";
> @@ -9820,7 +9824,7 @@ any existing contents of this device." };
>          [["set_label"; "/dev/sda1"; "testlabel"];
>           ["vfs_label"; "/dev/sda1"]], "testlabel"), [];
>        InitPartition, IfAvailable "ntfs3g", TestResultString (
> -        [["mkfs"; "ntfs"; "/dev/sda1"; ""; "NOARG"; ""; ""];
> +        [["mkfs"; "ntfs"; "/dev/sda1"; ""; "NOARG"; ""; ""; "NOARG"];
>           ["set_label"; "/dev/sda1"; "testlabel2"];
>           ["vfs_label"; "/dev/sda1"]], "testlabel2"), [];
>        InitPartition, Always, TestLastFail (
> @@ -10485,7 +10489,7 @@ call C<guestfs_max_disks>." };
>      tests = [
>        InitEmpty, Always, TestResult (
>          [["part_disk"; "/dev/sda"; "mbr"];
> -         ["mkfs"; "xfs"; "/dev/sda1"; ""; "NOARG"; ""; ""];
> +         ["mkfs"; "xfs"; "/dev/sda1"; ""; "NOARG"; ""; ""; "NOARG"];
>           ["mount"; "/dev/sda1"; "/"];
>           ["xfs_info"; "/"]], "ret->xfs_blocksize == 4096"), []
>      ];
> @@ -10585,7 +10589,7 @@ in the returned structure is defined by the API." };
>           ["pvcreate"; "/dev/sda1"];
>           ["vgcreate"; "VG"; "/dev/sda1"];
>           ["lvcreate"; "LV"; "VG"; "40"];
> -         ["mkfs"; "xfs"; "/dev/VG/LV"; ""; "NOARG"; ""; ""];
> +         ["mkfs"; "xfs"; "/dev/VG/LV"; ""; "NOARG"; ""; ""; "NOARG"];
>           ["lvresize"; "/dev/VG/LV"; "80"];
>           ["mount"; "/dev/VG/LV"; "/"];
>           ["xfs_growfs"; "/"; "true"; "false"; "false"; ""; ""; ""; ""; ""];
> @@ -10722,7 +10726,7 @@ with zeroes)." };
>      tests = [
>        InitEmpty, Always, TestResult (
>          [["part_disk"; "/dev/sda"; "mbr"];
> -         ["mkfs"; "xfs"; "/dev/sda1"; ""; "NOARG"; ""; ""];
> +         ["mkfs"; "xfs"; "/dev/sda1"; ""; "NOARG"; ""; ""; "NOARG"];
>           ["xfs_admin"; "/dev/sda1"; ""; ""; ""; ""; "false"; "NOARG"; "NOARG"];
>           ["mount"; "/dev/sda1"; "/"];
>           ["xfs_info"; "/"]], "ret->xfs_lazycount == 0"), [];
> @@ -10956,7 +10960,7 @@ This is a wrapper around the L<hivex(3)> call of the same name." };
>      tests = [
>        InitEmpty, Always, TestRun (
>          [["part_disk"; "/dev/sda"; "mbr"];
> -         ["mkfs"; "xfs"; "/dev/sda1"; ""; "NOARG"; ""; ""];
> +         ["mkfs"; "xfs"; "/dev/sda1"; ""; "NOARG"; ""; ""; "NOARG"];
>           ["xfs_repair"; "/dev/sda1"; ""; "true"; ""; ""; ""; ""; ""; ""; "NOARG"; "NOARG"]
>          ]), []
>      ];

Looks good, ACK.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-top is 'top' for virtual machines.  Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://people.redhat.com/~rjones/virt-top




More information about the Libguestfs mailing list