Revision 0e7e1989

b/block.c
189 189
                const char *backing_file, const char *backing_format,
190 190
                int flags)
191 191
{
192
    if (drv->bdrv_create2)
193
        return drv->bdrv_create2(filename, size_in_sectors, backing_file,
194
                                 backing_format, flags);
195
    if (drv->bdrv_create)
196
        return drv->bdrv_create(filename, size_in_sectors, backing_file,
197
                                flags);
198
    return -ENOTSUP;
192
    QEMUOptionParameter *options;
193

  
194
    options = parse_option_parameters("", drv->create_options, NULL);
195

  
196
    // Process flags
197
    if (flags & ~(BLOCK_FLAG_ENCRYPT | BLOCK_FLAG_COMPAT6 | BLOCK_FLAG_COMPRESS)) {
198
        return -ENOTSUP;
199
    }
200

  
201
    if (flags & BLOCK_FLAG_ENCRYPT) {
202
        set_option_parameter_int(options, BLOCK_OPT_ENCRYPT, 1);
203
    }
204
    if (flags & BLOCK_FLAG_COMPAT6) {
205
        set_option_parameter_int(options, BLOCK_OPT_COMPAT6, 1);
206
    }
207

  
208
    // Add size to options
209
    set_option_parameter_int(options, BLOCK_OPT_SIZE, size_in_sectors * 512);
210

  
211
    // Backing files
212
    if ((backing_file != NULL && set_option_parameter(options,
213
            BLOCK_OPT_BACKING_FILE, backing_file))
214
        || (backing_format != NULL && set_option_parameter(options,
215
            BLOCK_OPT_BACKING_FMT, backing_format)))
216
    {
217
        return -ENOTSUP;
218
    }
219

  
220
    return bdrv_create(drv, filename, options);
199 221
}
200 222

  
201
int bdrv_create(BlockDriver *drv,
202
                const char *filename, int64_t size_in_sectors,
203
                const char *backing_file, int flags)
223
int bdrv_create(BlockDriver *drv, const char* filename,
224
    QEMUOptionParameter *options)
204 225
{
205 226
    if (!drv->bdrv_create)
206 227
        return -ENOTSUP;
207
    return drv->bdrv_create(filename, size_in_sectors, backing_file, flags);
228

  
229
    return drv->bdrv_create(filename, options);
208 230
}
209 231

  
210 232
#ifdef _WIN32
b/block.h
3 3

  
4 4
#include "qemu-aio.h"
5 5
#include "qemu-common.h"
6
#include "qemu-option.h"
6 7

  
7 8
/* block.c */
8 9
typedef struct BlockDriver BlockDriver;
......
45 46

  
46 47
void bdrv_init(void);
47 48
BlockDriver *bdrv_find_format(const char *format_name);
48
int bdrv_create(BlockDriver *drv,
49
                const char *filename, int64_t size_in_sectors,
50
                const char *backing_file, int flags);
49
int bdrv_create(BlockDriver *drv, const char* filename,
50
    QEMUOptionParameter *options);
51 51
int bdrv_create2(BlockDriver *drv,
52 52
                 const char *filename, int64_t size_in_sectors,
53 53
                 const char *backing_file, const char *backing_format,
b/block/cow.c
202 202
    close(s->fd);
203 203
}
204 204

  
205
static int cow_create(const char *filename, int64_t image_sectors,
206
                      const char *image_filename, int flags)
205
static int cow_create(const char *filename, QEMUOptionParameter *options)
207 206
{
208 207
    int fd, cow_fd;
209 208
    struct cow_header_v2 cow_header;
210 209
    struct stat st;
211

  
212
    if (flags)
213
        return -ENOTSUP;
210
    int64_t image_sectors = 0;
211
    const char *image_filename = NULL;
212

  
213
    /* Read out options */
214
    while (options && options->name) {
215
        if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
216
            image_sectors = options->value.n / 512;
217
        } else if (!strcmp(options->name, BLOCK_OPT_BACKING_FILE)) {
218
            image_filename = options->value.s;
219
        }
220
        options++;
221
    }
214 222

  
215 223
    cow_fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY,
216 224
              0644);
......
253 261
    fsync(s->fd);
254 262
}
255 263

  
264
static QEMUOptionParameter cow_create_options[] = {
265
    { BLOCK_OPT_SIZE,           OPT_SIZE },
266
    { BLOCK_OPT_BACKING_FILE,   OPT_STRING },
267
    { NULL }
268
};
269

  
256 270
static BlockDriver bdrv_cow = {
257 271
    .format_name	= "cow",
258 272
    .instance_size	= sizeof(BDRVCowState),
......
264 278
    .bdrv_create	= cow_create,
265 279
    .bdrv_flush		= cow_flush,
266 280
    .bdrv_is_allocated	= cow_is_allocated,
281

  
282
    .create_options = cow_create_options,
267 283
};
268 284

  
269 285
static void bdrv_cow_init(void)
b/block/qcow.c
767 767
    bdrv_delete(s->hd);
768 768
}
769 769

  
770
static int qcow_create(const char *filename, int64_t total_size,
771
                      const char *backing_file, int flags)
770
static int qcow_create(const char *filename, QEMUOptionParameter *options)
772 771
{
773 772
    int fd, header_size, backing_filename_len, l1_size, i, shift;
774 773
    QCowHeader header;
775 774
    uint64_t tmp;
775
    int64_t total_size = 0;
776
    const char *backing_file = NULL;
777
    int flags = 0;
778

  
779
    /* Read out options */
780
    while (options && options->name) {
781
        if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
782
            total_size = options->value.n / 512;
783
        } else if (!strcmp(options->name, BLOCK_OPT_BACKING_FILE)) {
784
            backing_file = options->value.s;
785
        } else if (!strcmp(options->name, BLOCK_OPT_ENCRYPT)) {
786
            flags |= options->value.n ? BLOCK_FLAG_ENCRYPT : 0;
787
        }
788
        options++;
789
    }
776 790

  
777 791
    fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644);
778 792
    if (fd < 0)
......
918 932
    return 0;
919 933
}
920 934

  
935

  
936
static QEMUOptionParameter qcow_create_options[] = {
937
    { BLOCK_OPT_SIZE,           OPT_SIZE },
938
    { BLOCK_OPT_BACKING_FILE,   OPT_STRING },
939
    { BLOCK_OPT_ENCRYPT,        OPT_FLAG },
940
    { NULL }
941
};
942

  
921 943
static BlockDriver bdrv_qcow = {
922 944
    .format_name	= "qcow",
923 945
    .instance_size	= sizeof(BDRVQcowState),
......
935 957
    .aiocb_size		= sizeof(QCowAIOCB),
936 958
    .bdrv_write_compressed = qcow_write_compressed,
937 959
    .bdrv_get_info	= qcow_get_info,
960

  
961
    .create_options = qcow_create_options,
938 962
};
939 963

  
940 964
static void bdrv_qcow_init(void)
b/block/qcow2.c
1696 1696
    return 0;
1697 1697
}
1698 1698

  
1699
static int qcow_create(const char *filename, int64_t total_size,
1700
                       const char *backing_file, int flags)
1701
{
1702
    return qcow_create2(filename, total_size, backing_file, NULL, flags);
1699
static int qcow_create(const char *filename, QEMUOptionParameter *options)
1700
{
1701
    const char *backing_file = NULL;
1702
    const char *backing_fmt = NULL;
1703
    uint64_t sectors = 0;
1704
    int flags = 0;
1705

  
1706
    /* Read out options */
1707
    while (options && options->name) {
1708
        if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
1709
            sectors = options->value.n / 512;
1710
        } else if (!strcmp(options->name, BLOCK_OPT_BACKING_FILE)) {
1711
            backing_file = options->value.s;
1712
        } else if (!strcmp(options->name, BLOCK_OPT_BACKING_FMT)) {
1713
            backing_fmt = options->value.s;
1714
        } else if (!strcmp(options->name, BLOCK_OPT_ENCRYPT)) {
1715
            flags |= options->value.n ? BLOCK_FLAG_ENCRYPT : 0;
1716
        }
1717
        options++;
1718
    }
1719

  
1720
    return qcow_create2(filename, sectors, backing_file, backing_fmt, flags);
1703 1721
}
1704 1722

  
1705 1723
static int qcow_make_empty(BlockDriverState *bs)
......
2897 2915
    return ret;
2898 2916
}
2899 2917

  
2918
static QEMUOptionParameter qcow_create_options[] = {
2919
    { BLOCK_OPT_SIZE,           OPT_SIZE },
2920
    { BLOCK_OPT_BACKING_FILE,   OPT_STRING },
2921
    { BLOCK_OPT_BACKING_FMT,    OPT_STRING },
2922
    { BLOCK_OPT_ENCRYPT,        OPT_FLAG },
2923
    { NULL }
2924
};
2925

  
2900 2926
static BlockDriver bdrv_qcow2 = {
2901 2927
    .format_name	= "qcow2",
2902 2928
    .instance_size	= sizeof(BDRVQcowState),
......
2924 2950
    .bdrv_put_buffer    = qcow_put_buffer,
2925 2951
    .bdrv_get_buffer    = qcow_get_buffer,
2926 2952

  
2927
    .bdrv_create2 = qcow_create2,
2953
    .create_options = qcow_create_options,
2928 2954
    .bdrv_check = qcow_check,
2929 2955
};
2930 2956

  
b/block/raw-posix.c
823 823
}
824 824
#endif
825 825

  
826
static int raw_create(const char *filename, int64_t total_size,
827
                      const char *backing_file, int flags)
826
static int raw_create(const char *filename, QEMUOptionParameter *options)
828 827
{
829 828
    int fd;
829
    int64_t total_size = 0;
830 830

  
831
    if (flags || backing_file)
832
        return -ENOTSUP;
831
    /* Read out options */
832
    while (options && options->name) {
833
        if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
834
            total_size = options->value.n / 512;
835
        }
836
        options++;
837
    }
833 838

  
834 839
    fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY,
835 840
              0644);
......
846 851
    fsync(s->fd);
847 852
}
848 853

  
854

  
855
static QEMUOptionParameter raw_create_options[] = {
856
    { BLOCK_OPT_SIZE,           OPT_SIZE },
857
    { NULL }
858
};
859

  
849 860
static BlockDriver bdrv_raw = {
850 861
    .format_name = "raw",
851 862
    .instance_size = sizeof(BDRVRawState),
......
866 877

  
867 878
    .bdrv_truncate = raw_truncate,
868 879
    .bdrv_getlength = raw_getlength,
880

  
881
    .create_options = raw_create_options,
869 882
};
870 883

  
871 884
/***********************************************/
......
1364 1377
#endif /* !linux && !FreeBSD */
1365 1378

  
1366 1379
#if defined(__linux__) || defined(__FreeBSD__)
1367
static int hdev_create(const char *filename, int64_t total_size,
1368
                       const char *backing_file, int flags)
1380
static int hdev_create(const char *filename, QEMUOptionParameter *options)
1369 1381
{
1370 1382
    int fd;
1371 1383
    int ret = 0;
1372 1384
    struct stat stat_buf;
1385
    int64_t total_size = 0;
1373 1386

  
1374
    if (flags || backing_file)
1375
        return -ENOTSUP;
1387
    /* Read out options */
1388
    while (options && options->name) {
1389
        if (!strcmp(options->name, "size")) {
1390
            total_size = options->value.n / 512;
1391
        }
1392
        options++;
1393
    }
1376 1394

  
1377 1395
    fd = open(filename, O_WRONLY | O_BINARY);
1378 1396
    if (fd < 0)
......
1391 1409

  
1392 1410
#else  /* !(linux || freebsd) */
1393 1411

  
1394
static int hdev_create(const char *filename, int64_t total_size,
1395
                       const char *backing_file, int flags)
1412
static int hdev_create(const char *filename, QEMUOptionParameter *options)
1396 1413
{
1397 1414
    return -ENOTSUP;
1398 1415
}
b/block/raw-win32.c
210 210
    return l.QuadPart;
211 211
}
212 212

  
213
static int raw_create(const char *filename, int64_t total_size,
214
                      const char *backing_file, int flags)
213
static int raw_create(const char *filename, QEMUOptionParameter *options)
215 214
{
216 215
    int fd;
216
    int64_t total_size = 0;
217 217

  
218
    if (flags || backing_file)
219
        return -ENOTSUP;
218
    /* Read out options */
219
    while (options && options->name) {
220
        if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
221
            total_size = options->value.n / 512;
222
        }
223
        options++;
224
    }
220 225

  
221 226
    fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY,
222 227
              0644);
......
228 233
    return 0;
229 234
}
230 235

  
236
static QEMUOptionParameter raw_create_options[] = {
237
    { BLOCK_OPT_SIZE,           OPT_SIZE },
238
    { NULL }
239
};
240

  
231 241
static BlockDriver bdrv_raw = {
232 242
    .format_name	= "raw",
233 243
    .instance_size	= sizeof(BDRVRawState),
......
239 249
    .bdrv_write		= raw_write,
240 250
    .bdrv_truncate	= raw_truncate,
241 251
    .bdrv_getlength	= raw_getlength,
252

  
253
    .create_options = raw_create_options,
242 254
};
243 255

  
244 256
/***********************************************/
b/block/vmdk.c
687 687
    return 0;
688 688
}
689 689

  
690
static int vmdk_create(const char *filename, int64_t total_size,
691
                       const char *backing_file, int flags)
690
static int vmdk_create(const char *filename, QEMUOptionParameter *options)
692 691
{
693 692
    int fd, i;
694 693
    VMDK4Header header;
......
713 712
        "ddb.adapterType = \"ide\"\n";
714 713
    char desc[1024];
715 714
    const char *real_filename, *temp_str;
715
    int64_t total_size = 0;
716
    const char *backing_file = NULL;
717
    int flags = 0;
718

  
719
    // Read out options
720
    while (options && options->name) {
721
        if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
722
            total_size = options->value.n / 512;
723
        } else if (!strcmp(options->name, BLOCK_OPT_BACKING_FILE)) {
724
            backing_file = options->value.s;
725
        } else if (!strcmp(options->name, BLOCK_OPT_COMPAT6)) {
726
            flags |= options->value.n ? BLOCK_FLAG_COMPAT6: 0;
727
        }
728
        options++;
729
    }
716 730

  
717 731
    /* XXX: add support for backing file */
718 732
    if (backing_file) {
......
812 826
    bdrv_flush(s->hd);
813 827
}
814 828

  
829

  
830
static QEMUOptionParameter vmdk_create_options[] = {
831
    { BLOCK_OPT_SIZE,           OPT_SIZE },
832
    { BLOCK_OPT_BACKING_FILE,   OPT_STRING },
833
    { BLOCK_OPT_COMPAT6,        OPT_FLAG },
834
    { NULL }
835
};
836

  
815 837
static BlockDriver bdrv_vmdk = {
816 838
    .format_name	= "vmdk",
817 839
    .instance_size	= sizeof(BDRVVmdkState),
......
823 845
    .bdrv_create	= vmdk_create,
824 846
    .bdrv_flush		= vmdk_flush,
825 847
    .bdrv_is_allocated	= vmdk_is_allocated,
848

  
849
    .create_options = vmdk_create_options,
826 850
};
827 851

  
828 852
static void bdrv_vmdk_init(void)
b/block/vpc.c
477 477
    return 0;
478 478
}
479 479

  
480
static int vpc_create(const char *filename, int64_t total_sectors,
481
    const char *backing_file, int flags)
480
static int vpc_create(const char *filename, QEMUOptionParameter *options)
482 481
{
483 482
    uint8_t buf[1024];
484 483
    struct vhd_footer* footer = (struct vhd_footer*) buf;
......
489 488
    uint8_t heads;
490 489
    uint8_t secs_per_cyl;
491 490
    size_t block_size, num_bat_entries;
491
    int64_t total_sectors = 0;
492 492

  
493
    if (backing_file != NULL)
494
        return -ENOTSUP;
493
    // Read out options
494
    while (options && options->name) {
495
        if (!strcmp(options->name, "size")) {
496
            total_sectors = options->value.n / 512;
497
        }
498
        options++;
499
    }
495 500

  
501
    // Create the file
496 502
    fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644);
497 503
    if (fd < 0)
498 504
        return -EIO;
......
587 593
    bdrv_delete(s->hd);
588 594
}
589 595

  
596
static QEMUOptionParameter vpc_create_options[] = {
597
    { "size", OPT_SIZE },
598
    { NULL }
599
};
600

  
590 601
static BlockDriver bdrv_vpc = {
591 602
    .format_name	= "vpc",
592 603
    .instance_size	= sizeof(BDRVVPCState),
......
596 607
    .bdrv_write		= vpc_write,
597 608
    .bdrv_close		= vpc_close,
598 609
    .bdrv_create	= vpc_create,
610

  
611
    .create_options = vpc_create_options,
599 612
};
600 613

  
601 614
static void bdrv_vpc_init(void)
b/block/vvfat.c
2777 2777

  
2778 2778
    s->qcow_filename = qemu_malloc(1024);
2779 2779
    get_tmp_filename(s->qcow_filename, 1024);
2780
    if (bdrv_create(bdrv_find_format("qcow"),
2781
		s->qcow_filename, s->sector_count, "fat:", 0) < 0)
2780
    if (bdrv_create2(bdrv_find_format("qcow"),
2781
		s->qcow_filename, s->sector_count, "fat:", NULL, 0) < 0)
2782 2782
	return -1;
2783 2783
    s->qcow = bdrv_new("");
2784 2784
    if (s->qcow == NULL || bdrv_open(s->qcow, s->qcow_filename, 0) < 0)
b/block_int.h
25 25
#define BLOCK_INT_H
26 26

  
27 27
#include "block.h"
28
#include "qemu-option.h"
28 29

  
29 30
#define BLOCK_FLAG_ENCRYPT	1
30 31
#define BLOCK_FLAG_COMPRESS	2
31 32
#define BLOCK_FLAG_COMPAT6	4
32 33

  
34
#define BLOCK_OPT_SIZE          "size"
35
#define BLOCK_OPT_ENCRYPT       "encryption"
36
#define BLOCK_OPT_COMPAT6       "compat6"
37
#define BLOCK_OPT_BACKING_FILE  "backing_file"
38
#define BLOCK_OPT_BACKING_FMT   "backing_fmt"
39

  
33 40
typedef struct AIOPool {
34 41
    void (*cancel)(BlockDriverAIOCB *acb);
35 42
    int aiocb_size;
......
46 53
    int (*bdrv_write)(BlockDriverState *bs, int64_t sector_num,
47 54
                      const uint8_t *buf, int nb_sectors);
48 55
    void (*bdrv_close)(BlockDriverState *bs);
49
    int (*bdrv_create)(const char *filename, int64_t total_sectors,
50
                       const char *backing_file, int flags);
56
    int (*bdrv_create)(const char *filename, QEMUOptionParameter *options);
51 57
    void (*bdrv_flush)(BlockDriverState *bs);
52 58
    int (*bdrv_is_allocated)(BlockDriverState *bs, int64_t sector_num,
53 59
                             int nb_sectors, int *pnum);
......
97 103

  
98 104
    AIOPool aio_pool;
99 105

  
100
    /* new create with backing file format */
101
    int (*bdrv_create2)(const char *filename, int64_t total_sectors,
102
                        const char *backing_file, const char *backing_format,
103
                        int flags);
106
    /* List of options for creating images, terminated by name == NULL */
107
    QEMUOptionParameter *create_options;
108

  
104 109

  
105 110
    /* Returns number of errors in image, -errno for internal errors */
106 111
    int (*bdrv_check)(BlockDriverState* bs);
b/qemu-img.c
551 551
    if (flags & BLOCK_FLAG_ENCRYPT && flags & BLOCK_FLAG_COMPRESS)
552 552
        error("Compression and encryption not supported at the same time");
553 553

  
554
    ret = bdrv_create(drv, out_filename, total_sectors, out_baseimg, flags);
554
    ret = bdrv_create2(drv, out_filename, total_sectors, out_baseimg, NULL, flags);
555 555
    if (ret < 0) {
556 556
        if (ret == -ENOTSUP) {
557 557
            error("Formatting not supported for file format '%s'", out_fmt);

Also available in: Unified diff