Thx
I try this operation.
Operation successful.
but qemu-1.4.1 can't patched.
Attached please find a patch.
if possible this patch commit upstream.
thx for reading.
2011-05-16 (月) の 18:28 +0900 に MORITA Kazutaka さんは書きました:
> At Mon, 16 May 2011 15:20:55 +0900,
> igoigo246 wrote:
> >
> > For example
> >
> > qemu-img create sheepdog:Device 10G OK.
> >
> > But I want to Pararel Distributed Block Device.
> >
> > SheepDog are two possibilities that qemu-img and pararel distributed
> > blocking device.
> >
> > Please make linux client for SheepDog.
>
> Currently, there is no direct support for any client other than QEMU,
> but there are some means to export Sheepdog volumes using more general
> protocols.
>
> - iSCSI
> 1. Apply a patch to support data preallocation:
> http://lists.wpkg.org/pipermail/sheepdog/2010-October/000706.html
>
> 2. Create a image with data preallocation.
> $ qemu-img create sheepdog:image -o preallocation=data 1G
>
> 3. Install iSCSI target daemon (tgt) with Sheepdog support
> $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/tomo/tgt.git
> -b sheepdog
> $ cd tgt
> $ make
> # make install
>
> 4. Setup tgt
> # tgtd
> # tgtadm --op new --mode target --tid 1 --lld iscsi -T
> iqn.2001-04.com.example:storage.sr.rose.sys1.xyz
> # tgtadm --op new --mode logicalunit --tid 1 --lun 1 -b image --bstype
> sheepdog
>
> See also http://www.mail-archive.com/[email protected]/msg00679.html
>
> - NBD
> 1. Create a Sheepdog image
> $ qemu-img create sheepdog:image 4G
>
> 2. Start qemu-nbd on the one of Sheepdog servers
> $ qemu-nbd sheepdog:image
>
> The image is exported on port 10809
>
>
> Thanks,
>
> Kazutaka
diff -Nru qemu.org/block/sheepdog.c qemu/block/sheepdog.c
--- qemu.org/block/sheepdog.c 2011-05-16 20:31:15.000000000 +0900
+++ qemu/block/sheepdog.c 2011-05-16 20:39:46.000000000 +0900
@@ -1292,12 +1292,65 @@
return 0;
}
+static int sd_prealloc(uint32_t vid, int64_t vdi_size)
+{
+ int fd, ret;
+ SheepdogInode *inode;
+ char *buf;
+ unsigned long idx, max_idx;
+
+ fd = connect_to_sdog(NULL, NULL);
+ if (fd < 0) {
+ return -EIO;
+ }
+
+ inode = qemu_malloc(sizeof(*inode));
+ buf = qemu_malloc(SD_DATA_OBJ_SIZE);
+
+ ret = read_object(fd, (char *)inode, vid_to_vdi_oid(vid),
+ 0, sizeof(*inode), 0);
+
+ max_idx = (vdi_size + SD_DATA_OBJ_SIZE - 1) / SD_DATA_OBJ_SIZE;
+
+ for (idx = 0; idx < max_idx; idx++) {
+ uint64_t oid;
+ oid = vid_to_data_oid(vid, idx);
+
+ if (inode->data_vdi_id[idx]) {
+ ret = read_object(fd, buf, vid_to_vdi_oid(inode->data_vdi_id[idx]),
+ 1, SD_DATA_OBJ_SIZE, 0);
+ if (ret)
+ goto out;
+ } else {
+ memset(buf, 0, SD_DATA_OBJ_SIZE);
+ }
+
+ ret = write_object(fd, buf, oid, 1, SD_DATA_OBJ_SIZE, 0, 1);
+ if (ret)
+ goto out;
+
+ inode->data_vdi_id[idx] = vid;
+ ret = write_object(fd, (char *)inode, vid_to_vdi_oid(vid),
+ 1, sizeof(*inode), 0, 0);
+ if (ret)
+ goto out;
+ }
+out:
+ free(inode);
+ free(buf);
+ closesocket(fd);
+
+ return ret;
+}
+
+
static int sd_create(const char *filename, QEMUOptionParameter *options)
{
int ret;
uint32_t vid = 0, base_vid = 0;
int64_t vdi_size = 0;
char *backing_file = NULL;
+ int prealloc = 0;
BDRVSheepdogState s;
char vdi[SD_MAX_VDI_LEN], tag[SD_MAX_VDI_TAG_LEN];
uint32_t snapid;
@@ -1317,7 +1370,18 @@
vdi_size = options->value.n;
} else if (!strcmp(options->name, BLOCK_OPT_BACKING_FILE)) {
backing_file = options->value.s;
- }
+ } else if (!strcmp(options->name, BLOCK_OPT_PREALLOC)) {
+ if (!options->value.s || !strcmp(options->value.s, "off")) {
+ prealloc = 0;
+ } else if (!strcmp(options->value.s, "data")) {
+ prealloc = 1;
+ } else {
+ error_report("Invalid preallocation mode: '%s'\n",
+ options->value.s);
+ return -EINVAL;
+ }
+
+ }
options++;
}
@@ -1353,8 +1417,12 @@
base_vid = s->inode.vdi_id;
bdrv_delete(bs);
}
+ ret = do_sd_create((char *)filename, vdi_size, base_vid, &vid, 0, NULL, NULL);
+ if (!prealloc || ret)
+ return ret;
+
+ return sd_prealloc(vid, vdi_size);
- return do_sd_create((char *)vdi, vdi_size, base_vid, &vid, 0, s.addr, s.port);
}
static void sd_close(BlockDriverState *bs)
@@ -1990,6 +2058,11 @@
.type = OPT_STRING,
.help = "File name of a base image"
},
+ {
+ .name = BLOCK_OPT_PREALLOC,
+ .type = OPT_STRING,
+ .help = "Preallocation mode (allowed values: off, data)"
+ },
{ NULL }
};
--
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog