diff mbox

Don't return type from host in readdir on local 9p filesystem

Message ID 1408699341-6126-1-git-send-email-mjt@msgid.tls.msk.ru
State New
Headers show

Commit Message

Michael Tokarev Aug. 22, 2014, 9:22 a.m. UTC
From: Bastian Blank <waldi@debian.org>

When using mapped mode in 9pfs, readdir implementation
should not return file type in d_type from the host
readdir, instead, it should use the type stored in
the extended attributes.  Since d_type is optional
and reading ext attrs for every readdir is expensive,
it should be sufficient to just set d_type to DT_UNKNOWN,
so guest will know to look it up separately.

This is a -stable material.

Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>

Comments

Aneesh Kumar K.V Sept. 3, 2014, 9:39 p.m. UTC | #1
Michael Tokarev <mjt@tls.msk.ru> writes:

> From: Bastian Blank <waldi@debian.org>
>
> When using mapped mode in 9pfs, readdir implementation
> should not return file type in d_type from the host
> readdir, instead, it should use the type stored in
> the extended attributes.  Since d_type is optional
> and reading ext attrs for every readdir is expensive,
> it should be sufficient to just set d_type to DT_UNKNOWN,
> so guest will know to look it up separately.
>
> This is a -stable material.
>
> Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
>
> --- qemu-2.0.0+dfsg.orig/hw/9pfs/virtio-9p-local.c
> +++ qemu-2.0.0+dfsg/hw/9pfs/virtio-9p-local.c
> @@ -396,12 +396,16 @@ static int local_readdir_r(FsContext *ct
>
>  again:
>      ret = readdir_r(fs->dir, entry, result);
> -    if (ctx->export_flags & V9FS_SM_MAPPED_FILE) {
> +    if (ctx->export_flags & V9FS_SM_MAPPED) {
> +        entry->d_type = DT_UNKNOWN;
> +    }
> +    else if (ctx->export_flags & V9FS_SM_MAPPED_FILE) {
>          if (!ret && *result != NULL &&
>              !strcmp(entry->d_name, VIRTFS_META_DIR)) {
>              /* skp the meta data directory */
>              goto again;
>          }
> +        entry->d_type = DT_UNKNOWN;
>      }
>      return ret;
>  }

Hi Bastian,

Can I add your signed-off-by to this patch ?

-aneesh
Bastian Blank Sept. 4, 2014, 1:24 p.m. UTC | #2
On Wed, Sep 03, 2014 at 04:39:35PM -0500, Aneesh Kumar K.V wrote:
> Michael Tokarev <mjt@tls.msk.ru> writes:
> > From: Bastian Blank <waldi@debian.org>
> >
> > When using mapped mode in 9pfs, readdir implementation
> > should not return file type in d_type from the host
> > readdir, instead, it should use the type stored in
> > the extended attributes.  Since d_type is optional
> > and reading ext attrs for every readdir is expensive,
> > it should be sufficient to just set d_type to DT_UNKNOWN,
> > so guest will know to look it up separately.
> >
> > This is a -stable material.
> >
> > Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
Signed-off-by: Bastian Blank <waldi@debian.org>
> >
> > --- qemu-2.0.0+dfsg.orig/hw/9pfs/virtio-9p-local.c
> > +++ qemu-2.0.0+dfsg/hw/9pfs/virtio-9p-local.c
> > @@ -396,12 +396,16 @@ static int local_readdir_r(FsContext *ct
> >
> >  again:
> >      ret = readdir_r(fs->dir, entry, result);
> > -    if (ctx->export_flags & V9FS_SM_MAPPED_FILE) {
> > +    if (ctx->export_flags & V9FS_SM_MAPPED) {
> > +        entry->d_type = DT_UNKNOWN;
> > +    }
> > +    else if (ctx->export_flags & V9FS_SM_MAPPED_FILE) {
> >          if (!ret && *result != NULL &&
> >              !strcmp(entry->d_name, VIRTFS_META_DIR)) {
> >              /* skp the meta data directory */
> >              goto again;
> >          }
> > +        entry->d_type = DT_UNKNOWN;
> >      }
> >      return ret;
> >  }
> 
> Can I add your signed-off-by to this patch ?

Sure.

Bastian

--
diff mbox

Patch

--- qemu-2.0.0+dfsg.orig/hw/9pfs/virtio-9p-local.c
+++ qemu-2.0.0+dfsg/hw/9pfs/virtio-9p-local.c
@@ -396,12 +396,16 @@  static int local_readdir_r(FsContext *ct
 
 again:
     ret = readdir_r(fs->dir, entry, result);
-    if (ctx->export_flags & V9FS_SM_MAPPED_FILE) {
+    if (ctx->export_flags & V9FS_SM_MAPPED) {
+        entry->d_type = DT_UNKNOWN;
+    }
+    else if (ctx->export_flags & V9FS_SM_MAPPED_FILE) {
         if (!ret && *result != NULL &&
             !strcmp(entry->d_name, VIRTFS_META_DIR)) {
             /* skp the meta data directory */
             goto again;
         }
+        entry->d_type = DT_UNKNOWN;
     }
     return ret;
 }