[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(&current->mm->mmap_sem);
> > > @@ -90,6 +90,11 @@ blktap_read_ring(struct blktap *tap)
> > >         up_read(&current->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(&params, ptr, sizeof(params)))
> > > +               if (copy_from_user(&info, ptr, sizeof(info)))
> > >                         return -EFAULT;
> > >
> > > -               return blktap_device_create(tap, &params);
> > > +               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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.