qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Stefan Hajnoczi <stefanha@redhat.com>
To: qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
	Peter Maydell <peter.maydell@linaro.org>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	Wolfgang Bumiller <w.bumiller@proxmox.com>
Subject: [Qemu-devel] [PULL 06/15] vvfat: add a label option
Date: Wed, 24 Jun 2015 16:27:57 +0100	[thread overview]
Message-ID: <1435159686-14817-7-git-send-email-stefanha@redhat.com> (raw)
In-Reply-To: <1435159686-14817-1-git-send-email-stefanha@redhat.com>

From: Wolfgang Bumiller <w.bumiller@proxmox.com>

Until now the vvfat volume label was hardcoded to be
"QEMU VVFAT", now you can pass a file.label=labelname option
to the -drive to change it.

The FAT structure defines the volume label to be limited to
11 bytes and is filled up spaces when shorter than that. The
trailing spaces however aren't exposed to the user by
operating systems.

[Added missing comment '#' characters in block-core.json to fix build
errors.
--Stefan]

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
Message-id: 1434706529-13895-2-git-send-email-w.bumiller@proxmox.com
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 block/vvfat.c        | 25 ++++++++++++++++++++++---
 qapi/block-core.json |  6 +++++-
 2 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/block/vvfat.c b/block/vvfat.c
index c35550c..2068697 100644
--- a/block/vvfat.c
+++ b/block/vvfat.c
@@ -323,6 +323,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;
@@ -860,7 +861,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 */
@@ -969,7 +970,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;
 
@@ -1009,6 +1011,11 @@ static QemuOptsList runtime_opts = {
             .help = "Create a floppy rather than a hard disk image",
         },
         {
+            .name = "label",
+            .type = QEMU_OPT_STRING,
+            .help = "Use a volume label other than QEMU VVFAT",
+        },
+        {
             .name = "rw",
             .type = QEMU_OPT_BOOL,
             .help = "Make the image writable",
@@ -1070,7 +1077,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;
@@ -1097,6 +1104,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..766d690 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -1453,13 +1453,17 @@
 # @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 set the volume label, limited to 11 bytes. FAT16 and
+#               FAT32 traditionally have some restrictions on labels, which are
+#               ignored by most operating systems. Defaults to "QEMU VVFAT".
+#               (since 2.4)
 # @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
-- 
2.4.3

  parent reply	other threads:[~2015-06-24 15:28 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-24 15:27 [Qemu-devel] [PULL 00/15] Block patches Stefan Hajnoczi
2015-06-24 15:27 ` [Qemu-devel] [PULL 01/15] block: Let bdrv_drain_all() to call aio_poll() for each AioContext Stefan Hajnoczi
2015-06-24 15:27 ` [Qemu-devel] [PULL 02/15] throttle: Check current timers before updating any_timer_armed[] Stefan Hajnoczi
2015-06-24 15:27 ` [Qemu-devel] [PULL 03/15] block-backend: Introduce blk_drain() Stefan Hajnoczi
2015-06-24 15:27 ` [Qemu-devel] [PULL 04/15] virtio-blk: Use blk_drain() to drain IO requests Stefan Hajnoczi
2015-06-24 15:27 ` [Qemu-devel] [PULL 05/15] util/hbitmap: Add an API to reset all set bits in hbitmap Stefan Hajnoczi
2015-06-24 15:27 ` Stefan Hajnoczi [this message]
2015-06-24 15:27 ` [Qemu-devel] [PULL 07/15] nvme: Fix memleak in nvme_dma_read_prp Stefan Hajnoczi
2015-06-24 15:27 ` [Qemu-devel] [PULL 08/15] block: Use bdrv_is_sg() everywhere Stefan Hajnoczi
2015-06-24 15:28 ` [Qemu-devel] [PULL 09/15] Fix migration in case of scsi-generic Stefan Hajnoczi
2015-06-24 15:28 ` [Qemu-devel] [PULL 10/15] raw-posix: DPRINTF instead of DEBUG_BLOCK_PRINT Stefan Hajnoczi
2015-06-24 15:28 ` [Qemu-devel] [PULL 11/15] raw-posix: Use DPRINTF for DEBUG_FLOPPY Stefan Hajnoczi
2015-06-24 15:28 ` [Qemu-devel] [PULL 12/15] raw-posix: Introduce hdev_is_sg() Stefan Hajnoczi
2015-06-24 15:28 ` [Qemu-devel] [PULL 13/15] iov: don't touch iov in iov_send_recv() Stefan Hajnoczi
2015-06-24 15:28 ` [Qemu-devel] [PULL 14/15] qemu-iotests: fix 051.out after qdev error message change Stefan Hajnoczi
2015-06-24 15:28 ` [Qemu-devel] [PULL 15/15] virito-blk: drop duplicate check Stefan Hajnoczi
2015-06-25 13:03 ` [Qemu-devel] [PULL 00/15] Block patches Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1435159686-14817-7-git-send-email-stefanha@redhat.com \
    --to=stefanha@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=w.bumiller@proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).