vvfat: add a label option
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>
This commit is contained in:
parent
c6a8c3283f
commit
d5941ddae8
@ -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;
|
||||
|
||||
@ -1008,6 +1010,11 @@ static QemuOptsList runtime_opts = {
|
||||
.type = QEMU_OPT_BOOL,
|
||||
.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,
|
||||
@ -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) {
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user