this patch against for qemu-0.10.5, it's also for xen unstable.
  --- If BDRV_O_FILE not set in flags, it doesn't means O_RDWR, the O_RDONLY in flags should be useful.
  Signed-off-by: Wei Kong <weikong.cn@gmail.com> 
 diff -uNrp qemu-0.10.5/block.c qemu-0.10.5.new/block.c --- qemu-0.10.5/block.c 2009-05-21 04:46:58.000000000 +0800 +++ qemu-0.10.5.new/block.c     2009-06-01 10:30:42.000000000 +0800 @@ -393,12 +393,13 @@ int bdrv_open2(BlockDriverState *bs, con 
     }      bs->drv = drv;      bs->opaque = qemu_mallocz(drv->instance_size); -    /* Note: for compatibility, we open disk image files as RDWR, and -       RDONLY as fallback */      if (!(flags & BDRV_O_FILE)) 
-        open_flags = BDRV_O_RDWR | (flags & BDRV_O_CACHE_MASK); +        open_flags = flags & BDRV_O_CACHE_MASK;      else          open_flags = flags & ~(BDRV_O_FILE | BDRV_O_SNAPSHOT); +    if (!(open_flags & BDRV_O_RDWR)) 
+        bs->read_only = 1; +      ret = drv->bdrv_open(bs, filename, open_flags);      if ((ret == -EACCES || ret == -EPERM) && !(flags & BDRV_O_FILE)) {          ret = drv->bdrv_open(bs, filename, open_flags & ~BDRV_O_RDWR); 
diff -uNrp qemu-0.10.5/hw/usb-msd.c qemu-0.10.5.new/hw/usb-msd.c --- qemu-0.10.5/hw/usb-msd.c    2009-05-21 04:46:59.000000000 +0800 +++ qemu-0.10.5.new/hw/usb-msd.c        2009-06-01 10:14:17.000000000 +0800 @@ -551,7 +551,7 @@ USBDevice *usb_msd_init(const char *file 
     s = qemu_mallocz(sizeof(MSDState));
       bdrv = bdrv_new("usb"); -    if (bdrv_open2(bdrv, filename, 0, drv) < 0) +    if (bdrv_open2(bdrv, filename, BDRV_O_RDWR, drv) < 0)          goto fail; 
     s->bs = bdrv;      *pbs = bdrv; diff -uNrp qemu-0.10.5/qemu-img.c qemu-0.10.5.new/qemu-img.c --- qemu-0.10.5/qemu-img.c      2009-05-21 04:47:00.000000000 +0800 +++ qemu-0.10.5.new/qemu-img.c  2009-06-01 10:28:46.000000000 +0800 
@@ -32,7 +32,7 @@  #endif
   /* Default to cache=writeback as data integrity is not important for qemu-tcg. */ -#define BRDV_O_FLAGS BDRV_O_CACHE_WB +#define BDRV_O_FLAGS BDRV_O_CACHE_WB
   static void QEMU_NORETURN error(const char *fmt, ...) 
 { @@ -185,7 +185,7 @@ static int read_password(char *buf, int  #endif
   static BlockDriverState *bdrv_new_open(const char *filename, -                                       const char *fmt) +                                       const char *fmt, int flags) 
 {      BlockDriverState *bs;      BlockDriver *drv; @@ -201,7 +201,7 @@ static BlockDriverState *bdrv_new_open(c      } else {          drv = NULL;      } -    if (bdrv_open2(bs, filename, BRDV_O_FLAGS, drv) < 0) { 
+    if (bdrv_open2(bs, filename, flags, drv) < 0) {          error("Could not open '%s'", filename);      }      if (bdrv_is_encrypted(bs)) { @@ -253,7 +253,7 @@ static int img_create(int argc, char **a 
     size = 0;      if (base_filename) {          BlockDriverState *bs; -        bs = bdrv_new_open(base_filename, NULL); +        bs = bdrv_new_open(base_filename, NULL, BDRV_O_RDWR);          bdrv_get_geometry(bs, &size); 
         size *= 512;          bdrv_delete(bs); @@ -334,7 +334,7 @@ static int img_commit(int argc, char **a      } else {          drv = NULL;      } -    if (bdrv_open2(bs, filename, BRDV_O_FLAGS, drv) < 0) { 
+    if (bdrv_open2(bs, filename, BDRV_O_FLAGS|BDRV_O_RDWR, drv) < 0) {          error("Could not open '%s'", filename);      }      ret = bdrv_commit(bs); @@ -457,7 +457,8 @@ static int img_convert(int argc, char ** 
      total_sectors = 0;      for (bs_i = 0; bs_i < bs_n; bs_i++) { -        bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt); +        bs[bs_i] = bdrv_new_open(argv[optind + bs_i], fmt,  +                                     BDRV_O_CACHE_WB|BDRV_O_RDONLY); 
         if (!bs[bs_i])              error("Could not open '%s'", argv[optind + bs_i]);          bdrv_get_geometry(bs[bs_i], &bs_sectors); @@ -487,7 +488,7 @@ static int img_convert(int argc, char ** 
         }      }
  -    out_bs = bdrv_new_open(out_filename, out_fmt); +    out_bs = bdrv_new_open(out_filename, out_fmt, BDRV_O_CACHE_WB|BDRV_O_RDWR);
       bs_i = 0;      bs_offset = 0; @@ -710,7 +711,7 @@ static int img_info(int argc, char **arg 
     } else {          drv = NULL;      } -    if (bdrv_open2(bs, filename, BRDV_O_FLAGS, drv) < 0) { +    if (bdrv_open2(bs, filename, BDRV_O_FLAGS|BDRV_O_RDONLY, drv) < 0) {          error("Could not open '%s'", filename); 
     }      bdrv_get_format(bs, fmt_name, sizeof(fmt_name)); @@ -814,7 +815,7 @@ static void img_snapshot(int argc, char      if (!bs)          error("Not enough memory");
  -    if (bdrv_open2(bs, filename, 0, NULL) < 0) { 
+    if (bdrv_open2(bs, filename, BDRV_O_RDWR, NULL) < 0) {          error("Could not open '%s'", filename);      }
 
  
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
 
 |