linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] fuse, virtiofs: Do not alloc/install fuse device in fuse_fill_super_common()
@ 2020-04-27 18:03 Vivek Goyal
  2020-04-28 14:59 ` Stefan Hajnoczi
  2020-04-30  8:58 ` Miklos Szeredi
  0 siblings, 2 replies; 4+ messages in thread
From: Vivek Goyal @ 2020-04-27 18:03 UTC (permalink / raw)
  To: linux-fsdevel, Miklos Szeredi
  Cc: Chirantan Ekbote, virtio-fs-list, Stefan Hajnoczi

As of now fuse_fill_super_common() allocates and installs one fuse device.
Filesystems like virtiofs can have more than one filesystem queues and
can have one fuse device per queue. Given, fuse_fill_super_common() only
handles one device, virtiofs allocates and installes fuse devices for
all queues except one.

This makes logic little twisted and hard to understand. It probably
is better to not do any device allocation/installation in
fuse_fill_super_common() and let caller take care of it instead.

Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
---
 fs/fuse/fuse_i.h    |  3 ---
 fs/fuse/inode.c     | 19 ++++++++++++-------
 fs/fuse/virtio_fs.c |  9 +--------
 3 files changed, 13 insertions(+), 18 deletions(-)

diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
index ca344bf71404..df0a62f963a8 100644
--- a/fs/fuse/fuse_i.h
+++ b/fs/fuse/fuse_i.h
@@ -485,9 +485,6 @@ struct fuse_fs_context {
 	unsigned int max_read;
 	unsigned int blksize;
 	const char *subtype;
-
-	/* fuse_dev pointer to fill in, should contain NULL on entry */
-	void **fudptr;
 };
 
 /**
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
index 95d712d44ca1..135e8e9a80d8 100644
--- a/fs/fuse/inode.c
+++ b/fs/fuse/inode.c
@@ -1191,16 +1191,12 @@ int fuse_fill_super_common(struct super_block *sb, struct fuse_fs_context *ctx)
 
 	mutex_lock(&fuse_mutex);
 	err = -EINVAL;
-	if (*ctx->fudptr)
-		goto err_unlock;
-
 	err = fuse_ctl_add_conn(fc);
 	if (err)
 		goto err_unlock;
 
 	list_add_tail(&fc->entry, &fuse_conn_list);
 	sb->s_root = root_dentry;
-	*ctx->fudptr = fud;
 	mutex_unlock(&fuse_mutex);
 	return 0;
 
@@ -1220,6 +1216,7 @@ static int fuse_fill_super(struct super_block *sb, struct fs_context *fsc)
 	struct file *file;
 	int err;
 	struct fuse_conn *fc;
+	struct fuse_dev *fud;
 
 	err = -EINVAL;
 	file = fget(ctx->fd);
@@ -1233,13 +1230,16 @@ static int fuse_fill_super(struct super_block *sb, struct fs_context *fsc)
 	if ((file->f_op != &fuse_dev_operations) ||
 	    (file->f_cred->user_ns != sb->s_user_ns))
 		goto err_fput;
-	ctx->fudptr = &file->private_data;
 
-	fc = kmalloc(sizeof(*fc), GFP_KERNEL);
 	err = -ENOMEM;
-	if (!fc)
+	fud = fuse_dev_alloc();
+	if (!fud)
 		goto err_fput;
 
+	fc = kmalloc(sizeof(*fc), GFP_KERNEL);
+	if (!fc)
+		goto err_free_dev;
+
 	fuse_conn_init(fc, sb->s_user_ns, &fuse_dev_fiq_ops, NULL);
 	fc->release = fuse_free_conn;
 	sb->s_fs_info = fc;
@@ -1247,6 +1247,9 @@ static int fuse_fill_super(struct super_block *sb, struct fs_context *fsc)
 	err = fuse_fill_super_common(sb, ctx);
 	if (err)
 		goto err_put_conn;
+
+	fuse_dev_install(fud, fc);
+	file->private_data = fud;
 	/*
 	 * atomic_dec_and_test() in fput() provides the necessary
 	 * memory barrier for file->private_data to be visible on all
@@ -1259,6 +1262,8 @@ static int fuse_fill_super(struct super_block *sb, struct fs_context *fsc)
  err_put_conn:
 	fuse_conn_put(fc);
 	sb->s_fs_info = NULL;
+ err_free_dev:
+	fuse_dev_free(fud);
  err_fput:
 	fput(file);
  err:
diff --git a/fs/fuse/virtio_fs.c b/fs/fuse/virtio_fs.c
index bade74768903..87a7bc0f193c 100644
--- a/fs/fuse/virtio_fs.c
+++ b/fs/fuse/virtio_fs.c
@@ -1066,8 +1066,7 @@ static int virtio_fs_fill_super(struct super_block *sb)
 	}
 
 	err = -ENOMEM;
-	/* Allocate fuse_dev for hiprio and notification queues */
-	for (i = 0; i < VQ_REQUEST; i++) {
+	for (i = 0; i < fs->nvqs; i++) {
 		struct virtio_fs_vq *fsvq = &fs->vqs[i];
 
 		fsvq->fud = fuse_dev_alloc();
@@ -1075,18 +1074,12 @@ static int virtio_fs_fill_super(struct super_block *sb)
 			goto err_free_fuse_devs;
 	}
 
-	ctx.fudptr = (void **)&fs->vqs[VQ_REQUEST].fud;
 	err = fuse_fill_super_common(sb, &ctx);
 	if (err < 0)
 		goto err_free_fuse_devs;
 
-	fc = fs->vqs[VQ_REQUEST].fud->fc;
-
 	for (i = 0; i < fs->nvqs; i++) {
 		struct virtio_fs_vq *fsvq = &fs->vqs[i];
-
-		if (i == VQ_REQUEST)
-			continue; /* already initialized */
 		fuse_dev_install(fsvq->fud, fc);
 	}
 
-- 
2.25.4


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] fuse, virtiofs: Do not alloc/install fuse device in fuse_fill_super_common()
  2020-04-27 18:03 [PATCH] fuse, virtiofs: Do not alloc/install fuse device in fuse_fill_super_common() Vivek Goyal
@ 2020-04-28 14:59 ` Stefan Hajnoczi
  2020-04-30  8:58 ` Miklos Szeredi
  1 sibling, 0 replies; 4+ messages in thread
From: Stefan Hajnoczi @ 2020-04-28 14:59 UTC (permalink / raw)
  To: Vivek Goyal
  Cc: linux-fsdevel, Miklos Szeredi, Chirantan Ekbote, virtio-fs-list

[-- Attachment #1: Type: text/plain, Size: 884 bytes --]

On Mon, Apr 27, 2020 at 02:03:54PM -0400, Vivek Goyal wrote:
> As of now fuse_fill_super_common() allocates and installs one fuse device.
> Filesystems like virtiofs can have more than one filesystem queues and
> can have one fuse device per queue. Given, fuse_fill_super_common() only
> handles one device, virtiofs allocates and installes fuse devices for
> all queues except one.
> 
> This makes logic little twisted and hard to understand. It probably
> is better to not do any device allocation/installation in
> fuse_fill_super_common() and let caller take care of it instead.
> 
> Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
> ---
>  fs/fuse/fuse_i.h    |  3 ---
>  fs/fuse/inode.c     | 19 ++++++++++++-------
>  fs/fuse/virtio_fs.c |  9 +--------
>  3 files changed, 13 insertions(+), 18 deletions(-)

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] fuse, virtiofs: Do not alloc/install fuse device in fuse_fill_super_common()
  2020-04-27 18:03 [PATCH] fuse, virtiofs: Do not alloc/install fuse device in fuse_fill_super_common() Vivek Goyal
  2020-04-28 14:59 ` Stefan Hajnoczi
@ 2020-04-30  8:58 ` Miklos Szeredi
  2020-04-30 14:10   ` Vivek Goyal
  1 sibling, 1 reply; 4+ messages in thread
From: Miklos Szeredi @ 2020-04-30  8:58 UTC (permalink / raw)
  To: Vivek Goyal
  Cc: linux-fsdevel, Chirantan Ekbote, virtio-fs-list, Stefan Hajnoczi

On Mon, Apr 27, 2020 at 8:04 PM Vivek Goyal <vgoyal@redhat.com> wrote:
>
> As of now fuse_fill_super_common() allocates and installs one fuse device.
> Filesystems like virtiofs can have more than one filesystem queues and
> can have one fuse device per queue. Given, fuse_fill_super_common() only
> handles one device, virtiofs allocates and installes fuse devices for
> all queues except one.
>
> This makes logic little twisted and hard to understand. It probably
> is better to not do any device allocation/installation in
> fuse_fill_super_common() and let caller take care of it instead.

I don't have the details about the fuse super block setup in my head,
but leaving the fuse_dev_alloc_install() call inside
fuse_fill_super_common() and adding new
fuse_dev_alloc()/fuse_dev_install() calls looks highly suspicious.

Thanks,
Miklos

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] fuse, virtiofs: Do not alloc/install fuse device in fuse_fill_super_common()
  2020-04-30  8:58 ` Miklos Szeredi
@ 2020-04-30 14:10   ` Vivek Goyal
  0 siblings, 0 replies; 4+ messages in thread
From: Vivek Goyal @ 2020-04-30 14:10 UTC (permalink / raw)
  To: Miklos Szeredi
  Cc: linux-fsdevel, Chirantan Ekbote, virtio-fs-list, Stefan Hajnoczi

On Thu, Apr 30, 2020 at 10:58:42AM +0200, Miklos Szeredi wrote:
> On Mon, Apr 27, 2020 at 8:04 PM Vivek Goyal <vgoyal@redhat.com> wrote:
> >
> > As of now fuse_fill_super_common() allocates and installs one fuse device.
> > Filesystems like virtiofs can have more than one filesystem queues and
> > can have one fuse device per queue. Given, fuse_fill_super_common() only
> > handles one device, virtiofs allocates and installes fuse devices for
> > all queues except one.
> >
> > This makes logic little twisted and hard to understand. It probably
> > is better to not do any device allocation/installation in
> > fuse_fill_super_common() and let caller take care of it instead.
> 
> I don't have the details about the fuse super block setup in my head,
> but leaving the fuse_dev_alloc_install() call inside
> fuse_fill_super_common() and adding new
> fuse_dev_alloc()/fuse_dev_install() calls looks highly suspicious.

Good catch. My bad. I forgot to remove that fuse_dev_alloc_install() call
from fuse_fill_super_common(). I tested it and it worked. So I guess I just
ended up installing extra fud device in fc which was never used.

I will fix this and post V2 of the patch.

Thanks
Vivek


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-04-30 14:10 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-27 18:03 [PATCH] fuse, virtiofs: Do not alloc/install fuse device in fuse_fill_super_common() Vivek Goyal
2020-04-28 14:59 ` Stefan Hajnoczi
2020-04-30  8:58 ` Miklos Szeredi
2020-04-30 14:10   ` Vivek Goyal

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).