Add -o max_read=XXX support in fuse. This is needed by usmb to have a
authorsyl <syl@openbsd.org>
Tue, 20 May 2014 13:32:22 +0000 (13:32 +0000)
committersyl <syl@openbsd.org>
Tue, 20 May 2014 13:32:22 +0000 (13:32 +0000)
working read() and write().

ok tedu@

lib/libfuse/fuse.c
sys/miscfs/fuse/fuse_vfsops.c
sys/miscfs/fuse/fuse_vnops.c
sys/miscfs/fuse/fusefs.h
sys/sys/mount.h

index b726b88..ef794b3 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: fuse.c,v 1.23 2014/05/20 13:22:06 syl Exp $ */
+/* $OpenBSD: fuse.c,v 1.24 2014/05/20 13:32:22 syl Exp $ */
 /*
  * Copyright (c) 2013 Sylvestre Gallon <ccna.syl@gmail.com>
  *
@@ -169,6 +169,7 @@ fuse_mount(const char *dir, unused struct fuse_args *args)
        }
 
        fargs.fd = fc->fd;
+       fargs.max_read = max_read;
        if (mount(MOUNT_FUSEFS, fc->dir, 0, &fargs)) {
                switch (errno) {
                case EMFILE:
index 6b34645..e3ab7e8 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: fuse_vfsops.c,v 1.8 2013/12/10 13:43:05 pelikan Exp $ */
+/* $OpenBSD: fuse_vfsops.c,v 1.9 2014/05/20 13:32:22 syl Exp $ */
 /*
  * Copyright (c) 2012-2013 Sylvestre Gallon <ccna.syl@gmail.com>
  *
@@ -98,8 +98,12 @@ fusefs_mount(struct mount *mp, const char *path, void *data,
        fmp->mp = mp;
        fmp->sess_init = 0;
        fmp->dev = vp->v_rdev;
-       mp->mnt_data = fmp;
+       if (args.max_read > 0)
+               fmp->max_read = MIN(args.max_read, FUSEBUFMAXSIZE);
+       else
+               fmp->max_read = FUSEBUFMAXSIZE;
 
+       mp->mnt_data = fmp;
        mp->mnt_flag |= MNT_LOCAL;
        vfs_getnewfsid(mp);
 
index 7b7f49b..1b6612f 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: fuse_vnops.c,v 1.17 2014/05/19 13:55:29 syl Exp $ */
+/* $OpenBSD: fuse_vnops.c,v 1.18 2014/05/20 13:32:22 syl Exp $ */
 /*
  * Copyright (c) 2012-2013 Sylvestre Gallon <ccna.syl@gmail.com>
  *
@@ -681,7 +681,7 @@ fusefs_readdir(void *v)
                }
                fbuf->fb_io_fd = ip->fufh[FUFH_RDONLY].fh_id;
                fbuf->fb_io_off = uio->uio_offset;
-               fbuf->fb_io_len = MIN(uio->uio_resid, FUSEBUFMAXSIZE);
+               fbuf->fb_io_len = MIN(uio->uio_resid, fmp->max_read);
 
                error = fb_queue(fmp->dev, fbuf);
 
@@ -1014,7 +1014,7 @@ fusefs_read(void *v)
        while (uio->uio_resid > 0) {
                fbuf = fb_setup(0, ip->ufs_ino.i_number, FBT_READ, p);
 
-               size = MIN(uio->uio_resid, FUSEBUFMAXSIZE);
+               size = MIN(uio->uio_resid, fmp->max_read);
                fbuf->fb_io_fd = fusefs_fd_get(ip, FUFH_RDONLY);
                fbuf->fb_io_off = uio->uio_offset;
                fbuf->fb_io_len = size;
@@ -1071,7 +1071,7 @@ fusefs_write(void *v)
        }
 
        while (uio->uio_resid > 0) {
-               len = MIN(uio->uio_resid, FUSEBUFMAXSIZE);
+               len = MIN(uio->uio_resid, fmp->max_read);
                fbuf = fb_setup(len, ip->ufs_ino.i_number, FBT_WRITE, p);
 
                fbuf->fb_io_fd = fusefs_fd_get(ip, FUFH_WRONLY);
index 1d9c7fb..5b7027c 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: fusefs.h,v 1.6 2014/01/16 09:31:44 syl Exp $ */
+/* $OpenBSD: fusefs.h,v 1.7 2014/05/20 13:32:22 syl Exp $ */
 /*
  * Copyright (c) 2012-2013 Sylvestre Gallon <ccna.syl@gmail.com>
  *
@@ -50,7 +50,7 @@ struct fuse_msg;
 struct fusefs_mnt {
        struct mount *mp;
        uint32_t undef_op;
-       uint32_t max_write;
+       int max_read;
        int sess_init;
        dev_t dev;
 };
index 4cd3ecb..7bad79b 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mount.h,v 1.118 2014/03/24 00:19:48 guenther Exp $    */
+/*     $OpenBSD: mount.h,v 1.119 2014/05/20 13:32:22 syl Exp $ */
 /*     $NetBSD: mount.h,v 1.48 1996/02/18 11:55:47 fvdl Exp $  */
 
 /*
@@ -280,9 +280,8 @@ struct procfs_args {
  */
 struct fusefs_args {
        char *name;
-       char *url;
        int fd;
-       int flags;
+       int max_read;
 };
 
 /*