Initial support for target names
authorStratos Psomadakis <psomas@grnet.gr>
Sun, 8 Jan 2012 17:11:18 +0000 (19:11 +0200)
committerStratos Psomadakis <psomas@grnet.gr>
Sun, 8 Jan 2012 17:11:18 +0000 (19:11 +0200)
blockd will now only accept requests based on the target name (ie only for the
file it has opened), and will return an XS_ERROR reqeust otherwise.

xsegbd will now take a target name as an argument when adding a device via
sysfs, and will use that name as the target name for all the subsequent requests
fot that device.

xseg/peers/blockd.c
xseg/peers/xseg-tool.c
xseg/sys/xsegbd.c
xseg/sys/xsegbd.h

index cbdd1e3..7670474 100644 (file)
@@ -12,6 +12,8 @@
 
 #include <xseg/xseg.h>
 
+#define TARGET_NAMELEN 128
+
 static int usage(void)
 {
        printf("Usage: ./blockd <path_to_disk_image> [options]\n"
@@ -33,7 +35,8 @@ struct store {
        struct xseg_port *xport;
        uint32_t portno;
        int fd;
-       off_t size;
+       char name[TARGET_NAMELEN];
+       uint64_t size;
        struct io *ios;
        struct xq free_ops;
        char *free_bufs;
@@ -209,8 +212,14 @@ static void handle_info(struct store *store, struct io *io)
 {
        struct xseg_request *req = io->req;
 
-       *((off_t *) req->data) = store->size;
-       req->datasize = sizeof(store->size);
+       if (strcmp(req->name, store->name)) {
+               fail(store, io);
+               return;
+       }
+
+       *((uint64_t *) req->data) = store->size;
+       req->serviced = req->datasize = sizeof(store->size);
+       io->retval = io->cb.aio_offset = io->cb.aio_nbytes = req->datasize;
 
        complete(store, io);
 }
@@ -317,6 +326,7 @@ static int blockd(char *path, off_t size, uint32_t nr_ops,
                return -1;
        }
 
+       strncpy(store->name, path, TARGET_NAMELEN);
        store->fd = open(path, O_RDWR);
        while (store->fd < 0) {
                if (errno == ENOENT && size)
@@ -333,7 +343,7 @@ static int blockd(char *path, off_t size, uint32_t nr_ops,
                        perror(path);
                        return r;
                }
-               size = stat.st_size;
+               size = (uint64_t) stat.st_size;
                if (size == 0) {
                        fprintf(stderr, "size cannot be zero\n");
                        return -1;
@@ -409,7 +419,7 @@ malloc_fail:
 int main(int argc, char **argv)
 {
        char *path, *spec = "";
-       off_t size;
+       uint64_t size;
        int i;
        long portno;
        uint32_t nr_ops;
index a5b78f2..4e7224d 100644 (file)
@@ -191,7 +191,7 @@ void report_request(struct xseg_request *req)
 int cmd_info(char *name)
 {
        uint32_t namesize = strlen(name);
-       size_t size = sizeof(off_t);
+       size_t size = sizeof(uint64_t);
        int r;
        xserial srl;
        struct xseg_request *req;
index c90b44f..c08a9d4 100644 (file)
@@ -31,7 +31,7 @@ MODULE_LICENSE("GPL");
 static long sector_size = 0;
 static long blksize = 512;
 static int major = 0;
-static char name[XSEGBD_VOLUME_NAMELEN] = "xsegbd";
+static char name[XSEGBD_SEGMENT_NAMELEN] = "xsegbd";
 static char spec[256] = "xsegdev:xsegbd:4:512:64:1024:12";
 
 module_param(sector_size, long, 0644);
@@ -312,7 +312,7 @@ int xsegbd_xseg_init(void)
        int r;
 
        if (!xsegbd.name[0])
-               strncpy(xsegbd.name, name, XSEGBD_VOLUME_NAMELEN);
+               strncpy(xsegbd.name, name, XSEGBD_SEGMENT_NAMELEN);
 
        XSEGLOG("registering xseg types");
        xsegbd.namesize = strlen(xsegbd.name);
@@ -599,11 +599,11 @@ static void xseg_request_fn(struct request_queue *rq)
 
 
                datasize = blk_rq_bytes(blkreq);
-               BUG_ON(xreq->buffersize - xsegbd.namesize < datasize);
-               BUG_ON(xseg_prep_request(xreq, xsegbd.namesize, datasize));
+               BUG_ON(xreq->buffersize - xsegbd_dev->namesize < datasize);
+               BUG_ON(xseg_prep_request(xreq, xsegbd_dev->namesize, datasize));
 
                name = XSEG_TAKE_PTR(xreq->name, xsegbd.xseg->segment);
-               strncpy(name, xsegbd.name, xsegbd.namesize);
+               strncpy(name, xsegbd_dev->name, xsegbd_dev->namesize);
                blkreq_idx = xq_pop_head(&xsegbd_dev->blk_queue_pending);
                BUG_ON(blkreq_idx == None);
                /* WARN_ON(xsebd_dev->blk_req_pending[blkreq_idx] */
@@ -652,6 +652,10 @@ int update_dev_sectors_from_request(       struct xsegbd_device *xsegbd_dev,
                                        struct xseg_request *xreq       )
 {
        void *data;
+
+       if (xreq->state & XS_ERROR)
+               return -ENOENT;
+
        if (!(xreq->state & XS_SERVED))
                return -EIO;
 
@@ -675,14 +679,14 @@ static int xsegbd_get_size(struct xsegbd_device *xsegbd_dev)
 
        datasize = sizeof(uint64_t);
        BUG_ON((uint64_t)&comp < xsegbd_dev->nr_requests);
-       BUG_ON(xreq->buffersize - xsegbd.namesize < datasize);
-       BUG_ON(xseg_prep_request(xreq, xsegbd.namesize, datasize));
+       BUG_ON(xreq->buffersize - xsegbd_dev->namesize < datasize);
+       BUG_ON(xseg_prep_request(xreq, xsegbd_dev->namesize, datasize));
 
        init_completion(&comp);
        xreq->priv = (uint64_t)(long)&comp;
 
        name = XSEG_TAKE_PTR(xreq->name, xsegbd.xseg->segment);
-       strncpy(name, xsegbd.name, xsegbd.namesize);
+       strncpy(name, xsegbd_dev->name, xsegbd_dev->namesize);
        xreq->size = datasize;
        xreq->offset = 0;
 
@@ -905,10 +909,13 @@ static ssize_t xsegbd_add(struct bus_type *bus, const char *buf, size_t count)
        INIT_LIST_HEAD(&xsegbd_dev->node);
 
        /* parse cmd */
-       if (sscanf(buf, "%d:%d:%d", &xsegbd_dev->src_portno, &xsegbd_dev->dst_portno, &xsegbd_dev->nr_requests) < 3) {
+       if (sscanf(buf, "%" __stringify(XSEGBD_TARGET_NAMELEN) "s "
+                       "%d:%d:%d", xsegbd_dev->name, &xsegbd_dev->src_portno,
+                       &xsegbd_dev->dst_portno, &xsegbd_dev->nr_requests) < 3) {
                ret = -EINVAL;
                goto out_dev;
        }
+       xsegbd_dev->namesize = strlen(xsegbd_dev->name);
 
        mutex_lock_nested(&xsegbd_mutex, SINGLE_DEPTH_NESTING);
 
index fbdb01d..2348598 100644 (file)
@@ -6,7 +6,8 @@
 #define XSEGLOG_PREFIX KERN_INFO XSEGBD_NAME ": "
 #define XSEGLOG(message, args...) printk(XSEGLOG_PREFIX message "\n", ##args)
 
-#define XSEGBD_VOLUME_NAMELEN 32
+#define XSEGBD_SEGMENT_NAMELEN 32
+#define XSEGBD_TARGET_NAMELEN 128
 
 #include <linux/kernel.h>
 #include <linux/types.h>
@@ -14,7 +15,7 @@
 #include <xq/xq.h>
 
 struct xsegbd {
-       char name[XSEGBD_VOLUME_NAMELEN];
+       char name[XSEGBD_SEGMENT_NAMELEN];
        uint32_t namesize;
        struct xseg_config config;
        struct xseg *xseg;
@@ -35,6 +36,8 @@ struct xsegbd_device {
        struct request **blk_req_pending;
        struct device dev;
        struct list_head node;
+       char name[XSEGBD_TARGET_NAMELEN];
+       uint32_t namesize;
 };
 
 #endif