]> xenbits.xensource.com Git - people/dstodden/blktap.git/commitdiff
CA-10471: Forward R/O flags to blktap.
authorDaniel Stodden <daniel.stodden@citrix.com>
Thu, 27 Jan 2011 21:36:54 +0000 (13:36 -0800)
committerDaniel Stodden <daniel.stodden@citrix.com>
Thu, 27 Jan 2011 21:36:54 +0000 (13:36 -0800)
Switch to newer blktap_device_info params:

 * Call a new ioctl command.

 * On legacy kernels, fall back to the old entry

 * Set flags for disk R/O-mode.

 * Set physical_sector_size (512, still).

Signed-off-by: Daniel Stodden <daniel.stodden@citrix.com>
drivers/tapdisk-control.c
include/blktap.h

index cc0f0a7409aa250d5c4a470273dbd9e8f75738fc..dca25b2984e5da7f7207d2943d0dde2fb06b90b6 100644 (file)
@@ -589,7 +589,6 @@ tapdisk_control_attach_vbd(struct tapdisk_ctl_conn *conn,
        tapdisk_message_t response;
        char *devname;
        td_vbd_t *vbd;
-       struct blktap2_params params;
        image_t image;
        int minor, err;
 
@@ -690,7 +689,7 @@ tapdisk_control_open_image(struct tapdisk_ctl_conn *conn,
        td_vbd_t *vbd;
        td_flag_t flags;
        tapdisk_message_t response;
-       struct blktap2_params params;
+       struct blktap_device_info info;
        const char *path, *secondary_path;
 
        vbd = tapdisk_server_get_vbd(request->cookie);
@@ -755,12 +754,30 @@ tapdisk_control_open_image(struct tapdisk_ctl_conn *conn,
        if (err)
                goto fail_close;
 
-       params.capacity = image.size;
-       params.sector_size = image.secsize;
-       snprintf(params.name, sizeof(params.name) - 1,
-                "%s", request->u.params.path);
-
-       err = ioctl(vbd->ring.fd, BLKTAP2_IOCTL_CREATE_DEVICE, &params);
+       memset(&info, 0, sizeof(info));
+       info.capacity = image.size;
+       info.sector_size = image.secsize;
+       info.physical_sector_size = image.secsize;
+       info.flags  = 0;
+       info.flags |= flags & TD_OPEN_RDONLY ? BLKTAP_DEVICE_RO : 0;
+
+       err = ioctl(vbd->ring.fd, BLKTAP2_IOCTL_CREATE_DEVICE, &info);
+#ifdef BLKTAP_IOCTL_COMPAT_CREATE_DEVICE
+#ifndef ENOIOCTLCMD
+#define ENOIOCTLCMD 515
+#endif
+       if (err && (errno == ENOTTY || errno == ENOIOCTLCMD)) {
+               struct blktap2_params params;
+               memset(&params, 0, sizeof(params));
+               params.capacity    = info.capacity;
+               params.sector_size = info.sector_size;
+               err = ioctl(vbd->ring.fd, BLKTAP_IOCTL_COMPAT_CREATE_DEVICE, &params);
+               if (!err && info.flags)
+                       EPRINTF("create device: using compat ioctl(%d),"
+                               " flags (%#x) dropped.",
+                               BLKTAP_IOCTL_COMPAT_CREATE_DEVICE, flags);
+       }
+#endif
        if (err && errno != EEXIST) {
                err = -errno;
                EPRINTF("create device failed: %d\n", err);
index ca8fe00b6ad5a7d2dda1b8e1d24fcc7bdd697ef8..0d0865711f00e3d05bfb382a655eca0351429fa5 100644 (file)
@@ -54,10 +54,8 @@ typedef blktap_sring_t     blkif_sring_t;
 typedef blktap_back_ring_t blkif_back_ring_t;
 typedef blktap_ring_req_t  blkif_request_t;
 typedef blktap_ring_rsp_t  blkif_response_t;
-#define blktap2_params blktap_device_info
 
 #define blkif_request_segment blktap_segment
-#define blktap_params blktap_device_info
 
 #define BLKIF_OP_WRITE  BLKTAP_OP_WRITE
 #define BLKIF_OP_READ   BLKTAP_OP_READ