Module Name: src Committed By: chs Date: Mon May 28 21:04:38 UTC 2018
Modified Files: src/sys/fs/efs: efs_genfs.c src/sys/fs/msdosfs: msdosfs_denode.c src/sys/fs/nilfs: nilfs_vfsops.c src/sys/fs/puffs: puffs_vfsops.c src/sys/fs/sysvbfs: sysvbfs.c src/sys/fs/udf: udf_subr.c src/sys/fs/v7fs: v7fs_extern.c src/sys/miscfs/genfs: genfs_io.c genfs_node.h src/sys/nfs: nfs_node.c src/sys/ufs/chfs: chfs_vfsops.c src/sys/ufs/ext2fs: ext2fs_vfsops.c src/sys/ufs/ffs: ffs_vfsops.c src/sys/ufs/lfs: lfs_vfsops.c Log Message: add a genfs method to allow a file system to limit the range of pages that are given to a single GOP_WRITE() call. needed by ZFS. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/fs/efs/efs_genfs.c cvs rdiff -u -r1.56 -r1.57 src/sys/fs/msdosfs/msdosfs_denode.c cvs rdiff -u -r1.23 -r1.24 src/sys/fs/nilfs/nilfs_vfsops.c cvs rdiff -u -r1.120 -r1.121 src/sys/fs/puffs/puffs_vfsops.c cvs rdiff -u -r1.16 -r1.17 src/sys/fs/sysvbfs/sysvbfs.c cvs rdiff -u -r1.139 -r1.140 src/sys/fs/udf/udf_subr.c cvs rdiff -u -r1.5 -r1.6 src/sys/fs/v7fs/v7fs_extern.c cvs rdiff -u -r1.71 -r1.72 src/sys/miscfs/genfs/genfs_io.c cvs rdiff -u -r1.21 -r1.22 src/sys/miscfs/genfs/genfs_node.h cvs rdiff -u -r1.122 -r1.123 src/sys/nfs/nfs_node.c cvs rdiff -u -r1.17 -r1.18 src/sys/ufs/chfs/chfs_vfsops.c cvs rdiff -u -r1.210 -r1.211 src/sys/ufs/ext2fs/ext2fs_vfsops.c cvs rdiff -u -r1.356 -r1.357 src/sys/ufs/ffs/ffs_vfsops.c cvs rdiff -u -r1.361 -r1.362 src/sys/ufs/lfs/lfs_vfsops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/fs/efs/efs_genfs.c diff -u src/sys/fs/efs/efs_genfs.c:1.1 src/sys/fs/efs/efs_genfs.c:1.2 --- src/sys/fs/efs/efs_genfs.c:1.1 Fri Jun 29 23:30:28 2007 +++ src/sys/fs/efs/efs_genfs.c Mon May 28 21:04:37 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: efs_genfs.c,v 1.1 2007/06/29 23:30:28 rumble Exp $ */ +/* $NetBSD: efs_genfs.c,v 1.2 2018/05/28 21:04:37 chs Exp $ */ /* * Copyright (c) 2006 Stephen M. Rumble <rum...@ephemeral.org> @@ -17,7 +17,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: efs_genfs.c,v 1.1 2007/06/29 23:30:28 rumble Exp $"); +__KERNEL_RCSID(0, "$NetBSD: efs_genfs.c,v 1.2 2018/05/28 21:04:37 chs Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -42,6 +42,7 @@ const struct genfs_ops efs_genfsops = { .gop_size = genfs_size, .gop_alloc = efs_gop_alloc, .gop_write = genfs_gop_write, + .gop_putrange = genfs_gop_putrange, }; int Index: src/sys/fs/msdosfs/msdosfs_denode.c diff -u src/sys/fs/msdosfs/msdosfs_denode.c:1.56 src/sys/fs/msdosfs/msdosfs_denode.c:1.57 --- src/sys/fs/msdosfs/msdosfs_denode.c:1.56 Fri May 26 14:34:19 2017 +++ src/sys/fs/msdosfs/msdosfs_denode.c Mon May 28 21:04:37 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: msdosfs_denode.c,v 1.56 2017/05/26 14:34:19 riastradh Exp $ */ +/* $NetBSD: msdosfs_denode.c,v 1.57 2018/05/28 21:04:37 chs Exp $ */ /*- * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. @@ -48,7 +48,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: msdosfs_denode.c,v 1.56 2017/05/26 14:34:19 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: msdosfs_denode.c,v 1.57 2018/05/28 21:04:37 chs Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -125,6 +125,7 @@ static const struct genfs_ops msdosfs_ge .gop_alloc = msdosfs_gop_alloc, .gop_write = genfs_gop_write, .gop_markupdate = msdosfs_gop_markupdate, + .gop_putrange = genfs_gop_putrange, }; MALLOC_DECLARE(M_MSDOSFSFAT); Index: src/sys/fs/nilfs/nilfs_vfsops.c diff -u src/sys/fs/nilfs/nilfs_vfsops.c:1.23 src/sys/fs/nilfs/nilfs_vfsops.c:1.24 --- src/sys/fs/nilfs/nilfs_vfsops.c:1.23 Fri Feb 17 08:31:24 2017 +++ src/sys/fs/nilfs/nilfs_vfsops.c Mon May 28 21:04:37 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: nilfs_vfsops.c,v 1.23 2017/02/17 08:31:24 hannken Exp $ */ +/* $NetBSD: nilfs_vfsops.c,v 1.24 2018/05/28 21:04:37 chs Exp $ */ /* * Copyright (c) 2008, 2009 Reinoud Zandijk @@ -28,7 +28,7 @@ #include <sys/cdefs.h> #ifndef lint -__KERNEL_RCSID(0, "$NetBSD: nilfs_vfsops.c,v 1.23 2017/02/17 08:31:24 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nilfs_vfsops.c,v 1.24 2018/05/28 21:04:37 chs Exp $"); #endif /* not lint */ @@ -148,6 +148,7 @@ static const struct genfs_ops nilfs_genf .gop_alloc = nilfs_gop_alloc, .gop_write = genfs_gop_write_rwmap, .gop_markupdate = nilfs_gop_markupdate, + .gop_putrange = genfs_gop_putrange, }; /* --------------------------------------------------------------------- */ Index: src/sys/fs/puffs/puffs_vfsops.c diff -u src/sys/fs/puffs/puffs_vfsops.c:1.120 src/sys/fs/puffs/puffs_vfsops.c:1.121 --- src/sys/fs/puffs/puffs_vfsops.c:1.120 Sat Apr 1 19:35:56 2017 +++ src/sys/fs/puffs/puffs_vfsops.c Mon May 28 21:04:37 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_vfsops.c,v 1.120 2017/04/01 19:35:56 riastradh Exp $ */ +/* $NetBSD: puffs_vfsops.c,v 1.121 2018/05/28 21:04:37 chs Exp $ */ /* * Copyright (c) 2005, 2006 Antti Kantee. All Rights Reserved. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: puffs_vfsops.c,v 1.120 2017/04/01 19:35:56 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: puffs_vfsops.c,v 1.121 2018/05/28 21:04:37 chs Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -76,6 +76,7 @@ static const struct genfs_ops puffs_genf #if 0 .gop_alloc, should ask userspace #endif + .gop_putrange = genfs_gop_putrange, }; /* Index: src/sys/fs/sysvbfs/sysvbfs.c diff -u src/sys/fs/sysvbfs/sysvbfs.c:1.16 src/sys/fs/sysvbfs/sysvbfs.c:1.17 --- src/sys/fs/sysvbfs/sysvbfs.c:1.16 Fri Feb 17 08:31:24 2017 +++ src/sys/fs/sysvbfs/sysvbfs.c Mon May 28 21:04:37 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: sysvbfs.c,v 1.16 2017/02/17 08:31:24 hannken Exp $ */ +/* $NetBSD: sysvbfs.c,v 1.17 2018/05/28 21:04:37 chs Exp $ */ /*- * Copyright (c) 2004 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sysvbfs.c,v 1.16 2017/02/17 08:31:24 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sysvbfs.c,v 1.17 2018/05/28 21:04:37 chs Exp $"); #include <sys/resource.h> #include <sys/param.h> @@ -108,6 +108,7 @@ const struct genfs_ops sysvbfs_genfsops .gop_size = genfs_size, .gop_alloc = sysvbfs_gop_alloc, .gop_write = genfs_gop_write, + .gop_putrange = genfs_gop_putrange, }; struct vfsops sysvbfs_vfsops = { Index: src/sys/fs/udf/udf_subr.c diff -u src/sys/fs/udf/udf_subr.c:1.139 src/sys/fs/udf/udf_subr.c:1.140 --- src/sys/fs/udf/udf_subr.c:1.139 Sat Apr 1 19:35:56 2017 +++ src/sys/fs/udf/udf_subr.c Mon May 28 21:04:38 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: udf_subr.c,v 1.139 2017/04/01 19:35:56 riastradh Exp $ */ +/* $NetBSD: udf_subr.c,v 1.140 2018/05/28 21:04:38 chs Exp $ */ /* * Copyright (c) 2006, 2008 Reinoud Zandijk @@ -29,7 +29,7 @@ #include <sys/cdefs.h> #ifndef lint -__KERNEL_RCSID(0, "$NetBSD: udf_subr.c,v 1.139 2017/04/01 19:35:56 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udf_subr.c,v 1.140 2018/05/28 21:04:38 chs Exp $"); #endif /* not lint */ @@ -4028,6 +4028,7 @@ static const struct genfs_ops udf_genfso .gop_alloc = udf_gop_alloc, .gop_write = genfs_gop_write_rwmap, .gop_markupdate = udf_gop_markupdate, + .gop_putrange = genfs_gop_putrange, }; Index: src/sys/fs/v7fs/v7fs_extern.c diff -u src/sys/fs/v7fs/v7fs_extern.c:1.5 src/sys/fs/v7fs/v7fs_extern.c:1.6 --- src/sys/fs/v7fs/v7fs_extern.c:1.5 Fri Feb 17 08:31:25 2017 +++ src/sys/fs/v7fs/v7fs_extern.c Mon May 28 21:04:38 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: v7fs_extern.c,v 1.5 2017/02/17 08:31:25 hannken Exp $ */ +/* $NetBSD: v7fs_extern.c,v 1.6 2018/05/28 21:04:38 chs Exp $ */ /*- * Copyright (c) 2004, 2011 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: v7fs_extern.c,v 1.5 2017/02/17 08:31:25 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: v7fs_extern.c,v 1.6 2018/05/28 21:04:38 chs Exp $"); #if defined _KERNEL_OPT #include "opt_v7fs.h" @@ -222,6 +222,7 @@ const struct genfs_ops v7fs_genfsops = { .gop_size = genfs_size, .gop_alloc = v7fs_gop_alloc, .gop_write = genfs_gop_write, + .gop_putrange = genfs_gop_putrange, }; struct vfsops v7fs_vfsops = { Index: src/sys/miscfs/genfs/genfs_io.c diff -u src/sys/miscfs/genfs/genfs_io.c:1.71 src/sys/miscfs/genfs/genfs_io.c:1.72 --- src/sys/miscfs/genfs/genfs_io.c:1.71 Sat Oct 28 00:37:13 2017 +++ src/sys/miscfs/genfs/genfs_io.c Mon May 28 21:04:38 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: genfs_io.c,v 1.71 2017/10/28 00:37:13 pgoyette Exp $ */ +/* $NetBSD: genfs_io.c,v 1.72 2018/05/28 21:04:38 chs Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1993 @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: genfs_io.c,v 1.71 2017/10/28 00:37:13 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: genfs_io.c,v 1.72 2018/05/28 21:04:38 chs Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1120,10 +1120,29 @@ retry: UVM_PAGE_OWN(pg, "genfs_putpages"); /* + * let the fs constrain the offset range of the cluster. + * we additionally constrain the range here such that + * it fits in the "pgs" pages array. + */ + + off_t fslo, fshi, genlo, lo; + GOP_PUTRANGE(vp, off, &fslo, &fshi); + KASSERT(fslo == trunc_page(fslo)); + KASSERT(fslo <= off); + KASSERT(fshi == trunc_page(fshi)); + KASSERT(fshi == 0 || off < fshi); + + if (off > MAXPHYS / 2) + genlo = trunc_page(off - (MAXPHYS / 2)); + else + genlo = 0; + lo = MAX(fslo, genlo); + + /* * first look backward. */ - npages = MIN(MAXPAGES >> 1, off >> PAGE_SHIFT); + npages = (off - lo) >> PAGE_SHIFT; nback = npages; uvn_findpages(uobj, off - PAGE_SIZE, &nback, &pgs[0], UFP_NOWAIT|UFP_NOALLOC|UFP_DIRTYONLY|UFP_BACKWARD); @@ -1150,6 +1169,9 @@ retry: */ npages = MAXPAGES - nback - 1; + if (fshi) + npages = MIN(npages, + (fshi - off - 1) >> PAGE_SHIFT); uvn_findpages(uobj, off + PAGE_SIZE, &npages, &pgs[nback + 1], UFP_NOWAIT|UFP_NOALLOC|UFP_DIRTYONLY); @@ -1314,6 +1336,18 @@ skip_scan: return (error); } +/* + * Default putrange method for file systems that do not care + * how many pages are given to one GOP_WRITE() call. + */ +void +genfs_gop_putrange(struct vnode *vp, off_t off, off_t *lop, off_t *hip) +{ + + *lop = 0; + *hip = 0; +} + int genfs_gop_write(struct vnode *vp, struct vm_page **pgs, int npages, int flags) { Index: src/sys/miscfs/genfs/genfs_node.h diff -u src/sys/miscfs/genfs/genfs_node.h:1.21 src/sys/miscfs/genfs/genfs_node.h:1.22 --- src/sys/miscfs/genfs/genfs_node.h:1.21 Thu Jun 6 02:00:59 2013 +++ src/sys/miscfs/genfs/genfs_node.h Mon May 28 21:04:38 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: genfs_node.h,v 1.21 2013/06/06 02:00:59 dholland Exp $ */ +/* $NetBSD: genfs_node.h,v 1.22 2018/05/28 21:04:38 chs Exp $ */ /* * Copyright (c) 2001 Chuck Silvers. @@ -46,6 +46,7 @@ struct genfs_ops { struct kauth_cred *); int (*gop_write)(struct vnode *, struct vm_page **, int, int); void (*gop_markupdate)(struct vnode *, int); + void (*gop_putrange)(struct vnode *, off_t, off_t *, off_t *); }; #define GOP_SIZE(vp, size, eobp, flags) \ @@ -54,6 +55,8 @@ struct genfs_ops { (*VTOG(vp)->g_op->gop_alloc)((vp), (off), (len), (flags), (cred)) #define GOP_WRITE(vp, pgs, npages, flags) \ (*VTOG(vp)->g_op->gop_write)((vp), (pgs), (npages), (flags)) +#define GOP_PUTRANGE(vp, off, lop, hip) \ + (*VTOG(vp)->g_op->gop_putrange)((vp), (off), (lop), (hip)) /* * GOP_MARKUPDATE: mark vnode's timestamps for update. @@ -85,6 +88,7 @@ struct genfs_node { void genfs_size(struct vnode *, off_t, off_t *, int); void genfs_node_init(struct vnode *, const struct genfs_ops *); void genfs_node_destroy(struct vnode *); +void genfs_gop_putrange(struct vnode *, off_t, off_t *, off_t *); int genfs_gop_write(struct vnode *, struct vm_page **, int, int); int genfs_gop_write_rwmap(struct vnode *, struct vm_page **, int, int); int genfs_compat_gop_write(struct vnode *, struct vm_page **, int, int); Index: src/sys/nfs/nfs_node.c diff -u src/sys/nfs/nfs_node.c:1.122 src/sys/nfs/nfs_node.c:1.123 --- src/sys/nfs/nfs_node.c:1.122 Fri May 26 14:34:20 2017 +++ src/sys/nfs/nfs_node.c Mon May 28 21:04:38 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: nfs_node.c,v 1.122 2017/05/26 14:34:20 riastradh Exp $ */ +/* $NetBSD: nfs_node.c,v 1.123 2018/05/28 21:04:38 chs Exp $ */ /* * Copyright (c) 1989, 1993 @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nfs_node.c,v 1.122 2017/05/26 14:34:20 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nfs_node.c,v 1.123 2018/05/28 21:04:38 chs Exp $"); #ifdef _KERNEL_OPT #include "opt_nfs.h" @@ -73,6 +73,7 @@ static const struct genfs_ops nfs_genfso .gop_size = nfs_gop_size, .gop_alloc = nfs_gop_alloc, .gop_write = nfs_gop_write, + .gop_putrange = genfs_gop_putrange, }; /* Index: src/sys/ufs/chfs/chfs_vfsops.c diff -u src/sys/ufs/chfs/chfs_vfsops.c:1.17 src/sys/ufs/chfs/chfs_vfsops.c:1.18 --- src/sys/ufs/chfs/chfs_vfsops.c:1.17 Tue Nov 14 22:06:40 2017 +++ src/sys/ufs/chfs/chfs_vfsops.c Mon May 28 21:04:38 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: chfs_vfsops.c,v 1.17 2017/11/14 22:06:40 riastradh Exp $ */ +/* $NetBSD: chfs_vfsops.c,v 1.18 2018/05/28 21:04:38 chs Exp $ */ /*- * Copyright (c) 2010 Department of Software Engineering, @@ -99,6 +99,7 @@ const struct genfs_ops chfs_genfsops = { .gop_alloc = chfs_gop_alloc, .gop_write = genfs_gop_write, .gop_markupdate = ufs_gop_markupdate, + .gop_putrange = genfs_gop_putrange, }; struct pool chfs_inode_pool; Index: src/sys/ufs/ext2fs/ext2fs_vfsops.c diff -u src/sys/ufs/ext2fs/ext2fs_vfsops.c:1.210 src/sys/ufs/ext2fs/ext2fs_vfsops.c:1.211 --- src/sys/ufs/ext2fs/ext2fs_vfsops.c:1.210 Sun Jul 30 14:23:54 2017 +++ src/sys/ufs/ext2fs/ext2fs_vfsops.c Mon May 28 21:04:38 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: ext2fs_vfsops.c,v 1.210 2017/07/30 14:23:54 riastradh Exp $ */ +/* $NetBSD: ext2fs_vfsops.c,v 1.211 2018/05/28 21:04:38 chs Exp $ */ /* * Copyright (c) 1989, 1991, 1993, 1994 @@ -60,7 +60,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ext2fs_vfsops.c,v 1.210 2017/07/30 14:23:54 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ext2fs_vfsops.c,v 1.211 2018/05/28 21:04:38 chs Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_netbsd.h" @@ -152,6 +152,7 @@ static const struct genfs_ops ext2fs_gen .gop_alloc = ext2fs_gop_alloc, .gop_write = genfs_gop_write, .gop_markupdate = ufs_gop_markupdate, + .gop_putrange = genfs_gop_putrange, }; static const struct ufs_ops ext2fs_ufsops = { Index: src/sys/ufs/ffs/ffs_vfsops.c diff -u src/sys/ufs/ffs/ffs_vfsops.c:1.356 src/sys/ufs/ffs/ffs_vfsops.c:1.357 --- src/sys/ufs/ffs/ffs_vfsops.c:1.356 Sun Jan 28 10:02:00 2018 +++ src/sys/ufs/ffs/ffs_vfsops.c Mon May 28 21:04:38 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: ffs_vfsops.c,v 1.356 2018/01/28 10:02:00 hannken Exp $ */ +/* $NetBSD: ffs_vfsops.c,v 1.357 2018/05/28 21:04:38 chs Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.356 2018/01/28 10:02:00 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.357 2018/05/28 21:04:38 chs Exp $"); #if defined(_KERNEL_OPT) #include "opt_ffs.h" @@ -178,6 +178,7 @@ static const struct genfs_ops ffs_genfso .gop_alloc = ufs_gop_alloc, .gop_write = genfs_gop_write, .gop_markupdate = ufs_gop_markupdate, + .gop_putrange = genfs_gop_putrange, }; static const struct ufs_ops ffs_ufsops = { Index: src/sys/ufs/lfs/lfs_vfsops.c diff -u src/sys/ufs/lfs/lfs_vfsops.c:1.361 src/sys/ufs/lfs/lfs_vfsops.c:1.362 --- src/sys/ufs/lfs/lfs_vfsops.c:1.361 Sat Oct 28 00:37:13 2017 +++ src/sys/ufs/lfs/lfs_vfsops.c Mon May 28 21:04:38 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_vfsops.c,v 1.361 2017/10/28 00:37:13 pgoyette Exp $ */ +/* $NetBSD: lfs_vfsops.c,v 1.362 2018/05/28 21:04:38 chs Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003, 2007, 2007 @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.361 2017/10/28 00:37:13 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.362 2018/05/28 21:04:38 chs Exp $"); #if defined(_KERNEL_OPT) #include "opt_lfs.h" @@ -176,6 +176,7 @@ const struct genfs_ops lfs_genfsops = { .gop_alloc = ulfs_gop_alloc, .gop_write = lfs_gop_write, .gop_markupdate = ulfs_gop_markupdate, + .gop_putrange = genfs_gop_putrange, }; struct shortlong {