Statistics
| Branch: | Revision:

root / block.c @ 8f40c388

History | View | Annotate | Download (33.8 kB)

1
/*
2
 * QEMU System Emulator block driver
3
 * 
4
 * Copyright (c) 2003 Fabrice Bellard
5
 * 
6
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7
 * of this software and associated documentation files (the "Software"), to deal
8
 * in the Software without restriction, including without limitation the rights
9
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
 * copies of the Software, and to permit persons to whom the Software is
11
 * furnished to do so, subject to the following conditions:
12
 *
13
 * The above copyright notice and this permission notice shall be included in
14
 * all copies or substantial portions of the Software.
15
 *
16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
 * THE SOFTWARE.
23
 */
24
#include "vl.h"
25
#include "block_int.h"
26

    
27
#ifdef _BSD
28
#include <sys/types.h>
29
#include <sys/stat.h>
30
#include <sys/ioctl.h>
31
#include <sys/queue.h>
32
#include <sys/disk.h>
33
#endif
34

    
35
#define SECTOR_BITS 9
36
#define SECTOR_SIZE (1 << SECTOR_BITS)
37

    
38
typedef struct BlockDriverAIOCBSync {
39
    BlockDriverAIOCB common;
40
    QEMUBH *bh;
41
    int ret;
42
} BlockDriverAIOCBSync;
43

    
44
static BlockDriverAIOCB *bdrv_aio_read_em(BlockDriverState *bs,
45
        int64_t sector_num, uint8_t *buf, int nb_sectors,
46
        BlockDriverCompletionFunc *cb, void *opaque);
47
static BlockDriverAIOCB *bdrv_aio_write_em(BlockDriverState *bs,
48
        int64_t sector_num, const uint8_t *buf, int nb_sectors,
49
        BlockDriverCompletionFunc *cb, void *opaque);
50
static void bdrv_aio_cancel_em(BlockDriverAIOCB *acb);
51
static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num, 
52
                        uint8_t *buf, int nb_sectors);
53
static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
54
                         const uint8_t *buf, int nb_sectors);
55

    
56
static BlockDriverState *bdrv_first;
57
static BlockDriver *first_drv;
58

    
59
#ifdef _WIN32
60
#define PATH_SEP '\\'
61
#else
62
#define PATH_SEP '/'
63
#endif
64

    
65
int path_is_absolute(const char *path)
66
{
67
    const char *p;
68
    p = strchr(path, ':');
69
    if (p)
70
        p++;
71
    else
72
        p = path;
73
    return (*p == PATH_SEP);
74
}
75

    
76
/* if filename is absolute, just copy it to dest. Otherwise, build a
77
   path to it by considering it is relative to base_path. URL are
78
   supported. */
79
void path_combine(char *dest, int dest_size,
80
                  const char *base_path,
81
                  const char *filename)
82
{
83
    const char *p, *p1;
84
    int len;
85

    
86
    if (dest_size <= 0)
87
        return;
88
    if (path_is_absolute(filename)) {
89
        pstrcpy(dest, dest_size, filename);
90
    } else {
91
        p = strchr(base_path, ':');
92
        if (p)
93
            p++;
94
        else
95
            p = base_path;
96
        p1 = strrchr(base_path, PATH_SEP);
97
        if (p1)
98
            p1++;
99
        else
100
            p1 = base_path;
101
        if (p1 > p)
102
            p = p1;
103
        len = p - base_path;
104
        if (len > dest_size - 1)
105
            len = dest_size - 1;
106
        memcpy(dest, base_path, len);
107
        dest[len] = '\0';
108
        pstrcat(dest, dest_size, filename);
109
    }
110
}
111

    
112

    
113
void bdrv_register(BlockDriver *bdrv)
114
{
115
    if (!bdrv->bdrv_aio_read) {
116
        /* add AIO emulation layer */
117
        bdrv->bdrv_aio_read = bdrv_aio_read_em;
118
        bdrv->bdrv_aio_write = bdrv_aio_write_em;
119
        bdrv->bdrv_aio_cancel = bdrv_aio_cancel_em;
120
        bdrv->aiocb_size = sizeof(BlockDriverAIOCBSync);
121
    } else if (!bdrv->bdrv_read && !bdrv->bdrv_pread) {
122
        /* add synchronous IO emulation layer */
123
        bdrv->bdrv_read = bdrv_read_em;
124
        bdrv->bdrv_write = bdrv_write_em;
125
    }
126
    bdrv->next = first_drv;
127
    first_drv = bdrv;
128
}
129

    
130
/* create a new block device (by default it is empty) */
131
BlockDriverState *bdrv_new(const char *device_name)
132
{
133
    BlockDriverState **pbs, *bs;
134

    
135
    bs = qemu_mallocz(sizeof(BlockDriverState));
136
    if(!bs)
137
        return NULL;
138
    pstrcpy(bs->device_name, sizeof(bs->device_name), device_name);
139
    if (device_name[0] != '\0') {
140
        /* insert at the end */
141
        pbs = &bdrv_first;
142
        while (*pbs != NULL)
143
            pbs = &(*pbs)->next;
144
        *pbs = bs;
145
    }
146
    return bs;
147
}
148

    
149
BlockDriver *bdrv_find_format(const char *format_name)
150
{
151
    BlockDriver *drv1;
152
    for(drv1 = first_drv; drv1 != NULL; drv1 = drv1->next) {
153
        if (!strcmp(drv1->format_name, format_name))
154
            return drv1;
155
    }
156
    return NULL;
157
}
158

    
159
int bdrv_create(BlockDriver *drv, 
160
                const char *filename, int64_t size_in_sectors,
161
                const char *backing_file, int flags)
162
{
163
    if (!drv->bdrv_create)
164
        return -ENOTSUP;
165
    return drv->bdrv_create(filename, size_in_sectors, backing_file, flags);
166
}
167

    
168
#ifdef _WIN32
169
void get_tmp_filename(char *filename, int size)
170
{
171
    tmpnam(filename);
172
}
173
#else
174
void get_tmp_filename(char *filename, int size)
175
{
176
    int fd;
177
    /* XXX: race condition possible */
178
    pstrcpy(filename, size, "/tmp/vl.XXXXXX");
179
    fd = mkstemp(filename);
180
    close(fd);
181
}
182
#endif
183

    
184
#ifdef _WIN32
185
static int is_windows_drive_prefix(const char *filename)
186
{
187
    return (((filename[0] >= 'a' && filename[0] <= 'z') ||
188
             (filename[0] >= 'A' && filename[0] <= 'Z')) &&
189
            filename[1] == ':');
190
}
191
    
192
static int is_windows_drive(const char *filename)
193
{
194
    if (is_windows_drive_prefix(filename) && 
195
        filename[2] == '\0')
196
        return 1;
197
    if (strstart(filename, "\\\\.\\", NULL) ||
198
        strstart(filename, "//./", NULL))
199
        return 1;
200
    return 0;
201
}
202
#endif
203

    
204
static BlockDriver *find_protocol(const char *filename)
205
{
206
    BlockDriver *drv1;
207
    char protocol[128];
208
    int len;
209
    const char *p;
210

    
211
#ifdef _WIN32
212
    if (is_windows_drive(filename) ||
213
        is_windows_drive_prefix(filename))
214
        return &bdrv_raw;
215
#endif
216
    p = strchr(filename, ':');
217
    if (!p)
218
        return &bdrv_raw;
219
    len = p - filename;
220
    if (len > sizeof(protocol) - 1)
221
        len = sizeof(protocol) - 1;
222
    memcpy(protocol, filename, len);
223
    protocol[len] = '\0';
224
    for(drv1 = first_drv; drv1 != NULL; drv1 = drv1->next) {
225
        if (drv1->protocol_name && 
226
            !strcmp(drv1->protocol_name, protocol))
227
            return drv1;
228
    }
229
    return NULL;
230
}
231

    
232
/* XXX: force raw format if block or character device ? It would
233
   simplify the BSD case */
234
static BlockDriver *find_image_format(const char *filename)
235
{
236
    int ret, score, score_max;
237
    BlockDriver *drv1, *drv;
238
    uint8_t buf[2048];
239
    BlockDriverState *bs;
240
    
241
    /* detect host devices. By convention, /dev/cdrom[N] is always
242
       recognized as a host CDROM */
243
    if (strstart(filename, "/dev/cdrom", NULL))
244
        return &bdrv_host_device;
245
#ifdef _WIN32
246
    if (is_windows_drive(filename))
247
        return &bdrv_host_device;
248
#else
249
    {
250
        struct stat st;
251
        if (stat(filename, &st) >= 0 && 
252
            (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode))) {
253
            return &bdrv_host_device;
254
        }
255
    }
256
#endif
257
    
258
    drv = find_protocol(filename);
259
    /* no need to test disk image formats for vvfat */
260
    if (drv == &bdrv_vvfat)
261
        return drv;
262

    
263
    ret = bdrv_file_open(&bs, filename, BDRV_O_RDONLY);
264
    if (ret < 0)
265
        return NULL;
266
    ret = bdrv_pread(bs, 0, buf, sizeof(buf));
267
    bdrv_delete(bs);
268
    if (ret < 0) {
269
        return NULL;
270
    }
271

    
272
    score_max = 0;
273
    for(drv1 = first_drv; drv1 != NULL; drv1 = drv1->next) {
274
        if (drv1->bdrv_probe) {
275
            score = drv1->bdrv_probe(buf, ret, filename);
276
            if (score > score_max) {
277
                score_max = score;
278
                drv = drv1;
279
            }
280
        }
281
    }
282
    return drv;
283
}
284

    
285
int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags)
286
{
287
    BlockDriverState *bs;
288
    int ret;
289

    
290
    bs = bdrv_new("");
291
    if (!bs)
292
        return -ENOMEM;
293
    ret = bdrv_open2(bs, filename, flags | BDRV_O_FILE, NULL);
294
    if (ret < 0) {
295
        bdrv_delete(bs);
296
        return ret;
297
    }
298
    *pbs = bs;
299
    return 0;
300
}
301

    
302
int bdrv_open(BlockDriverState *bs, const char *filename, int flags)
303
{
304
    return bdrv_open2(bs, filename, flags, NULL);
305
}
306

    
307
int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
308
               BlockDriver *drv)
309
{
310
    int ret, open_flags;
311
    char tmp_filename[1024];
312
    char backing_filename[1024];
313
    
314
    bs->read_only = 0;
315
    bs->is_temporary = 0;
316
    bs->encrypted = 0;
317

    
318
    if (flags & BDRV_O_SNAPSHOT) {
319
        BlockDriverState *bs1;
320
        int64_t total_size;
321
        
322
        /* if snapshot, we create a temporary backing file and open it
323
           instead of opening 'filename' directly */
324

    
325
        /* if there is a backing file, use it */
326
        bs1 = bdrv_new("");
327
        if (!bs1) {
328
            return -ENOMEM;
329
        }
330
        if (bdrv_open(bs1, filename, 0) < 0) {
331
            bdrv_delete(bs1);
332
            return -1;
333
        }
334
        total_size = bdrv_getlength(bs1) >> SECTOR_BITS;
335
        bdrv_delete(bs1);
336
        
337
        get_tmp_filename(tmp_filename, sizeof(tmp_filename));
338
        realpath(filename, backing_filename);
339
        if (bdrv_create(&bdrv_qcow2, tmp_filename, 
340
                        total_size, backing_filename, 0) < 0) {
341
            return -1;
342
        }
343
        filename = tmp_filename;
344
        bs->is_temporary = 1;
345
    }
346

    
347
    pstrcpy(bs->filename, sizeof(bs->filename), filename);
348
    if (flags & BDRV_O_FILE) {
349
        drv = find_protocol(filename);
350
        if (!drv)
351
            return -ENOENT;
352
    } else {
353
        if (!drv) {
354
            drv = find_image_format(filename);
355
            if (!drv)
356
                return -1;
357
        }
358
    }
359
    bs->drv = drv;
360
    bs->opaque = qemu_mallocz(drv->instance_size);
361
    if (bs->opaque == NULL && drv->instance_size > 0)
362
        return -1;
363
    /* Note: for compatibility, we open disk image files as RDWR, and
364
       RDONLY as fallback */
365
    if (!(flags & BDRV_O_FILE))
366
        open_flags = BDRV_O_RDWR;
367
    else
368
        open_flags = flags & ~(BDRV_O_FILE | BDRV_O_SNAPSHOT);
369
    ret = drv->bdrv_open(bs, filename, open_flags);
370
    if (ret == -EACCES && !(flags & BDRV_O_FILE)) {
371
        ret = drv->bdrv_open(bs, filename, BDRV_O_RDONLY);
372
        bs->read_only = 1;
373
    }
374
    if (ret < 0) {
375
        qemu_free(bs->opaque);
376
        bs->opaque = NULL;
377
        bs->drv = NULL;
378
        return ret;
379
    }
380
    if (drv->bdrv_getlength) {
381
        bs->total_sectors = bdrv_getlength(bs) >> SECTOR_BITS;
382
    }
383
#ifndef _WIN32
384
    if (bs->is_temporary) {
385
        unlink(filename);
386
    }
387
#endif
388
    if (bs->backing_file[0] != '\0') {
389
        /* if there is a backing file, use it */
390
        bs->backing_hd = bdrv_new("");
391
        if (!bs->backing_hd) {
392
        fail:
393
            bdrv_close(bs);
394
            return -ENOMEM;
395
        }
396
        path_combine(backing_filename, sizeof(backing_filename),
397
                     filename, bs->backing_file);
398
        if (bdrv_open(bs->backing_hd, backing_filename, 0) < 0)
399
            goto fail;
400
    }
401

    
402
    /* call the change callback */
403
    bs->media_changed = 1;
404
    if (bs->change_cb)
405
        bs->change_cb(bs->change_opaque);
406

    
407
    return 0;
408
}
409

    
410
void bdrv_close(BlockDriverState *bs)
411
{
412
    if (bs->drv) {
413
        if (bs->backing_hd)
414
            bdrv_delete(bs->backing_hd);
415
        bs->drv->bdrv_close(bs);
416
        qemu_free(bs->opaque);
417
#ifdef _WIN32
418
        if (bs->is_temporary) {
419
            unlink(bs->filename);
420
        }
421
#endif
422
        bs->opaque = NULL;
423
        bs->drv = NULL;
424

    
425
        /* call the change callback */
426
        bs->media_changed = 1;
427
        if (bs->change_cb)
428
            bs->change_cb(bs->change_opaque);
429
    }
430
}
431

    
432
void bdrv_delete(BlockDriverState *bs)
433
{
434
    /* XXX: remove the driver list */
435
    bdrv_close(bs);
436
    qemu_free(bs);
437
}
438

    
439
/* commit COW file into the raw image */
440
int bdrv_commit(BlockDriverState *bs)
441
{
442
    BlockDriver *drv = bs->drv;
443
    int64_t i, total_sectors;
444
    int n, j;
445
    unsigned char sector[512];
446

    
447
    if (!drv)
448
        return -ENOMEDIUM;
449

    
450
    if (bs->read_only) {
451
        return -EACCES;
452
    }
453

    
454
    if (!bs->backing_hd) {
455
        return -ENOTSUP;
456
    }
457

    
458
    total_sectors = bdrv_getlength(bs) >> SECTOR_BITS;
459
    for (i = 0; i < total_sectors;) {
460
        if (drv->bdrv_is_allocated(bs, i, 65536, &n)) {
461
            for(j = 0; j < n; j++) {
462
                if (bdrv_read(bs, i, sector, 1) != 0) {
463
                    return -EIO;
464
                }
465

    
466
                if (bdrv_write(bs->backing_hd, i, sector, 1) != 0) {
467
                    return -EIO;
468
                }
469
                i++;
470
            }
471
        } else {
472
            i += n;
473
        }
474
    }
475

    
476
    if (drv->bdrv_make_empty)
477
        return drv->bdrv_make_empty(bs);
478

    
479
    return 0;
480
}
481

    
482
/* return < 0 if error. See bdrv_write() for the return codes */
483
int bdrv_read(BlockDriverState *bs, int64_t sector_num, 
484
              uint8_t *buf, int nb_sectors)
485
{
486
    BlockDriver *drv = bs->drv;
487

    
488
    if (!drv)
489
        return -ENOMEDIUM;
490

    
491
    if (sector_num == 0 && bs->boot_sector_enabled && nb_sectors > 0) {
492
            memcpy(buf, bs->boot_sector_data, 512);
493
        sector_num++;
494
        nb_sectors--;
495
        buf += 512;
496
        if (nb_sectors == 0)
497
            return 0;
498
    }
499
    if (drv->bdrv_pread) {
500
        int ret, len;
501
        len = nb_sectors * 512;
502
        ret = drv->bdrv_pread(bs, sector_num * 512, buf, len);
503
        if (ret < 0)
504
            return ret;
505
        else if (ret != len)
506
            return -EINVAL;
507
        else
508
            return 0;
509
    } else {
510
        return drv->bdrv_read(bs, sector_num, buf, nb_sectors);
511
    }
512
}
513

    
514
/* Return < 0 if error. Important errors are: 
515
  -EIO         generic I/O error (may happen for all errors)
516
  -ENOMEDIUM   No media inserted.
517
  -EINVAL      Invalid sector number or nb_sectors
518
  -EACCES      Trying to write a read-only device
519
*/
520
int bdrv_write(BlockDriverState *bs, int64_t sector_num, 
521
               const uint8_t *buf, int nb_sectors)
522
{
523
    BlockDriver *drv = bs->drv;
524
    if (!bs->drv)
525
        return -ENOMEDIUM;
526
    if (bs->read_only)
527
        return -EACCES;
528
    if (sector_num == 0 && bs->boot_sector_enabled && nb_sectors > 0) {
529
        memcpy(bs->boot_sector_data, buf, 512);   
530
    }
531
    if (drv->bdrv_pwrite) {
532
        int ret, len;
533
        len = nb_sectors * 512;
534
        ret = drv->bdrv_pwrite(bs, sector_num * 512, buf, len);
535
        if (ret < 0)
536
            return ret;
537
        else if (ret != len)
538
            return -EIO;
539
        else
540
            return 0;
541
    } else {
542
        return drv->bdrv_write(bs, sector_num, buf, nb_sectors);
543
    }
544
}
545

    
546
static int bdrv_pread_em(BlockDriverState *bs, int64_t offset, 
547
                         uint8_t *buf, int count1)
548
{
549
    uint8_t tmp_buf[SECTOR_SIZE];
550
    int len, nb_sectors, count;
551
    int64_t sector_num;
552

    
553
    count = count1;
554
    /* first read to align to sector start */
555
    len = (SECTOR_SIZE - offset) & (SECTOR_SIZE - 1);
556
    if (len > count)
557
        len = count;
558
    sector_num = offset >> SECTOR_BITS;
559
    if (len > 0) {
560
        if (bdrv_read(bs, sector_num, tmp_buf, 1) < 0)
561
            return -EIO;
562
        memcpy(buf, tmp_buf + (offset & (SECTOR_SIZE - 1)), len);
563
        count -= len;
564
        if (count == 0)
565
            return count1;
566
        sector_num++;
567
        buf += len;
568
    }
569

    
570
    /* read the sectors "in place" */
571
    nb_sectors = count >> SECTOR_BITS;
572
    if (nb_sectors > 0) {
573
        if (bdrv_read(bs, sector_num, buf, nb_sectors) < 0)
574
            return -EIO;
575
        sector_num += nb_sectors;
576
        len = nb_sectors << SECTOR_BITS;
577
        buf += len;
578
        count -= len;
579
    }
580

    
581
    /* add data from the last sector */
582
    if (count > 0) {
583
        if (bdrv_read(bs, sector_num, tmp_buf, 1) < 0)
584
            return -EIO;
585
        memcpy(buf, tmp_buf, count);
586
    }
587
    return count1;
588
}
589

    
590
static int bdrv_pwrite_em(BlockDriverState *bs, int64_t offset, 
591
                          const uint8_t *buf, int count1)
592
{
593
    uint8_t tmp_buf[SECTOR_SIZE];
594
    int len, nb_sectors, count;
595
    int64_t sector_num;
596

    
597
    count = count1;
598
    /* first write to align to sector start */
599
    len = (SECTOR_SIZE - offset) & (SECTOR_SIZE - 1);
600
    if (len > count)
601
        len = count;
602
    sector_num = offset >> SECTOR_BITS;
603
    if (len > 0) {
604
        if (bdrv_read(bs, sector_num, tmp_buf, 1) < 0)
605
            return -EIO;
606
        memcpy(tmp_buf + (offset & (SECTOR_SIZE - 1)), buf, len);
607
        if (bdrv_write(bs, sector_num, tmp_buf, 1) < 0)
608
            return -EIO;
609
        count -= len;
610
        if (count == 0)
611
            return count1;
612
        sector_num++;
613
        buf += len;
614
    }
615

    
616
    /* write the sectors "in place" */
617
    nb_sectors = count >> SECTOR_BITS;
618
    if (nb_sectors > 0) {
619
        if (bdrv_write(bs, sector_num, buf, nb_sectors) < 0)
620
            return -EIO;
621
        sector_num += nb_sectors;
622
        len = nb_sectors << SECTOR_BITS;
623
        buf += len;
624
        count -= len;
625
    }
626

    
627
    /* add data from the last sector */
628
    if (count > 0) {
629
        if (bdrv_read(bs, sector_num, tmp_buf, 1) < 0)
630
            return -EIO;
631
        memcpy(tmp_buf, buf, count);
632
        if (bdrv_write(bs, sector_num, tmp_buf, 1) < 0)
633
            return -EIO;
634
    }
635
    return count1;
636
}
637

    
638
/**
639
 * Read with byte offsets (needed only for file protocols) 
640
 */
641
int bdrv_pread(BlockDriverState *bs, int64_t offset, 
642
               void *buf1, int count1)
643
{
644
    BlockDriver *drv = bs->drv;
645

    
646
    if (!drv)
647
        return -ENOMEDIUM;
648
    if (!drv->bdrv_pread)
649
        return bdrv_pread_em(bs, offset, buf1, count1);
650
    return drv->bdrv_pread(bs, offset, buf1, count1);
651
}
652

    
653
/** 
654
 * Write with byte offsets (needed only for file protocols) 
655
 */
656
int bdrv_pwrite(BlockDriverState *bs, int64_t offset, 
657
                const void *buf1, int count1)
658
{
659
    BlockDriver *drv = bs->drv;
660

    
661
    if (!drv)
662
        return -ENOMEDIUM;
663
    if (!drv->bdrv_pwrite)
664
        return bdrv_pwrite_em(bs, offset, buf1, count1);
665
    return drv->bdrv_pwrite(bs, offset, buf1, count1);
666
}
667

    
668
/**
669
 * Truncate file to 'offset' bytes (needed only for file protocols)
670
 */
671
int bdrv_truncate(BlockDriverState *bs, int64_t offset)
672
{
673
    BlockDriver *drv = bs->drv;
674
    if (!drv)
675
        return -ENOMEDIUM;
676
    if (!drv->bdrv_truncate)
677
        return -ENOTSUP;
678
    return drv->bdrv_truncate(bs, offset);
679
}
680

    
681
/**
682
 * Length of a file in bytes. Return < 0 if error or unknown.
683
 */
684
int64_t bdrv_getlength(BlockDriverState *bs)
685
{
686
    BlockDriver *drv = bs->drv;
687
    if (!drv)
688
        return -ENOMEDIUM;
689
    if (!drv->bdrv_getlength) {
690
        /* legacy mode */
691
        return bs->total_sectors * SECTOR_SIZE;
692
    }
693
    return drv->bdrv_getlength(bs);
694
}
695

    
696
/* return 0 as number of sectors if no device present or error */
697
void bdrv_get_geometry(BlockDriverState *bs, int64_t *nb_sectors_ptr)
698
{
699
    int64_t length;
700
    length = bdrv_getlength(bs);
701
    if (length < 0)
702
        length = 0;
703
    else
704
        length = length >> SECTOR_BITS;
705
    *nb_sectors_ptr = length;
706
}
707

    
708
/* force a given boot sector. */
709
void bdrv_set_boot_sector(BlockDriverState *bs, const uint8_t *data, int size)
710
{
711
    bs->boot_sector_enabled = 1;
712
    if (size > 512)
713
        size = 512;
714
    memcpy(bs->boot_sector_data, data, size);
715
    memset(bs->boot_sector_data + size, 0, 512 - size);
716
}
717

    
718
void bdrv_set_geometry_hint(BlockDriverState *bs, 
719
                            int cyls, int heads, int secs)
720
{
721
    bs->cyls = cyls;
722
    bs->heads = heads;
723
    bs->secs = secs;
724
}
725

    
726
void bdrv_set_type_hint(BlockDriverState *bs, int type)
727
{
728
    bs->type = type;
729
    bs->removable = ((type == BDRV_TYPE_CDROM ||
730
                      type == BDRV_TYPE_FLOPPY));
731
}
732

    
733
void bdrv_set_translation_hint(BlockDriverState *bs, int translation)
734
{
735
    bs->translation = translation;
736
}
737

    
738
void bdrv_get_geometry_hint(BlockDriverState *bs, 
739
                            int *pcyls, int *pheads, int *psecs)
740
{
741
    *pcyls = bs->cyls;
742
    *pheads = bs->heads;
743
    *psecs = bs->secs;
744
}
745

    
746
int bdrv_get_type_hint(BlockDriverState *bs)
747
{
748
    return bs->type;
749
}
750

    
751
int bdrv_get_translation_hint(BlockDriverState *bs)
752
{
753
    return bs->translation;
754
}
755

    
756
int bdrv_is_removable(BlockDriverState *bs)
757
{
758
    return bs->removable;
759
}
760

    
761
int bdrv_is_read_only(BlockDriverState *bs)
762
{
763
    return bs->read_only;
764
}
765

    
766
/* XXX: no longer used */
767
void bdrv_set_change_cb(BlockDriverState *bs, 
768
                        void (*change_cb)(void *opaque), void *opaque)
769
{
770
    bs->change_cb = change_cb;
771
    bs->change_opaque = opaque;
772
}
773

    
774
int bdrv_is_encrypted(BlockDriverState *bs)
775
{
776
    if (bs->backing_hd && bs->backing_hd->encrypted)
777
        return 1;
778
    return bs->encrypted;
779
}
780

    
781
int bdrv_set_key(BlockDriverState *bs, const char *key)
782
{
783
    int ret;
784
    if (bs->backing_hd && bs->backing_hd->encrypted) {
785
        ret = bdrv_set_key(bs->backing_hd, key);
786
        if (ret < 0)
787
            return ret;
788
        if (!bs->encrypted)
789
            return 0;
790
    }
791
    if (!bs->encrypted || !bs->drv || !bs->drv->bdrv_set_key)
792
        return -1;
793
    return bs->drv->bdrv_set_key(bs, key);
794
}
795

    
796
void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size)
797
{
798
    if (!bs->drv) {
799
        buf[0] = '\0';
800
    } else {
801
        pstrcpy(buf, buf_size, bs->drv->format_name);
802
    }
803
}
804

    
805
void bdrv_iterate_format(void (*it)(void *opaque, const char *name), 
806
                         void *opaque)
807
{
808
    BlockDriver *drv;
809

    
810
    for (drv = first_drv; drv != NULL; drv = drv->next) {
811
        it(opaque, drv->format_name);
812
    }
813
}
814

    
815
BlockDriverState *bdrv_find(const char *name)
816
{
817
    BlockDriverState *bs;
818

    
819
    for (bs = bdrv_first; bs != NULL; bs = bs->next) {
820
        if (!strcmp(name, bs->device_name))
821
            return bs;
822
    }
823
    return NULL;
824
}
825

    
826
void bdrv_iterate(void (*it)(void *opaque, const char *name), void *opaque)
827
{
828
    BlockDriverState *bs;
829

    
830
    for (bs = bdrv_first; bs != NULL; bs = bs->next) {
831
        it(opaque, bs->device_name);
832
    }
833
}
834

    
835
const char *bdrv_get_device_name(BlockDriverState *bs)
836
{
837
    return bs->device_name;
838
}
839

    
840
void bdrv_flush(BlockDriverState *bs)
841
{
842
    if (bs->drv->bdrv_flush)
843
        bs->drv->bdrv_flush(bs);
844
    if (bs->backing_hd)
845
        bdrv_flush(bs->backing_hd);
846
}
847

    
848
void bdrv_info(void)
849
{
850
    BlockDriverState *bs;
851

    
852
    for (bs = bdrv_first; bs != NULL; bs = bs->next) {
853
        term_printf("%s:", bs->device_name);
854
        term_printf(" type=");
855
        switch(bs->type) {
856
        case BDRV_TYPE_HD:
857
            term_printf("hd");
858
            break;
859
        case BDRV_TYPE_CDROM:
860
            term_printf("cdrom");
861
            break;
862
        case BDRV_TYPE_FLOPPY:
863
            term_printf("floppy");
864
            break;
865
        }
866
        term_printf(" removable=%d", bs->removable);
867
        if (bs->removable) {
868
            term_printf(" locked=%d", bs->locked);
869
        }
870
        if (bs->drv) {
871
            term_printf(" file=%s", bs->filename);
872
            if (bs->backing_file[0] != '\0')
873
                term_printf(" backing_file=%s", bs->backing_file);
874
            term_printf(" ro=%d", bs->read_only);
875
            term_printf(" drv=%s", bs->drv->format_name);
876
            if (bs->encrypted)
877
                term_printf(" encrypted");
878
        } else {
879
            term_printf(" [not inserted]");
880
        }
881
        term_printf("\n");
882
    }
883
}
884

    
885
void bdrv_get_backing_filename(BlockDriverState *bs, 
886
                               char *filename, int filename_size)
887
{
888
    if (!bs->backing_hd) {
889
        pstrcpy(filename, filename_size, "");
890
    } else {
891
        pstrcpy(filename, filename_size, bs->backing_file);
892
    }
893
}
894

    
895
int bdrv_write_compressed(BlockDriverState *bs, int64_t sector_num, 
896
                          const uint8_t *buf, int nb_sectors)
897
{
898
    BlockDriver *drv = bs->drv;
899
    if (!drv)
900
        return -ENOMEDIUM;
901
    if (!drv->bdrv_write_compressed)
902
        return -ENOTSUP;
903
    return drv->bdrv_write_compressed(bs, sector_num, buf, nb_sectors);
904
}
905
    
906
int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
907
{
908
    BlockDriver *drv = bs->drv;
909
    if (!drv)
910
        return -ENOMEDIUM;
911
    if (!drv->bdrv_get_info)
912
        return -ENOTSUP;
913
    memset(bdi, 0, sizeof(*bdi));
914
    return drv->bdrv_get_info(bs, bdi);
915
}
916

    
917
/**************************************************************/
918
/* handling of snapshots */
919

    
920
int bdrv_snapshot_create(BlockDriverState *bs, 
921
                         QEMUSnapshotInfo *sn_info)
922
{
923
    BlockDriver *drv = bs->drv;
924
    if (!drv)
925
        return -ENOMEDIUM;
926
    if (!drv->bdrv_snapshot_create)
927
        return -ENOTSUP;
928
    return drv->bdrv_snapshot_create(bs, sn_info);
929
}
930

    
931
int bdrv_snapshot_goto(BlockDriverState *bs, 
932
                       const char *snapshot_id)
933
{
934
    BlockDriver *drv = bs->drv;
935
    if (!drv)
936
        return -ENOMEDIUM;
937
    if (!drv->bdrv_snapshot_goto)
938
        return -ENOTSUP;
939
    return drv->bdrv_snapshot_goto(bs, snapshot_id);
940
}
941

    
942
int bdrv_snapshot_delete(BlockDriverState *bs, const char *snapshot_id)
943
{
944
    BlockDriver *drv = bs->drv;
945
    if (!drv)
946
        return -ENOMEDIUM;
947
    if (!drv->bdrv_snapshot_delete)
948
        return -ENOTSUP;
949
    return drv->bdrv_snapshot_delete(bs, snapshot_id);
950
}
951

    
952
int bdrv_snapshot_list(BlockDriverState *bs, 
953
                       QEMUSnapshotInfo **psn_info)
954
{
955
    BlockDriver *drv = bs->drv;
956
    if (!drv)
957
        return -ENOMEDIUM;
958
    if (!drv->bdrv_snapshot_list)
959
        return -ENOTSUP;
960
    return drv->bdrv_snapshot_list(bs, psn_info);
961
}
962

    
963
#define NB_SUFFIXES 4
964

    
965
char *get_human_readable_size(char *buf, int buf_size, int64_t size)
966
{
967
    static const char suffixes[NB_SUFFIXES] = "KMGT";
968
    int64_t base;
969
    int i;
970

    
971
    if (size <= 999) {
972
        snprintf(buf, buf_size, "%" PRId64, size);
973
    } else {
974
        base = 1024;
975
        for(i = 0; i < NB_SUFFIXES; i++) {
976
            if (size < (10 * base)) {
977
                snprintf(buf, buf_size, "%0.1f%c", 
978
                         (double)size / base,
979
                         suffixes[i]);
980
                break;
981
            } else if (size < (1000 * base) || i == (NB_SUFFIXES - 1)) {
982
                snprintf(buf, buf_size, "%" PRId64 "%c", 
983
                         ((size + (base >> 1)) / base),
984
                         suffixes[i]);
985
                break;
986
            }
987
            base = base * 1024;
988
        }
989
    }
990
    return buf;
991
}
992

    
993
char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn)
994
{
995
    char buf1[128], date_buf[128], clock_buf[128];
996
    struct tm tm;
997
    time_t ti;
998
    int64_t secs;
999

    
1000
    if (!sn) {
1001
        snprintf(buf, buf_size, 
1002
                 "%-10s%-20s%7s%20s%15s", 
1003
                 "ID", "TAG", "VM SIZE", "DATE", "VM CLOCK");
1004
    } else {
1005
        ti = sn->date_sec;
1006
#ifndef _WIN32
1007
        localtime_r(&ti, &tm);
1008
#endif
1009
        strftime(date_buf, sizeof(date_buf),
1010
                 "%Y-%m-%d %H:%M:%S", &tm);
1011
        secs = sn->vm_clock_nsec / 1000000000;
1012
        snprintf(clock_buf, sizeof(clock_buf),
1013
                 "%02d:%02d:%02d.%03d",
1014
                 (int)(secs / 3600),
1015
                 (int)((secs / 60) % 60),
1016
                 (int)(secs % 60), 
1017
                 (int)((sn->vm_clock_nsec / 1000000) % 1000));
1018
        snprintf(buf, buf_size,
1019
                 "%-10s%-20s%7s%20s%15s", 
1020
                 sn->id_str, sn->name,
1021
                 get_human_readable_size(buf1, sizeof(buf1), sn->vm_state_size),
1022
                 date_buf,
1023
                 clock_buf);
1024
    }
1025
    return buf;
1026
}
1027

    
1028

    
1029
/**************************************************************/
1030
/* async I/Os */
1031

    
1032
BlockDriverAIOCB *bdrv_aio_read(BlockDriverState *bs, int64_t sector_num,
1033
                                uint8_t *buf, int nb_sectors,
1034
                                BlockDriverCompletionFunc *cb, void *opaque)
1035
{
1036
    BlockDriver *drv = bs->drv;
1037

    
1038
    if (!drv)
1039
        return NULL;
1040
    
1041
    /* XXX: we assume that nb_sectors == 0 is suppored by the async read */
1042
    if (sector_num == 0 && bs->boot_sector_enabled && nb_sectors > 0) {
1043
        memcpy(buf, bs->boot_sector_data, 512);
1044
        sector_num++;
1045
        nb_sectors--;
1046
        buf += 512;
1047
    }
1048

    
1049
    return drv->bdrv_aio_read(bs, sector_num, buf, nb_sectors, cb, opaque);
1050
}
1051

    
1052
BlockDriverAIOCB *bdrv_aio_write(BlockDriverState *bs, int64_t sector_num,
1053
                                 const uint8_t *buf, int nb_sectors,
1054
                                 BlockDriverCompletionFunc *cb, void *opaque)
1055
{
1056
    BlockDriver *drv = bs->drv;
1057

    
1058
    if (!drv)
1059
        return NULL;
1060
    if (bs->read_only)
1061
        return NULL;
1062
    if (sector_num == 0 && bs->boot_sector_enabled && nb_sectors > 0) {
1063
        memcpy(bs->boot_sector_data, buf, 512);   
1064
    }
1065

    
1066
    return drv->bdrv_aio_write(bs, sector_num, buf, nb_sectors, cb, opaque);
1067
}
1068

    
1069
void bdrv_aio_cancel(BlockDriverAIOCB *acb)
1070
{
1071
    BlockDriver *drv = acb->bs->drv;
1072

    
1073
    drv->bdrv_aio_cancel(acb);
1074
}
1075

    
1076

    
1077
/**************************************************************/
1078
/* async block device emulation */
1079

    
1080
#ifdef QEMU_TOOL
1081
static BlockDriverAIOCB *bdrv_aio_read_em(BlockDriverState *bs,
1082
        int64_t sector_num, uint8_t *buf, int nb_sectors,
1083
        BlockDriverCompletionFunc *cb, void *opaque)
1084
{
1085
    int ret;
1086
    ret = bdrv_read(bs, sector_num, buf, nb_sectors);
1087
    cb(opaque, ret);
1088
    return NULL;
1089
}
1090

    
1091
static BlockDriverAIOCB *bdrv_aio_write_em(BlockDriverState *bs,
1092
        int64_t sector_num, const uint8_t *buf, int nb_sectors,
1093
        BlockDriverCompletionFunc *cb, void *opaque)
1094
{
1095
    int ret;
1096
    ret = bdrv_write(bs, sector_num, buf, nb_sectors);
1097
    cb(opaque, ret);
1098
    return NULL;
1099
}
1100

    
1101
static void bdrv_aio_cancel_em(BlockDriverAIOCB *acb)
1102
{
1103
}
1104
#else
1105
static void bdrv_aio_bh_cb(void *opaque)
1106
{
1107
    BlockDriverAIOCBSync *acb = opaque;
1108
    acb->common.cb(acb->common.opaque, acb->ret);
1109
    qemu_aio_release(acb);
1110
}
1111

    
1112
static BlockDriverAIOCB *bdrv_aio_read_em(BlockDriverState *bs,
1113
        int64_t sector_num, uint8_t *buf, int nb_sectors,
1114
        BlockDriverCompletionFunc *cb, void *opaque)
1115
{
1116
    BlockDriverAIOCBSync *acb;
1117
    int ret;
1118

    
1119
    acb = qemu_aio_get(bs, cb, opaque);
1120
    if (!acb->bh)
1121
        acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
1122
    ret = bdrv_read(bs, sector_num, buf, nb_sectors);
1123
    acb->ret = ret;
1124
    qemu_bh_schedule(acb->bh);
1125
    return &acb->common;
1126
}
1127

    
1128
static BlockDriverAIOCB *bdrv_aio_write_em(BlockDriverState *bs,
1129
        int64_t sector_num, const uint8_t *buf, int nb_sectors,
1130
        BlockDriverCompletionFunc *cb, void *opaque)
1131
{
1132
    BlockDriverAIOCBSync *acb;
1133
    int ret;
1134

    
1135
    acb = qemu_aio_get(bs, cb, opaque);
1136
    if (!acb->bh)
1137
        acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
1138
    ret = bdrv_write(bs, sector_num, buf, nb_sectors);
1139
    acb->ret = ret;
1140
    qemu_bh_schedule(acb->bh);
1141
    return &acb->common;
1142
}
1143

    
1144
static void bdrv_aio_cancel_em(BlockDriverAIOCB *blockacb)
1145
{
1146
    BlockDriverAIOCBSync *acb = (BlockDriverAIOCBSync *)blockacb;
1147
    qemu_bh_cancel(acb->bh);
1148
    qemu_aio_release(acb);
1149
}
1150
#endif /* !QEMU_TOOL */
1151

    
1152
/**************************************************************/
1153
/* sync block device emulation */
1154

    
1155
static void bdrv_rw_em_cb(void *opaque, int ret)
1156
{
1157
    *(int *)opaque = ret;
1158
}
1159

    
1160
#define NOT_DONE 0x7fffffff
1161

    
1162
static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num, 
1163
                        uint8_t *buf, int nb_sectors)
1164
{
1165
    int async_ret;
1166
    BlockDriverAIOCB *acb;
1167

    
1168
    async_ret = NOT_DONE;
1169
    qemu_aio_wait_start();
1170
    acb = bdrv_aio_read(bs, sector_num, buf, nb_sectors, 
1171
                        bdrv_rw_em_cb, &async_ret);
1172
    if (acb == NULL) {
1173
        qemu_aio_wait_end();
1174
        return -1;
1175
    }
1176
    while (async_ret == NOT_DONE) {
1177
        qemu_aio_wait();
1178
    }
1179
    qemu_aio_wait_end();
1180
    return async_ret;
1181
}
1182

    
1183
static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
1184
                         const uint8_t *buf, int nb_sectors)
1185
{
1186
    int async_ret;
1187
    BlockDriverAIOCB *acb;
1188

    
1189
    async_ret = NOT_DONE;
1190
    qemu_aio_wait_start();
1191
    acb = bdrv_aio_write(bs, sector_num, buf, nb_sectors, 
1192
                         bdrv_rw_em_cb, &async_ret);
1193
    if (acb == NULL) {
1194
        qemu_aio_wait_end();
1195
        return -1;
1196
    }
1197
    while (async_ret == NOT_DONE) {
1198
        qemu_aio_wait();
1199
    }
1200
    qemu_aio_wait_end();
1201
    return async_ret;
1202
}
1203

    
1204
void bdrv_init(void)
1205
{
1206
    bdrv_register(&bdrv_raw);
1207
    bdrv_register(&bdrv_host_device);
1208
#ifndef _WIN32
1209
    bdrv_register(&bdrv_cow);
1210
#endif
1211
    bdrv_register(&bdrv_qcow);
1212
    bdrv_register(&bdrv_vmdk);
1213
    bdrv_register(&bdrv_cloop);
1214
    bdrv_register(&bdrv_dmg);
1215
    bdrv_register(&bdrv_bochs);
1216
    bdrv_register(&bdrv_vpc);
1217
    bdrv_register(&bdrv_vvfat);
1218
    bdrv_register(&bdrv_qcow2);
1219
}
1220

    
1221
void *qemu_aio_get(BlockDriverState *bs, BlockDriverCompletionFunc *cb,
1222
                   void *opaque)
1223
{
1224
    BlockDriver *drv;
1225
    BlockDriverAIOCB *acb;
1226

    
1227
    drv = bs->drv;
1228
    if (drv->free_aiocb) {
1229
        acb = drv->free_aiocb;
1230
        drv->free_aiocb = acb->next;
1231
    } else {
1232
        acb = qemu_mallocz(drv->aiocb_size);
1233
        if (!acb)
1234
            return NULL;
1235
    }
1236
    acb->bs = bs;
1237
    acb->cb = cb;
1238
    acb->opaque = opaque;
1239
    return acb;
1240
}
1241

    
1242
void qemu_aio_release(void *p)
1243
{
1244
    BlockDriverAIOCB *acb = p;
1245
    BlockDriver *drv = acb->bs->drv;
1246
    acb->next = drv->free_aiocb;
1247
    drv->free_aiocb = acb;
1248
}
1249

    
1250
/**************************************************************/
1251
/* removable device support */
1252

    
1253
/**
1254
 * Return TRUE if the media is present
1255
 */
1256
int bdrv_is_inserted(BlockDriverState *bs)
1257
{
1258
    BlockDriver *drv = bs->drv;
1259
    int ret;
1260
    if (!drv)
1261
        return 0;
1262
    if (!drv->bdrv_is_inserted)
1263
        return 1;
1264
    ret = drv->bdrv_is_inserted(bs);
1265
    return ret;
1266
}
1267

    
1268
/**
1269
 * Return TRUE if the media changed since the last call to this
1270
 * function. It is currently only used for floppy disks 
1271
 */
1272
int bdrv_media_changed(BlockDriverState *bs)
1273
{
1274
    BlockDriver *drv = bs->drv;
1275
    int ret;
1276

    
1277
    if (!drv || !drv->bdrv_media_changed)
1278
        ret = -ENOTSUP;
1279
    else
1280
        ret = drv->bdrv_media_changed(bs);
1281
    if (ret == -ENOTSUP)
1282
        ret = bs->media_changed;
1283
    bs->media_changed = 0;
1284
    return ret;
1285
}
1286

    
1287
/**
1288
 * If eject_flag is TRUE, eject the media. Otherwise, close the tray
1289
 */
1290
void bdrv_eject(BlockDriverState *bs, int eject_flag)
1291
{
1292
    BlockDriver *drv = bs->drv;
1293
    int ret;
1294

    
1295
    if (!drv || !drv->bdrv_eject) {
1296
        ret = -ENOTSUP;
1297
    } else {
1298
        ret = drv->bdrv_eject(bs, eject_flag);
1299
    }
1300
    if (ret == -ENOTSUP) {
1301
        if (eject_flag)
1302
            bdrv_close(bs);
1303
    }
1304
}
1305

    
1306
int bdrv_is_locked(BlockDriverState *bs)
1307
{
1308
    return bs->locked;
1309
}
1310

    
1311
/**
1312
 * Lock or unlock the media (if it is locked, the user won't be able
1313
 * to eject it manually).
1314
 */
1315
void bdrv_set_locked(BlockDriverState *bs, int locked)
1316
{
1317
    BlockDriver *drv = bs->drv;
1318

    
1319
    bs->locked = locked;
1320
    if (drv && drv->bdrv_set_locked) {
1321
        drv->bdrv_set_locked(bs, locked);
1322
    }
1323
}