[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 01/10] blktap: Add include/linux/blktap.h
On Wed, 2011-03-09 at 22:37 +0000, Daniel Stodden wrote: > On Wed, 2011-03-09 at 05:18 -0500, Ian Campbell wrote: > > On Wed, 2011-03-09 at 00:42 +0000, Daniel Stodden wrote: > > > Moves blktap2 definitions into a common header file. > > > > > > Includes xen/interface/io/ring.h and new ring definitions. Makes > > > blktap build independently from xen-devel headers. > > > > > > New blktap_ring structs are fully congrent to blkif rings, for binary > > > compat. > > > > > > Signed-off-by: Daniel Stodden <daniel.stodden@xxxxxxxxxx> > > > --- > > > drivers/xen/blktap/blktap.h | 66 ++++---------------------------- > > > drivers/xen/blktap/control.c | 14 +++--- > > > drivers/xen/blktap/device.c | 12 +++--- > > > drivers/xen/blktap/request.c | 8 ++-- > > > drivers/xen/blktap/ring.c | 51 ++++++++++++++----------- > > > drivers/xen/blktap/sysfs.c | 6 +- > > > include/linux/blktap.h | 85 > > > ++++++++++++++++++++++++++++++++++++++++++ > > > > This new file defines the kernel<->user (tapdisk process) ring protocol, > > right? > > Yes. It's exactly as far as I can go right now maintaining > compatibility. The main objective was rather to get off xen-devel > headers in favour of kernel sources. > > - includes xen/interface/io/ring. > - doesn't include xen/interface/io/blkif. > - certainly doesn't include xen/interface/blkif.h > (the alignment stuff for guests). > > The old code used blkif and struct blkif_* definitions. The new one got > it's own struct blktap_*s, identical as far as READ/WRITE commands go. > > But this also means one can develop the userland stuff independently > from blkif.h. New commands (flush, trim, ...) get quite a bit more > useful freedom. > > > I think its proper home would be under include/xen somewhere, which is > > where the gntdev and evtchn etc driver interfaces are defined. > > A very long time ago, a somewhat obvious choice was made to use xen ring > headers for the blktap user <-> kernel interface. So this header > presently still wants xen/interface. > > It doesn't depend on anything xenish, nor is this a Xen driver anymore. > I thought even with that header dependency, that's somewhat a > linux/blktap.h already, so I made it so. OK. > I'm feeling some heat from boston-newxen people because in XCP I'm > actually building blktap.hg against the kernel devel rpm contents right > now. That's got to vanish. It's great for hacking extensions, but the > component dependency is a bit gross, admittedly. Sure, but you could build against a copy of the kernel source tree, which would remove the dependency on the kernel binary RPMs. > Once doing so, it's a standalone kernel blktap.h which can be copied > over into userland trees, without additional definitions included. If the other user of this interface is the tapdisk userspace, but that includes a copy of the interface header (note: I'm not convinced that is a good idea) then I think the right place for this copy of the header is drivers/block/blktap/. If on the other hand userland is building against this exact header then include/linux is probably right given that the driver has no Xen dependency. > This isn't sick: Blktap2 doesn't need the full ring.h macro contents > with memory barriers etc anyway, because the userland dispatching is > synchronous. It could be just bare structs, and the standard PUSH/PULL > macros are rather decoration and could be dropped (or reimplemented as > memcpy()s). > > Will this justify linux/blktap.h? > > One could also revert that ring.h pad space hack. > > I'm not passionate about it. If you still disagree, I'll give up and we > move it elsewhere. > > In this case, it could as well go back into drivers/block/blktap, and > I'll just give up on 'development mode' hacks to verify tapdisk builds > against the kernel tree altogether. What sort of "'development mode' hacks"? > > Where is the canonical definition of this interface stored? In the > > kernel tree or the hypervisor tree? > > You mean blktap.h? This is not a xen driver. I'd call this the canonical > definition, a reference with what that kernel/driver revision supports, > that's why I put it there. > > It wouldn't belong elsewhere, except for occasionally updated verbatim > copies in updated blktap sources, to unstress build dependencies. > > Daniel > > > Ian. > > > > > 7 files changed, 142 insertions(+), 100 deletions(-) > > > create mode 100644 include/linux/blktap.h > > > > > > diff --git a/drivers/xen/blktap/blktap.h b/drivers/xen/blktap/blktap.h > > > index fe63fc9..1318cad 100644 > > > --- a/drivers/xen/blktap/blktap.h > > > +++ b/drivers/xen/blktap/blktap.h > > > @@ -6,7 +6,7 @@ > > > #include <linux/cdev.h> > > > #include <linux/init.h> > > > #include <linux/scatterlist.h> > > > -#include <xen/blkif.h> > > > +#include <linux/blktap.h> > > > > > > extern int blktap_debug_level; > > > extern int blktap_ring_major; > > > @@ -30,74 +30,26 @@ extern int blktap_device_major; > > > #define BLKTAP_DEVICE_CLOSED 5 > > > #define BLKTAP_SHUTDOWN_REQUESTED 8 > > > > > > -/* blktap IOCTLs: */ > > > -#define BLKTAP2_IOCTL_KICK_FE 1 > > > -#define BLKTAP2_IOCTL_ALLOC_TAP 200 > > > -#define BLKTAP2_IOCTL_FREE_TAP 201 > > > -#define BLKTAP2_IOCTL_CREATE_DEVICE 202 > > > -#define BLKTAP2_IOCTL_REMOVE_DEVICE 207 > > > - > > > -#define BLKTAP2_MAX_MESSAGE_LEN 256 > > > - > > > -#define BLKTAP2_RING_MESSAGE_CLOSE 3 > > > - > > > #define BLKTAP_REQUEST_FREE 0 > > > #define BLKTAP_REQUEST_PENDING 1 > > > > > > -/* > > > - * The maximum number of requests that can be outstanding at any time > > > - * is determined by > > > - * > > > - * [mmap_alloc * MAX_PENDING_REQS * BLKIF_MAX_SEGMENTS_PER_REQUEST] > > > - * > > > - * where mmap_alloc < MAX_DYNAMIC_MEM. > > > - * > > > - * TODO: > > > - * mmap_alloc is initialised to 2 and should be adjustable on the fly via > > > - * sysfs. > > > - */ > > > -#define BLK_RING_SIZE __RING_SIZE((struct blkif_sring *)0, > > > PAGE_SIZE) > > > -#define MAX_DYNAMIC_MEM BLK_RING_SIZE > > > -#define MAX_PENDING_REQS BLK_RING_SIZE > > > -#define MMAP_PAGES (MAX_PENDING_REQS * BLKIF_MAX_SEGMENTS_PER_REQUEST) > > > -#define MMAP_VADDR(_start, _req, _seg) \ > > > - (_start + \ > > > - ((_req) * BLKIF_MAX_SEGMENTS_PER_REQUEST * PAGE_SIZE) + \ > > > - ((_seg) * PAGE_SIZE)) > > > - > > > -struct grant_handle_pair { > > > - grant_handle_t kernel; > > > - grant_handle_t user; > > > -}; > > > -#define INVALID_GRANT_HANDLE 0xFFFF > > > - > > > -struct blktap_handle { > > > - unsigned int ring; > > > - unsigned int device; > > > - unsigned int minor; > > > -}; > > > - > > > -struct blktap_params { > > > - char name[BLKTAP2_MAX_MESSAGE_LEN]; > > > - unsigned long long capacity; > > > - unsigned long sector_size; > > > -}; > > > - > > > struct blktap_device { > > > spinlock_t lock; > > > struct gendisk *gd; > > > }; > > > > > > +struct blktap_request; > > > + > > > struct blktap_ring { > > > struct task_struct *task; > > > > > > struct vm_area_struct *vma; > > > - struct blkif_front_ring ring; > > > + blktap_front_ring_t ring; > > > unsigned long ring_vstart; > > > unsigned long user_vstart; > > > > > > int n_pending; > > > - struct blktap_request *pending[MAX_PENDING_REQS]; > > > + struct blktap_request *pending[BLKTAP_RING_SIZE]; > > > > > > wait_queue_head_t poll_wait; > > > > > > @@ -128,8 +80,8 @@ struct blktap_request { > > > int operation; > > > struct timeval time; > > > > > > - struct scatterlist > > > sg_table[BLKIF_MAX_SEGMENTS_PER_REQUEST]; > > > - struct page > > > *pages[BLKIF_MAX_SEGMENTS_PER_REQUEST]; > > > + struct scatterlist sg_table[BLKTAP_SEGMENT_MAX]; > > > + struct page *pages[BLKTAP_SEGMENT_MAX]; > > > int nr_pages; > > > }; > > > > > > @@ -148,7 +100,7 @@ struct blktap { > > > > > > wait_queue_head_t remove_wait; > > > struct work_struct remove_work; > > > - char name[BLKTAP2_MAX_MESSAGE_LEN]; > > > + char name[BLKTAP_NAME_MAX]; > > > > > > struct blktap_statistics stats; > > > }; > > > @@ -189,7 +141,7 @@ void blktap_sysfs_destroy(struct blktap *); > > > int blktap_device_init(void); > > > void blktap_device_exit(void); > > > size_t blktap_device_debug(struct blktap *, char *, size_t); > > > -int blktap_device_create(struct blktap *, struct blktap_params *); > > > +int blktap_device_create(struct blktap *, struct blktap_device_info *); > > > int blktap_device_destroy(struct blktap *); > > > void blktap_device_destroy_sync(struct blktap *); > > > void blktap_device_run_queue(struct blktap *); > > > diff --git a/drivers/xen/blktap/control.c b/drivers/xen/blktap/control.c > > > index f339bba..57b1a10 100644 > > > --- a/drivers/xen/blktap/control.c > > > +++ b/drivers/xen/blktap/control.c > > > @@ -127,19 +127,19 @@ blktap_control_ioctl(struct inode *inode, struct > > > file *filp, > > > struct blktap *tap; > > > > > > switch (cmd) { > > > - case BLKTAP2_IOCTL_ALLOC_TAP: { > > > - struct blktap_handle h; > > > + case BLKTAP_IOCTL_ALLOC_TAP: { > > > + struct blktap_info info; > > > void __user *ptr = (void __user*)arg; > > > > > > tap = blktap_control_create_tap(); > > > if (!tap) > > > return -ENOMEM; > > > > > > - h.ring = blktap_ring_major; > > > - h.device = blktap_device_major; > > > - h.minor = tap->minor; > > > + info.ring_major = blktap_ring_major; > > > + info.bdev_major = blktap_device_major; > > > + info.ring_minor = tap->minor; > > > > > > - if (copy_to_user(ptr, &h, sizeof(h))) { > > > + if (copy_to_user(ptr, &info, sizeof(info))) { > > > blktap_control_destroy_tap(tap); > > > return -EFAULT; > > > } > > > @@ -147,7 +147,7 @@ blktap_control_ioctl(struct inode *inode, struct file > > > *filp, > > > return 0; > > > } > > > > > > - case BLKTAP2_IOCTL_FREE_TAP: { > > > + case BLKTAP_IOCTL_FREE_TAP: { > > > int minor = arg; > > > > > > if (minor > MAX_BLKTAP_DEVICE) > > > diff --git a/drivers/xen/blktap/device.c b/drivers/xen/blktap/device.c > > > index fce2769..6bb04bd 100644 > > > --- a/drivers/xen/blktap/device.c > > > +++ b/drivers/xen/blktap/device.c > > > @@ -186,7 +186,7 @@ blktap_device_make_request(struct blktap *tap, struct > > > request *rq) > > > write ? 'w' : 'r', blk_rq_bytes(rq), nsegs); > > > > > > request->rq = rq; > > > - request->operation = write ? BLKIF_OP_WRITE : BLKIF_OP_READ; > > > + request->operation = write ? BLKTAP_OP_WRITE : BLKTAP_OP_READ; > > > > > > err = blktap_request_get_pages(tap, request, nsegs); > > > if (err) > > > @@ -276,7 +276,7 @@ blktap_device_do_request(struct request_queue *rq) > > > > > > static void > > > blktap_device_configure(struct blktap *tap, > > > - struct blktap_params *params) > > > + struct blktap_device_info *params) > > > { > > > struct request_queue *rq; > > > struct blktap_device *dev = &tap->device; > > > @@ -297,8 +297,8 @@ blktap_device_configure(struct blktap *tap, > > > blk_queue_max_segment_size(rq, PAGE_SIZE); > > > > > > /* Ensure a merged request will fit in a single I/O ring slot. */ > > > - blk_queue_max_phys_segments(rq, BLKIF_MAX_SEGMENTS_PER_REQUEST); > > > - blk_queue_max_hw_segments(rq, BLKIF_MAX_SEGMENTS_PER_REQUEST); > > > + blk_queue_max_phys_segments(rq, BLKTAP_SEGMENT_MAX); > > > + blk_queue_max_hw_segments(rq, BLKTAP_SEGMENT_MAX); > > > > > > /* Make sure buffer addresses are sector-aligned. */ > > > blk_queue_dma_alignment(rq, 511); > > > @@ -311,7 +311,7 @@ blktap_device_configure(struct blktap *tap, > > > > > > static int > > > blktap_device_validate_params(struct blktap *tap, > > > - struct blktap_params *params) > > > + struct blktap_device_info *params) > > > { > > > struct device *dev = tap->ring.dev; > > > int sector_order, name_sz; > > > @@ -425,7 +425,7 @@ blktap_device_destroy_sync(struct blktap *tap) > > > } > > > > > > int > > > -blktap_device_create(struct blktap *tap, struct blktap_params *params) > > > +blktap_device_create(struct blktap *tap, struct blktap_device_info > > > *params) > > > { > > > int minor, err; > > > struct gendisk *gd; > > > diff --git a/drivers/xen/blktap/request.c b/drivers/xen/blktap/request.c > > > index 9bef48c..8cfd6c9 100644 > > > --- a/drivers/xen/blktap/request.c > > > +++ b/drivers/xen/blktap/request.c > > > @@ -7,18 +7,18 @@ > > > #include "blktap.h" > > > > > > /* max pages per shared pool. just to prevent accidental dos. */ > > > -#define POOL_MAX_PAGES (256*BLKIF_MAX_SEGMENTS_PER_REQUEST) > > > +#define POOL_MAX_PAGES (256*BLKTAP_SEGMENT_MAX) > > > > > > /* default page pool size. when considering to shrink a shared pool, > > > * note that paused tapdisks may grab a whole lot of pages for a long > > > * time. */ > > > -#define POOL_DEFAULT_PAGES (2 * MMAP_PAGES) > > > +#define POOL_DEFAULT_PAGES (2 * BLKTAP_RING_SIZE * > > > BLKTAP_SEGMENT_MAX) > > > > > > /* max number of pages allocatable per request. */ > > > -#define POOL_MAX_REQUEST_PAGES BLKIF_MAX_SEGMENTS_PER_REQUEST > > > +#define POOL_MAX_REQUEST_PAGES BLKTAP_SEGMENT_MAX > > > > > > /* min request structs per pool. These grow dynamically. */ > > > -#define POOL_MIN_REQS BLK_RING_SIZE > > > +#define POOL_MIN_REQS BLKTAP_RING_SIZE > > > > > > static struct kset *pool_set; > > > > > > diff --git a/drivers/xen/blktap/ring.c b/drivers/xen/blktap/ring.c > > > index 6b86be5..9442a64 100644 > > > --- a/drivers/xen/blktap/ring.c > > > +++ b/drivers/xen/blktap/ring.c > > > @@ -18,7 +18,7 @@ static struct cdev blktap_ring_cdev; > > > > > > static void > > > blktap_ring_read_response(struct blktap *tap, > > > - const struct blkif_response *rsp) > > > + const blktap_ring_rsp_t *rsp) > > > { > > > struct blktap_ring *ring = &tap->ring; > > > struct blktap_request *request; > > > @@ -27,7 +27,7 @@ blktap_ring_read_response(struct blktap *tap, > > > request = NULL; > > > > > > usr_idx = rsp->id; > > > - if (usr_idx < 0 || usr_idx >= MAX_PENDING_REQS) { > > > + if (usr_idx < 0 || usr_idx >= BLKTAP_RING_SIZE) { > > > err = -ERANGE; > > > goto invalid; > > > } > > > @@ -48,7 +48,7 @@ blktap_ring_read_response(struct blktap *tap, > > > "request %d [%p] response: %d\n", > > > request->usr_idx, request, rsp->status); > > > > > > - err = rsp->status == BLKIF_RSP_OKAY ? 0 : -EIO; > > > + err = rsp->status == BLKTAP_RSP_OKAY ? 0 : -EIO; > > > end_request: > > > blktap_device_end_request(tap, request, err); > > > return; > > > @@ -67,7 +67,7 @@ static void > > > blktap_read_ring(struct blktap *tap) > > > { > > > struct blktap_ring *ring = &tap->ring; > > > - struct blkif_response rsp; > > > + blktap_ring_rsp_t rsp; > > > RING_IDX rc, rp; > > > > > > down_read(¤t->mm->mmap_sem); > > > @@ -90,6 +90,11 @@ blktap_read_ring(struct blktap *tap) > > > up_read(¤t->mm->mmap_sem); > > > } > > > > > > +#define MMAP_VADDR(_start, _req, _seg) \ > > > + ((_start) + \ > > > + ((_req) * BLKTAP_SEGMENT_MAX * BLKTAP_PAGE_SIZE) + \ > > > + ((_seg) * BLKTAP_PAGE_SIZE)) > > > + > > > static int blktap_ring_fault(struct vm_area_struct *vma, struct vm_fault > > > *vmf) > > > { > > > return VM_FAULT_SIGBUS; > > > @@ -102,7 +107,7 @@ blktap_ring_fail_pending(struct blktap *tap) > > > struct blktap_request *request; > > > int usr_idx; > > > > > > - for (usr_idx = 0; usr_idx < MAX_PENDING_REQS; usr_idx++) { > > > + for (usr_idx = 0; usr_idx < BLKTAP_RING_SIZE; usr_idx++) { > > > request = ring->pending[usr_idx]; > > > if (!request) > > > continue; > > > @@ -154,7 +159,7 @@ blktap_ring_map_request(struct blktap *tap, > > > int seg, err = 0; > > > int write; > > > > > > - write = request->operation == BLKIF_OP_WRITE; > > > + write = request->operation == BLKTAP_OP_WRITE; > > > > > > for (seg = 0; seg < request->nr_pages; seg++) { > > > if (write) > > > @@ -182,7 +187,7 @@ blktap_ring_unmap_request(struct blktap *tap, > > > > > > uaddr = MMAP_VADDR(ring->user_vstart, request->usr_idx, 0); > > > size = request->nr_pages << PAGE_SHIFT; > > > - read = request->operation == BLKIF_OP_READ; > > > + read = request->operation == BLKTAP_OP_READ; > > > > > > if (read) > > > for (seg = 0; seg < request->nr_pages; seg++) > > > @@ -217,11 +222,11 @@ blktap_ring_make_request(struct blktap *tap) > > > if (!request) > > > return ERR_PTR(-ENOMEM); > > > > > > - for (usr_idx = 0; usr_idx < BLK_RING_SIZE; usr_idx++) > > > + for (usr_idx = 0; usr_idx < BLKTAP_RING_SIZE; usr_idx++) > > > if (!ring->pending[usr_idx]) > > > break; > > > > > > - BUG_ON(usr_idx >= BLK_RING_SIZE); > > > + BUG_ON(usr_idx >= BLKTAP_RING_SIZE); > > > > > > request->tap = tap; > > > request->usr_idx = usr_idx; > > > @@ -237,7 +242,7 @@ blktap_ring_submit_request(struct blktap *tap, > > > struct blktap_request *request) > > > { > > > struct blktap_ring *ring = &tap->ring; > > > - struct blkif_request *breq; > > > + blktap_ring_req_t *breq; > > > struct scatterlist *sg; > > > int i, nsecs = 0; > > > > > > @@ -248,12 +253,12 @@ blktap_ring_submit_request(struct blktap *tap, > > > > > > breq->id = request->usr_idx; > > > breq->sector_number = blk_rq_pos(request->rq); > > > - breq->handle = 0; > > > + breq->__pad = 0; > > > breq->operation = request->operation; > > > breq->nr_segments = request->nr_pages; > > > > > > blktap_for_each_sg(sg, request, i) { > > > - struct blkif_request_segment *seg = &breq->seg[i]; > > > + struct blktap_segment *seg = &breq->seg[i]; > > > int first, count; > > > > > > count = sg->length >> 9; > > > @@ -270,12 +275,12 @@ blktap_ring_submit_request(struct blktap *tap, > > > do_gettimeofday(&request->time); > > > > > > > > > - if (request->operation == BLKIF_OP_WRITE) { > > > + if (request->operation == BLKTAP_OP_WRITE) { > > > tap->stats.st_wr_sect += nsecs; > > > tap->stats.st_wr_req++; > > > } > > > > > > - if (request->operation == BLKIF_OP_READ) { > > > + if (request->operation == BLKTAP_OP_READ) { > > > tap->stats.st_rd_sect += nsecs; > > > tap->stats.st_rd_req++; > > > } > > > @@ -327,7 +332,7 @@ blktap_ring_mmap(struct file *filp, struct > > > vm_area_struct *vma) > > > { > > > struct blktap *tap = filp->private_data; > > > struct blktap_ring *ring = &tap->ring; > > > - struct blkif_sring *sring; > > > + blktap_sring_t *sring; > > > struct page *page = NULL; > > > int err; > > > > > > @@ -384,25 +389,25 @@ blktap_ring_ioctl(struct inode *inode, struct file > > > *filp, > > > return -EACCES; > > > > > > switch(cmd) { > > > - case BLKTAP2_IOCTL_KICK_FE: > > > + case BLKTAP_IOCTL_RESPOND: > > > > > > blktap_read_ring(tap); > > > return 0; > > > > > > - case BLKTAP2_IOCTL_CREATE_DEVICE: { > > > - struct blktap_params params; > > > + case BLKTAP_IOCTL_CREATE_DEVICE: { > > > + struct blktap_device_info info; > > > void __user *ptr = (void *)arg; > > > > > > if (!arg) > > > return -EINVAL; > > > > > > - if (copy_from_user(¶ms, ptr, sizeof(params))) > > > + if (copy_from_user(&info, ptr, sizeof(info))) > > > return -EFAULT; > > > > > > - return blktap_device_create(tap, ¶ms); > > > + return blktap_device_create(tap, &info); > > > } > > > > > > - case BLKTAP2_IOCTL_REMOVE_DEVICE: > > > + case BLKTAP_IOCTL_REMOVE_DEVICE: > > > > > > return blktap_device_destroy(tap); > > > } > > > @@ -482,7 +487,7 @@ blktap_ring_debug(struct blktap *tap, char *buf, > > > size_t size) > > > s += snprintf(s, end - s, > > > "begin pending:%d\n", ring->n_pending); > > > > > > - for (usr_idx = 0; usr_idx < MAX_PENDING_REQS; usr_idx++) { > > > + for (usr_idx = 0; usr_idx < BLKTAP_RING_SIZE; usr_idx++) { > > > struct blktap_request *request; > > > struct timeval *time; > > > int write; > > > @@ -491,7 +496,7 @@ blktap_ring_debug(struct blktap *tap, char *buf, > > > size_t size) > > > if (!request) > > > continue; > > > > > > - write = request->operation == BLKIF_OP_WRITE; > > > + write = request->operation == BLKTAP_OP_WRITE; > > > time = &request->time; > > > > > > s += snprintf(s, end - s, > > > diff --git a/drivers/xen/blktap/sysfs.c b/drivers/xen/blktap/sysfs.c > > > index 7bbfea8..182de9a 100644 > > > --- a/drivers/xen/blktap/sysfs.c > > > +++ b/drivers/xen/blktap/sysfs.c > > > @@ -20,7 +20,7 @@ blktap_sysfs_set_name(struct device *dev, struct > > > device_attribute *attr, const c > > > if (!tap) > > > return 0; > > > > > > - if (size >= BLKTAP2_MAX_MESSAGE_LEN) > > > + if (size >= BLKTAP_NAME_MAX) > > > return -ENAMETOOLONG; > > > > > > if (strnlen(buf, size) != size) > > > @@ -75,8 +75,8 @@ blktap_sysfs_remove_device(struct device *dev, > > > goto wait; > > > > > > if (tap->ring.vma) { > > > - blkif_sring_t *sring = tap->ring.ring.sring; > > > - sring->private.tapif_user.msg = > > > BLKTAP2_RING_MESSAGE_CLOSE; > > > + blktap_sring_t *sring = tap->ring.ring.sring; > > > + sring->private.tapif_user.msg = BLKTAP_RING_MESSAGE_CLOSE; > > > blktap_ring_kick_user(tap); > > > } else { > > > INIT_WORK(&tap->remove_work, blktap_sysfs_remove_work); > > > diff --git a/include/linux/blktap.h b/include/linux/blktap.h > > > new file mode 100644 > > > index 0000000..ec33429 > > > --- /dev/null > > > +++ b/include/linux/blktap.h > > > @@ -0,0 +1,85 @@ > > > +/* > > > + * Copyright (c) 2011, XenSource Inc. > > > + * All rights reserved. > > > + */ > > > + > > > +#ifndef _LINUX_BLKTAP_H > > > +#define _LINUX_BLKTAP_H > > > + > > > +/* > > > + * Control > > > + */ > > > + > > > +#define BLKTAP_IOCTL_RESPOND 1 > > > +#define BLKTAP_IOCTL_ALLOC_TAP 200 > > > +#define BLKTAP_IOCTL_FREE_TAP 201 > > > +#define BLKTAP_IOCTL_CREATE_DEVICE 202 > > > +#define BLKTAP_IOCTL_REMOVE_DEVICE 207 > > > + > > > +#define BLKTAP_NAME_MAX 256 > > > + > > > +struct blktap_info { > > > + unsigned int ring_major; > > > + unsigned int bdev_major; > > > + unsigned int ring_minor; > > > +}; > > > + > > > +struct blktap_device_info { > > > + char name[BLKTAP_NAME_MAX]; > > > + unsigned long long capacity; > > > + unsigned long sector_size; > > > +}; > > > + > > > +/* > > > + * I/O ring > > > + */ > > > + > > > +#ifdef __KERNEL__ > > > +#define BLKTAP_PAGE_SIZE PAGE_SIZE > > > +#endif > > > + > > > +#include <xen/interface/io/ring.h> > > > + > > > +typedef struct blktap_ring_request blktap_ring_req_t; > > > +typedef struct blktap_ring_response blktap_ring_rsp_t; > > > + > > > +struct blktap_segment { > > > + uint32_t __pad; > > > + uint8_t first_sect; > > > + uint8_t last_sect; > > > +}; > > > + > > > +#define BLKTAP_OP_READ 0 > > > +#define BLKTAP_OP_WRITE 1 > > > + > > > +#define BLKTAP_SEGMENT_MAX 11 > > > + > > > +struct blktap_ring_request { > > > + uint8_t operation; > > > + uint8_t nr_segments; > > > + uint16_t __pad; > > > + uint64_t id; > > > + uint64_t sector_number; > > > + struct blktap_segment seg[BLKTAP_SEGMENT_MAX]; > > > +}; > > > + > > > +#define BLKTAP_RSP_EOPNOTSUPP -2 > > > +#define BLKTAP_RSP_ERROR -1 > > > +#define BLKTAP_RSP_OKAY 0 > > > + > > > +struct blktap_ring_response { > > > + uint64_t id; > > > + uint8_t operation; > > > + int16_t status; > > > +}; > > > + > > > +DEFINE_RING_TYPES(blktap, struct blktap_ring_request, struct > > > blktap_ring_response); > > > +#define BLKTAP_RING_SIZE __CONST_RING_SIZE(blktap, BLKTAP_PAGE_SIZE) > > > + > > > +/* > > > + * Ring messages (DEPRECATED) > > > + */ > > > + > > > +#define BLKTAP_RING_MESSAGE_CLOSE 3 > > > + > > > +#endif /* _LINUX_BLKTAP_H */ > > > -- > > > 1.7.0.4 > > > > > > > > > _______________________________________________ > > > Xen-devel mailing list > > > Xen-devel@xxxxxxxxxxxxxxxxxxx > > > http://lists.xensource.com/xen-devel > > > > > > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |