diff mbox

vvfat: add a label option

Message ID 1434636521-24426-1-git-send-email-w.bumiller@proxmox.com
State New
Headers show

Commit Message

Wolfgang Bumiller June 18, 2015, 2:08 p.m. UTC
Till now the vvfat filesystem's label was hardcoded to be
"QEMU VVFAT", now you can pass a file.label=labelname option
to the -drive to change it.

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
---
 block/vvfat.c        | 25 ++++++++++++++++++++++---
 qapi/block-core.json |  3 ++-
 2 files changed, 24 insertions(+), 4 deletions(-)

Comments

Eric Blake June 18, 2015, 9:01 p.m. UTC | #1
On 06/18/2015 08:08 AM, Wolfgang Bumiller wrote:
> Till now the vvfat filesystem's label was hardcoded to be

s/Till/Until/

> "QEMU VVFAT", now you can pass a file.label=labelname option
> to the -drive to change it.
> 
> Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
> ---
>  block/vvfat.c        | 25 ++++++++++++++++++++++---
>  qapi/block-core.json |  3 ++-
>  2 files changed, 24 insertions(+), 4 deletions(-)
> 

> +++ b/qapi/block-core.json
> @@ -1453,13 +1453,14 @@
>  # @fat-type:    #optional FAT type: 12, 16 or 32
>  # @floppy:      #optional whether to export a floppy image (true) or
>  #               partitioned hard disk (false; default)
> +# @label:       #optional override default label

Missing '(since 2.4)', and also a description of the default text, as
well as the fact that the text is limited to 11 bytes.  Not sure if it
is also worth mentioning that shorter strings padded with trailing
spaces to the proper length.

Otherwise looks reasonable.
diff mbox

Patch

diff --git a/block/vvfat.c b/block/vvfat.c
index e803589..d407e37 100644
--- a/block/vvfat.c
+++ b/block/vvfat.c
@@ -322,6 +322,7 @@  typedef struct BDRVVVFATState {
 
     int fat_type; /* 16 or 32 */
     array_t fat,directory,mapping;
+    char volume_label[11];
 
     unsigned int cluster_size;
     unsigned int sectors_per_cluster;
@@ -859,7 +860,7 @@  static int init_directories(BDRVVVFATState* s,
     {
 	direntry_t* entry=array_get_next(&(s->directory));
 	entry->attributes=0x28; /* archive | volume label */
-        memcpy(entry->name, "QEMU VVFAT ", sizeof(entry->name));
+        memcpy(entry->name, s->volume_label, sizeof(entry->name));
     }
 
     /* Now build FAT, and write back information into directory */
@@ -968,7 +969,8 @@  static int init_directories(BDRVVVFATState* s,
     bootsector->u.fat16.signature=0x29;
     bootsector->u.fat16.id=cpu_to_le32(0xfabe1afd);
 
-    memcpy(bootsector->u.fat16.volume_label,"QEMU VVFAT ",11);
+    memcpy(bootsector->u.fat16.volume_label, s->volume_label,
+           sizeof(bootsector->u.fat16.volume_label));
     memcpy(bootsector->fat_type,(s->fat_type==12?"FAT12   ":s->fat_type==16?"FAT16   ":"FAT32   "),8);
     bootsector->magic[0]=0x55; bootsector->magic[1]=0xaa;
 
@@ -1008,6 +1010,11 @@  static QemuOptsList runtime_opts = {
             .help = "Create a floppy rather than a hard disk image",
         },
         {
+            .name = "label",
+            .type = QEMU_OPT_STRING,
+            .help = "Use a partition label other than QEMU VVFAT",
+        },
+        {
             .name = "rw",
             .type = QEMU_OPT_BOOL,
             .help = "Make the image writable",
@@ -1069,7 +1076,7 @@  static int vvfat_open(BlockDriverState *bs, QDict *options, int flags,
     BDRVVVFATState *s = bs->opaque;
     int cyls, heads, secs;
     bool floppy;
-    const char *dirname;
+    const char *dirname, *label;
     QemuOpts *opts;
     Error *local_err = NULL;
     int ret;
@@ -1096,6 +1103,18 @@  static int vvfat_open(BlockDriverState *bs, QDict *options, int flags,
     s->fat_type = qemu_opt_get_number(opts, "fat-type", 0);
     floppy = qemu_opt_get_bool(opts, "floppy", false);
 
+    memset(s->volume_label, ' ', sizeof(s->volume_label));
+    label = qemu_opt_get(opts, "label");
+    if (label) {
+        size_t label_length = strlen(label);
+        if (label_length > 11) {
+            error_setg(errp, "vvfat label cannot be longer than 11 bytes");
+            ret = -EINVAL;
+            goto fail;
+        }
+        memcpy(s->volume_label, label, label_length);
+    }
+
     if (floppy) {
         /* 1.44MB or 2.88MB floppy.  2.88MB can be FAT12 (default) or FAT16. */
         if (!s->fat_type) {
diff --git a/qapi/block-core.json b/qapi/block-core.json
index afa9d3d..2a529b1 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -1453,13 +1453,14 @@ 
 # @fat-type:    #optional FAT type: 12, 16 or 32
 # @floppy:      #optional whether to export a floppy image (true) or
 #               partitioned hard disk (false; default)
+# @label:       #optional override default label
 # @rw:          #optional whether to allow write operations (default: false)
 #
 # Since: 1.7
 ##
 { 'struct': 'BlockdevOptionsVVFAT',
   'data': { 'dir': 'str', '*fat-type': 'int', '*floppy': 'bool',
-            '*rw': 'bool' } }
+            '*label': 'str', '*rw': 'bool' } }
 
 ##
 # @BlockdevOptionsGenericFormat