All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Venkateswararao Jujjuri (JV)" <jvrao@linux.vnet.ibm.com>
To: "M. Mohan Kumar" <mohan@in.ibm.com>
Cc: v9fs-developer@lists.sourceforge.net, qemu-devel@nongnu.org
Subject: [Qemu-devel] Re: [V9fs-developer] [PATCH] qemu:virtio-9p: Send iounit to client for read/write operations
Date: Thu, 17 Jun 2010 15:39:22 -0700	[thread overview]
Message-ID: <4C1AA41A.1070400@linux.vnet.ibm.com> (raw)
In-Reply-To: <1275652681-8193-1-git-send-email-mohan@in.ibm.com>

M. Mohan Kumar wrote:
> Compute iounit based on the host filesystem block size and pass it to
> client with open/create response. Also return iounit as statfs's f_bsize
> for optimal block size transfers.
> 
> 
> Signed-off-by: M. Mohan Kumar <mohan@in.ibm.com>
> Reviewd-by: Sripathi Kodi <sripathik@in.ibm.com>
> ---
>  hw/virtio-9p.c |   69 +++++++++++++++++++++++++++++++++++++++++++++----------
>  hw/virtio-9p.h |    7 +++++
>  2 files changed, 63 insertions(+), 13 deletions(-)
> 
> This patch depends on the patch
> http://lists.nongnu.org/archive/html/qemu-devel/2010-05/msg02706.html
> 
> diff --git a/hw/virtio-9p.c b/hw/virtio-9p.c
> index 851004d..c60dcc8 100644
> --- a/hw/virtio-9p.c
> +++ b/hw/virtio-9p.c
> @@ -258,6 +258,11 @@ static int v9fs_do_fsync(V9fsState *s, int fd)
>      return s->ops->fsync(&s->ctx, fd);
>  }
> 
> +static int v9fs_do_statfs(V9fsState *s, V9fsString *path, struct statfs *stbuf)
> +{
> +    return s->ops->statfs(&s->ctx, path->data, stbuf);
> +}
> +
>  static void v9fs_string_init(V9fsString *str)
>  {
>      str->data = NULL;
> @@ -1067,11 +1072,10 @@ static void v9fs_fix_path(V9fsString *dst, V9fsString *src, int len)
> 
>  static void v9fs_version(V9fsState *s, V9fsPDU *pdu)
>  {
> -    int32_t msize;
>      V9fsString version;
>      size_t offset = 7;
> 
> -    pdu_unmarshal(pdu, offset, "ds", &msize, &version);
> +    pdu_unmarshal(pdu, offset, "ds", &s->msize, &version);
> 
>      if (!strcmp(version.data, "9P2000.u")) {
>          s->proto_version = V9FS_PROTO_2000U;
> @@ -1081,7 +1085,7 @@ static void v9fs_version(V9fsState *s, V9fsPDU *pdu)
>          v9fs_string_sprintf(&version, "unknown");
>      }
> 
> -    offset += pdu_marshal(pdu, offset, "ds", msize, &version);
> +    offset += pdu_marshal(pdu, offset, "ds", s->msize, &version);
>      complete_pdu(s, pdu, offset);
> 
>      v9fs_string_free(&version);
> @@ -1515,6 +1519,26 @@ out:
>      v9fs_walk_complete(s, vs, err);
>  }
> 
> +static int32_t get_iounit(V9fsState *s, V9fsString *name)
> +{
> +    struct statfs stbuf;
> +    int32_t iounit = 0;
> +
> +    /*
> +     * iounit should be multiples of f_bsize (host filesystem block size
> +     * and as well as less than (client msize - P9_IOHDRSZ))
> +     */
> +    if (!v9fs_do_statfs(s, name, &stbuf)) {
> +        iounit = stbuf.f_bsize;
> +        iounit *= (s->msize - P9_IOHDRSZ)/stbuf.f_bsize;
> +    }
> +
> +    if (!iounit) {
> +        iounit = s->msize - P9_IOHDRSZ;
> +    }
> +    return iounit;
> +}
> +
>  static void v9fs_open_post_opendir(V9fsState *s, V9fsOpenState *vs, int err)
>  {
>      if (vs->fidp->dir == NULL) {
> @@ -1532,12 +1556,15 @@ out:
> 
>  static void v9fs_open_post_open(V9fsState *s, V9fsOpenState *vs, int err)
>  {
> +    int32_t iounit;
> +
>      if (vs->fidp->fd == -1) {
>          err = -errno;
>          goto out;
>      }
> 
> -    vs->offset += pdu_marshal(vs->pdu, vs->offset, "Qd", &vs->qid, 0);
> +    iounit = get_iounit(s, &vs->fidp->path);
> +    vs->offset += pdu_marshal(vs->pdu, vs->offset, "Qd", &vs->qid, iounit);
>      err = vs->offset;
>  out:
>      complete_pdu(s, vs->pdu, err);
> @@ -2011,11 +2038,16 @@ out:
> 
>  static void v9fs_post_create(V9fsState *s, V9fsCreateState *vs, int err)
>  {
> +    int32_t iounit;
> +
> +    iounit = get_iounit(s, &vs->fidp->path);

Now get_iounit() does a statfs() system call..hence I think we need to introduce a
state/post function  here.

- JV

> +
>      if (err == 0) {
>          v9fs_string_copy(&vs->fidp->path, &vs->fullname);
>          stat_to_qid(&vs->stbuf, &vs->qid);
> 
> -        vs->offset += pdu_marshal(vs->pdu, vs->offset, "Qd", &vs->qid, 0);
> +        vs->offset += pdu_marshal(vs->pdu, vs->offset, "Qd", &vs->qid,
> +                iounit);
> 
>          err = vs->offset;
>      }
> @@ -2654,23 +2686,34 @@ out:
>      qemu_free(vs);
>  }
> 
> -static int v9fs_do_statfs(V9fsState *s, V9fsString *path, struct statfs *stbuf)
> -{
> -    return s->ops->statfs(&s->ctx, path->data, stbuf);
> -}
> -
>  static void v9fs_statfs_post_statfs(V9fsState *s, V9fsStatfsState *vs, int err)
>  {
> +    int32_t bsize_factor;
> +
>      if (err) {
>          err = -errno;
>          goto out;
>      }
> 
> +    /*
> +     * compute bsize factor based on host file system block size
> +     * and client msize
> +     */
> +    bsize_factor = (s->msize - P9_IOHDRSZ)/vs->stbuf.f_bsize;
> +    if (!bsize_factor) {
> +        bsize_factor = 1;
> +    }
>      vs->v9statfs.f_type = vs->stbuf.f_type;
>      vs->v9statfs.f_bsize = vs->stbuf.f_bsize;
> -    vs->v9statfs.f_blocks = vs->stbuf.f_blocks;
> -    vs->v9statfs.f_bfree = vs->stbuf.f_bfree;
> -    vs->v9statfs.f_bavail = vs->stbuf.f_bavail;
> +    vs->v9statfs.f_bsize *= bsize_factor;
> +    /*
> +     * f_bsize is adjusted(multiplied) by bsize factor, so we need to
> +     * adjust(divide) the number of blocks, free blocks and available
> +     * blocks by bsize factor
> +     */
> +    vs->v9statfs.f_blocks = vs->stbuf.f_blocks/bsize_factor;
> +    vs->v9statfs.f_bfree = vs->stbuf.f_bfree/bsize_factor;
> +    vs->v9statfs.f_bavail = vs->stbuf.f_bavail/bsize_factor;
>      vs->v9statfs.f_files = vs->stbuf.f_files;
>      vs->v9statfs.f_ffree = vs->stbuf.f_ffree;
>      vs->v9statfs.fsid_val = (unsigned int) vs->stbuf.f_fsid.__val[0] |
> diff --git a/hw/virtio-9p.h b/hw/virtio-9p.h
> index 3819be5..92bbeb0 100644
> --- a/hw/virtio-9p.h
> +++ b/hw/virtio-9p.h
> @@ -84,6 +84,12 @@ enum p9_proto_version {
>  #define P9_NOFID    (u32)(~0)
>  #define P9_MAXWELEM 16
> 
> +/*
> + * ample room for Twrite/Rread header
> + * size[4] Tread/Twrite tag[2] fid[4] offset[8] count[4]
> + */
> +#define P9_IOHDRSZ 24
> +
>  typedef struct V9fsPDU V9fsPDU;
> 
>  struct V9fsPDU
> @@ -168,6 +174,7 @@ typedef struct V9fsState
>      uint8_t *tag;
>      size_t config_size;
>      enum p9_proto_version proto_version;
> +    int32_t msize;
>  } V9fsState;
> 
>  typedef struct V9fsCreateState {

      parent reply	other threads:[~2010-06-17 22:39 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-06-04 11:58 [Qemu-devel] [PATCH] qemu:virtio-9p: Send iounit to client for read/write operations M. Mohan Kumar
2010-06-04 11:59 ` [Qemu-devel] [PATCH] 9p: Make use of iounit for read/write M. Mohan Kumar
2010-06-17 22:39 ` Venkateswararao Jujjuri (JV) [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4C1AA41A.1070400@linux.vnet.ibm.com \
    --to=jvrao@linux.vnet.ibm.com \
    --cc=mohan@in.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=v9fs-developer@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.