Date: Thu, 16 Sep 2010 13:25:48 GMT From: Zheng Liu <lz@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 183858 for review Message-ID: <201009161325.o8GDPmEc012714@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@183858?ac=10 Change 183858 by lz@gnehzuil-freebsd on 2010/09/16 13:25:00 Make ext4fs can be compiled. Affected files ... .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_alloc.c#2 edit .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_balloc.c#2 edit .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_bmap.c#2 edit .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_dinode.h#2 edit .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_dir.h#2 edit .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_extents.c#2 edit .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_extents.h#2 edit .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_extern.h#2 edit .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_htree.c#2 edit .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_htree.h#2 edit .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_inode.c#2 edit .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_inode_cnv.c#2 edit .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_lookup.c#2 edit .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_mount.h#2 edit .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_readwrite.c#2 edit .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_rsv_win.h#2 edit .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_subr.c#2 edit .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_vfsops.c#2 edit .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_vnops.c#2 edit .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4fs.h#2 edit .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/fs.h#2 edit .. //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/inode.h#2 edit Differences ... ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_alloc.c#2 (text+ko) ==== @@ -33,7 +33,7 @@ * SUCH DAMAGE. * * @(#)ffs_alloc.c 8.8 (Berkeley) 2/21/94 - * $FreeBSD: src/sys/fs/ext2fs/ext2_alloc.c,v 1.1 2010/01/14 14:30:54 lulf Exp $ + * $FreeBSD: src/sys/fs/ext4fs/ext4_alloc.c,v 1.1 2010/09/16 20:35:00 lz Exp $ */ #include <sys/param.h> @@ -45,12 +45,12 @@ #include <sys/syslog.h> #include <sys/buf.h> -#include <fs/ext2fs/inode.h> -#include <fs/ext2fs/ext2_mount.h> -#include <fs/ext2fs/ext2fs.h> -#include <fs/ext2fs/fs.h> -#include <fs/ext2fs/ext2_extern.h> -#include <fs/ext2fs/ext2_rsv_win.h> +#include <fs/ext4fs/inode.h> +#include <fs/ext4fs/ext4_mount.h> +#include <fs/ext4fs/ext4fs.h> +#include <fs/ext4fs/fs.h> +#include <fs/ext4fs/ext4_extern.h> +#include <fs/ext4fs/ext4_rsv_win.h> /* Just for clear */ #define phy_blk(cg, fs) (((cg) * (fs->e2fs->e2fs_fpg)) + fs->e2fs->e2fs_first_dblock) ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_balloc.c#2 (text+ko) ==== @@ -33,7 +33,7 @@ * SUCH DAMAGE. * * @(#)ffs_balloc.c 8.4 (Berkeley) 9/23/93 - * $FreeBSD: src/sys/fs/ext2fs/ext2_balloc.c,v 1.1 2010/01/14 14:30:54 lulf Exp $ + * $FreeBSD: src/sys/fs/ext4fs/ext4_balloc.c,v 1.1 2010/09/16 20:35:00 lz Exp $ */ #include <sys/param.h> @@ -44,12 +44,12 @@ #include <sys/ucred.h> #include <sys/vnode.h> -#include <fs/ext2fs/inode.h> -#include <fs/ext2fs/ext2fs.h> -#include <fs/ext2fs/fs.h> -#include <fs/ext2fs/ext2_extern.h> -#include <fs/ext2fs/ext2_mount.h> -#include <fs/ext2fs/ext2_rsv_win.h> +#include <fs/ext4fs/inode.h> +#include <fs/ext4fs/ext4fs.h> +#include <fs/ext4fs/fs.h> +#include <fs/ext4fs/ext4_extern.h> +#include <fs/ext4fs/ext4_mount.h> +#include <fs/ext4fs/ext4_rsv_win.h> /* * Balloc defines the structure of file system storage * by allocating the physical blocks on a device given ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_bmap.c#2 (text+ko) ==== @@ -32,7 +32,7 @@ * SUCH DAMAGE. * * @(#)ufs_bmap.c 8.7 (Berkeley) 3/21/95 - * $FreeBSD: src/sys/fs/ext2fs/ext2_bmap.c,v 1.1 2010/01/14 14:30:54 lulf Exp $ + * $FreeBSD: src/sys/fs/ext4fs/ext4_bmap.c,v 1.1 2010/09/16 20:36:00 lz Exp $ */ #include <sys/param.h> @@ -45,12 +45,12 @@ #include <sys/resourcevar.h> #include <sys/stat.h> -#include <fs/ext2fs/inode.h> -#include <fs/ext2fs/fs.h> -#include <fs/ext2fs/ext2fs.h> -#include <fs/ext2fs/ext2_mount.h> -#include <fs/ext2fs/ext2_extern.h> -#include <fs/ext2fs/ext2_dinode.h> +#include <fs/ext4fs/inode.h> +#include <fs/ext4fs/fs.h> +#include <fs/ext4fs/ext4fs.h> +#include <fs/ext4fs/ext4_mount.h> +#include <fs/ext4fs/ext4_extern.h> +#include <fs/ext4fs/ext4_dinode.h> static int ext4_bmapext(struct vnode *, int32_t, int64_t *, int *, int *); ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_dinode.h#2 (text+ko) ==== @@ -23,11 +23,11 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/fs/ext2fs/ext2_dinode.h,v 1.1 2010/01/14 14:30:54 lulf Exp $ + * $FreeBSD: src/sys/fs/ext4fs/ext4_dinode.h,v 1.1 2010/09/16 20:34:00 lz Exp $ */ -#ifndef _FS_EXT2FS_EXT2_DINODE_H_ -#define _FS_EXT2FS_EXT2_DINODE_H_ +#ifndef _FS_EXT4FS_EXT4_DINODE_H_ +#define _FS_EXT4FS_EXT4_DINODE_H_ /* * Inode flags @@ -121,5 +121,4 @@ u_int32_t e2di_version_hi; }; -#endif /* _FS_EXT2FS_EXT2_DINODE_H_ */ - +#endif /* _FS_EXT4FS_EXT4_DINODE_H_ */ ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_dir.h#2 (text+ko) ==== @@ -23,11 +23,11 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/fs/ext2fs/ext2_dir.h,v 1.1 2010/01/14 14:30:54 lulf Exp $ + * $FreeBSD: src/sys/fs/ext4fs/ext4_dir.h,v 1.1 2010/09/16 20:37:00 lz Exp $ */ -#ifndef _FS_EXT2FS_EXT2_DIR_H_ -#define _FS_EXT2FS_EXT2_DIR_H_ +#ifndef _FS_EXT4FS_EXT4_DIR_H_ +#define _FS_EXT4FS_EXT4_DIR_H_ /* * Structure of a directory entry @@ -77,5 +77,4 @@ #define EXT2_DIR_ROUND (EXT2_DIR_PAD - 1) #define EXT2_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT2_DIR_ROUND) & \ ~EXT2_DIR_ROUND) -#endif /* !_FS_EXT2FS_EXT2_DIR_H_ */ - +#endif /* !_FS_EXT4FS_EXT4_DIR_H_ */ ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_extents.c#2 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/fs/ext2fs/ext2_extents.c,v 0.1 2010/07/02 17:22:00 lz Exp $ + * $FreeBSD: src/sys/fs/ext4fs/ext4_extents.c,v 0.1 2010/09/16 20:37:00 lz Exp $ */ #include <sys/param.h> @@ -36,12 +36,12 @@ #include <sys/buf.h> #include <sys/conf.h> -#include <fs/ext2fs/ext2_mount.h> -#include <fs/ext2fs/fs.h> -#include <fs/ext2fs/inode.h> -#include <fs/ext2fs/ext2fs.h> -#include <fs/ext2fs/ext2_extents.h> -#include <fs/ext2fs/ext2_extern.h> +#include <fs/ext4fs/ext4_mount.h> +#include <fs/ext4fs/fs.h> +#include <fs/ext4fs/inode.h> +#include <fs/ext4fs/ext4fs.h> +#include <fs/ext4fs/ext4_extents.h> +#include <fs/ext4fs/ext4_extern.h> static void ext4_ext_binsearch_index(struct inode *, struct ext4_extent_path *, daddr_t); static void ext4_ext_binsearch(struct inode *, struct ext4_extent_path *, daddr_t); ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_extents.h#2 (text+ko) ==== @@ -23,10 +23,10 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/fs/ext2fs/ext2_extents.h,v 0.1 2010/06/22 18:01:51 lz Exp $ + * $FreeBSD: src/sys/fs/ext4fs/ext4_extents.h,v 0.1 2010/09/16 20:38:51 lz Exp $ */ -#ifndef _FS_EXT2FS_EXT2_EXTENTS_H_ -#define _FS_EXT2FS_EXT2_EXTENTS_H_ +#ifndef _FS_EXT4FS_EXT4_EXTENTS_H_ +#define _FS_EXT4FS_EXT4_EXTENTS_H_ #include <sys/types.h> @@ -100,4 +100,4 @@ struct ext4_extent_path *ext4_ext_find_extent(struct m_ext2fs *fs, struct inode *, daddr_t, struct ext4_extent_path *); -#endif /* !_FS_EXT2FS_EXT2_EXTENTS_H_ */ +#endif /* !_FS_EXT4FS_EXT4_EXTENTS_H_ */ ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_extern.h#2 (text+ko) ==== @@ -33,11 +33,11 @@ * SUCH DAMAGE. * * @(#)ffs_extern.h 8.3 (Berkeley) 4/16/94 - * $FreeBSD: src/sys/fs/ext2fs/ext2_extern.h,v 1.1 2010/01/14 14:30:54 lulf Exp $ + * $FreeBSD: src/sys/fs/ext4fs/ext4_extern.h,v 1.1 2010/09/16 20:38:54 lz Exp $ */ -#ifndef _FS_EXT2FS_EXT2_EXTERN_H_ -#define _FS_EXT2FS_EXT2_EXTERN_H_ +#ifndef _FS_EXT4FS_EXT4_EXTERN_H_ +#define _FS_EXT4FS_EXT4_EXTERN_H_ struct ext2fs_dinode; struct indir; @@ -90,4 +90,4 @@ extern struct vop_vector ext2_vnodeops; extern struct vop_vector ext2_fifoops; -#endif /* !_FS_EXT2FS_EXT2_EXTERN_H_ */ +#endif /* !_FS_EXT4FS_EXT4_EXTERN_H_ */ ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_htree.c#2 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/fs/ext2fs/ext2_htree.c,v 0.1 2010/08/01 15:02:00 lz Exp $ + * $FreeBSD: src/sys/fs/ext4fs/ext4_htree.c,v 0.1 2010/09/16 20:39:00 lz Exp $ */ #include <sys/param.h> @@ -34,14 +34,14 @@ #include <sys/buf.h> #include <sys/hash.h> -#include <fs/ext2fs/inode.h> -#include <fs/ext2fs/ext2_mount.h> -#include <fs/ext2fs/ext2fs.h> -#include <fs/ext2fs/fs.h> -#include <fs/ext2fs/ext2_extern.h> -#include <fs/ext2fs/ext2_dinode.h> -#include <fs/ext2fs/ext2_dir.h> -#include <fs/ext2fs/ext2_htree.h> +#include <fs/ext4fs/inode.h> +#include <fs/ext4fs/ext4_mount.h> +#include <fs/ext4fs/ext4fs.h> +#include <fs/ext4fs/fs.h> +#include <fs/ext4fs/ext4_extern.h> +#include <fs/ext4fs/ext4_dinode.h> +#include <fs/ext4fs/ext4_dir.h> +#include <fs/ext4fs/ext4_htree.h> static int ext4_get_limit(struct dirindex_entry *); static int ext4_root_limit(struct inode *, int); ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_htree.h#2 (text+ko) ==== @@ -23,10 +23,10 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/fs/ext2fs/ext2_htree.h,v 0.1 2010/08/01 14:45:00 lz Exp $ + * $FreeBSD: src/sys/fs/ext4fs/ext4_htree.h,v 0.1 2010/09/16 20:40:00 lz Exp $ */ -#ifndef _FS_EXT2FS_EXT2_HTREE_H_ -#define _FS_EXT2FS_EXT2_HTREE_H_ +#ifndef _FS_EXT4FS_EXT4_HTREE_H_ +#define _FS_EXT4FS_EXT4_HTREE_H_ #define DIRINDEX_HASH_LEGACY 0 #define DIRINDEX_HASH_HALF_MD4 1 @@ -99,4 +99,4 @@ int ext4_dirindex_lookup(struct vnode *, char *, int, doff_t *, struct buf **, doff_t *prevoffp); -#endif /* !_FS_EXT2FS_EXT2_HTREE_H_ */ +#endif /* !_FS_EXT4FS_EXT4_HTREE_H_ */ ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_inode.c#2 (text+ko) ==== @@ -33,7 +33,7 @@ * SUCH DAMAGE. * * @(#)ffs_inode.c 8.5 (Berkeley) 12/30/93 - * $FreeBSD: src/sys/fs/ext2fs/ext2_inode.c,v 1.1 2010/01/14 14:30:54 lulf Exp $ + * $FreeBSD: src/sys/fs/ext4fs/ext4_inode.c,v 1.1 2010/09/16 20:40:54 lz Exp $ */ #include <sys/param.h> @@ -47,11 +47,12 @@ #include <vm/vm.h> #include <vm/vm_extern.h> -#include <fs/ext2fs/inode.h> -#include <fs/ext2fs/ext2_mount.h> -#include <fs/ext2fs/ext2fs.h> -#include <fs/ext2fs/fs.h> -#include <fs/ext2fs/ext2_extern.h> +#include <fs/ext4fs/inode.h> +#include <fs/ext4fs/ext4_mount.h> +#include <fs/ext4fs/ext4fs.h> +#include <fs/ext4fs/fs.h> +#include <fs/ext4fs/ext4_extern.h> +#include <fs/ext4fs/ext4_rsv_win.h> static int ext2_indirtrunc(struct inode *, int32_t, int32_t, int32_t, int, long *); @@ -154,6 +155,10 @@ fs = oip->i_e2fs; osize = oip->i_size; + EXT2_RSV_LOCK(oip); + ext2_discard_rsv(oip); + EXT2_RSV_UNLOCK(oip); + /* * Lengthen the size of the file. We must ensure that the * last byte of the file is allocated. Since the smallest @@ -485,6 +490,10 @@ if (prtactive && vrefcnt(vp) != 0) vprint("ext2_inactive: pushing active", vp); + EXT2_RSV_LOCK(ip); + ext2_discard_rsv(ip); + EXT2_RSV_UNLOCK(ip); + /* * Ignore inodes related to stale file handles. */ @@ -533,6 +542,14 @@ } vfs_hash_remove(vp); + EXT2_RSV_LOCK(ip); + if (ip->i_rsv != NULL) { + free(ip->i_rsv, M_EXT2NODE); + ip->i_rsv = NULL; + } + EXT2_RSV_UNLOCK(ip); + mtx_destroy(&ip->i_rsv_lock); + mtx_destroy(&ip->i_ext_lock); free(vp->v_data, M_EXT2NODE); ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_inode_cnv.c#2 (text+ko) ==== @@ -19,7 +19,7 @@ * improvements that they make and grant CSL redistribution rights. * * Utah $Hdr$ - * $FreeBSD: src/sys/fs/ext2fs/ext2_inode_cnv.c,v 1.1 2010/01/14 14:30:54 lulf Exp $ + * $FreeBSD: src/sys/fs/ext4fs/ext4_inode_cnv.c,v 1.1 2010/09/16 20:41:00 lz Exp $ */ /* @@ -31,11 +31,11 @@ #include <sys/stat.h> #include <sys/vnode.h> -#include <fs/ext2fs/inode.h> -#include <fs/ext2fs/ext2fs.h> -#include <fs/ext2fs/ext2_extern.h> -#include <fs/ext2fs/ext2_dinode.h> -#include <fs/ext2fs/ext2_extents.h> +#include <fs/ext4fs/inode.h> +#include <fs/ext4fs/ext4fs.h> +#include <fs/ext4fs/ext4_extern.h> +#include <fs/ext4fs/ext4_dinode.h> +#include <fs/ext4fs/ext4_extents.h> void ext2_print_inode( in ) ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_lookup.c#2 (text+ko) ==== @@ -38,7 +38,7 @@ * SUCH DAMAGE. * * @(#)ufs_lookup.c 8.6 (Berkeley) 4/1/94 - * $FreeBSD: src/sys/fs/ext2fs/ext2_lookup.c,v 1.1 2010/01/14 14:30:54 lulf Exp $ + * $FreeBSD: src/sys/fs/ext4fs/ext4_lookup.c,v 1.1 2010/09/16 20:42:54 lz Exp $ */ #include <sys/param.h> @@ -55,11 +55,12 @@ #include <ufs/ufs/dir.h> -#include <fs/ext2fs/inode.h> -#include <fs/ext2fs/ext2_mount.h> -#include <fs/ext2fs/ext2_extern.h> -#include <fs/ext2fs/ext2fs.h> -#include <fs/ext2fs/ext2_dir.h> +#include <fs/ext4fs/inode.h> +#include <fs/ext4fs/ext4_mount.h> +#include <fs/ext4fs/ext4_extern.h> +#include <fs/ext4fs/ext4fs.h> +#include <fs/ext4fs/ext4_dir.h> +#include <fs/ext4fs/ext4_htree.h> #ifdef DIAGNOSTIC static int dirchk = 1; @@ -348,6 +349,25 @@ cnp->cn_namelen + 3) &~ 3; */ } + bmask = VFSTOEXT2(vdp->v_mount)->um_mountp->mnt_stat.f_iosize - 1; + + /* Usr hash directory index to search a large direcotries. */ + numdirpasses = 2; + prevoff = 0; + if (ext4_is_dirindex(dp)) { + switch (ext4_dirindex_lookup(vdp, cnp->cn_nameptr, + cnp->cn_namelen, &i_offset, &bp, NULL)) { + case 0: + ep = (struct ext2fs_direct_2 *)((char *)bp->b_data + + (i_offset & bmask)); + entryoffsetinblock = i_offset; + goto dirindex_found; + case ENOENT: + default: + break; + } + } + /* * If there is cached information on a previous search of * this directory, pick up where we last left off. @@ -359,7 +379,6 @@ * profiling time and hence has been removed in the interest * of simplicity. */ - bmask = VFSTOEXT2(vdp->v_mount)->um_mountp->mnt_stat.f_iosize - 1; if (nameiop != LOOKUP || i_diroff == 0 || i_diroff > dp->i_size) { entryoffsetinblock = 0; @@ -462,6 +481,7 @@ * reclen in ndp->ni_ufs area, and release * directory buffer. */ +dirindex_found: ino = ep->e2d_ino; goto found; } ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_mount.h#2 (text+ko) ==== @@ -27,11 +27,11 @@ * SUCH DAMAGE. * * @(#)ufsmount.h 8.6 (Berkeley) 3/30/95 - * $FreeBSD: src/sys/fs/ext2fs/ext2_mount.h,v 1.1 2010/01/14 14:30:54 lulf Exp $ + * $FreeBSD: src/sys/fs/ext4fs/ext4_mount.h,v 1.1 2010/09/16 20:42:00 lz Exp $ */ -#ifndef _FS_EXT2FS_EXT2_MOUNT_H_ -#define _FS_EXT2FS_EXT2_MOUNT_H_ +#ifndef _FS_EXT4FS_EXT4_MOUNT_H_ +#define _FS_EXT4FS_EXT4_MOUNT_H_ #ifdef _KERNEL @@ -76,4 +76,4 @@ #define is_sequential(ump, a, b) ((b) == (a) + ump->um_seqinc) #endif /* _KERNEL */ -#endif +#endif /* _FS_EXT4FS_EXT4_MOUNT_H_ */ ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_readwrite.c#2 (text+ko) ==== @@ -33,11 +33,11 @@ * SUCH DAMAGE. * * @(#)ufs_readwrite.c 8.7 (Berkeley) 1/21/94 - * $FreeBSD: src/sys/fs/ext2fs/ext2_readwrite.c,v 1.1 2010/01/14 14:30:54 lulf Exp $ + * $FreeBSD: src/sys/fs/ext4fs/ext4_readwrite.c,v 1.1 2010/09/16 20:43:00 lz Exp $ */ -#include <fs/ext2fs/ext2_dinode.h> -#include <fs/ext2fs/ext2_extents.h> +#include <fs/ext4fs/ext4_dinode.h> +#include <fs/ext4fs/ext4_extents.h> /* XXX TODO: remove these obfuscations (as in ffs_vnops.c). */ #define BLKSIZE(a, b, c) blksize(a, b, c) ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_rsv_win.h#2 (text+ko) ==== @@ -23,10 +23,10 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/fs/ext2fs/ext2_rsv_win.h,v 0.1 2010/05/08 12:41:51 lz Exp $ + * $FreeBSD: src/sys/fs/ext4fs/ext4_rsv_win.h,v 0.1 2010/09/16 20:43:51 lz Exp $ */ -#ifndef _FS_EXT2FS_EXT2_RSV_WIN_H_ -#define _FS_EXT2FS_EXT2_RSV_WIN_H_ +#ifndef _FS_EXT4FS_EXT4_RSV_WIN_H_ +#define _FS_EXT4FS_EXT4_RSV_WIN_H_ #include <sys/tree.h> @@ -76,4 +76,4 @@ int ext2_alloc_rsv(struct inode *, int32_t, int32_t, int, struct ucred *, int32_t *); -#endif /* !_FS_EXT2FS_EXT2_RSV_WIN_H_ */ +#endif /* !_FS_EXT4FS_EXT4_RSV_WIN_H_ */ ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_subr.c#2 (text+ko) ==== @@ -33,7 +33,7 @@ * SUCH DAMAGE. * * @(#)ffs_subr.c 8.2 (Berkeley) 9/21/93 - * $FreeBSD: src/sys/fs/ext2fs/ext2_subr.c,v 1.1 2010/01/14 14:30:54 lulf Exp $ + * $FreeBSD: src/sys/fs/ext4fs/ext4_subr.c,v 1.1 2010/09/16 20:44:00 lz Exp $ */ #include <sys/param.h> @@ -46,11 +46,11 @@ #include <sys/ucred.h> #include <sys/vnode.h> -#include <fs/ext2fs/inode.h> -#include <fs/ext2fs/ext2_extern.h> -#include <fs/ext2fs/ext2fs.h> -#include <fs/ext2fs/fs.h> -#include <fs/ext2fs/ext2_extents.h> +#include <fs/ext4fs/inode.h> +#include <fs/ext4fs/ext4_extern.h> +#include <fs/ext4fs/ext4fs.h> +#include <fs/ext4fs/fs.h> +#include <fs/ext4fs/ext4_extents.h> #ifdef KDB void ext2_checkoverlap(struct buf *, struct inode *); ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_vfsops.c#2 (text+ko) ==== @@ -33,7 +33,7 @@ * SUCH DAMAGE. * * @(#)ffs_vfsops.c 8.8 (Berkeley) 4/18/94 - * $FreeBSD: src/sys/fs/ext2fs/ext2_vfsops.c,v 1.1 2010/01/14 14:30:54 lulf Exp $ + * $FreeBSD: src/sys/fs/ext4fs/ext4_vfsops.c,v 1.1 2010/09/16 20:44:00 lz Exp $ */ #include <sys/param.h> @@ -58,13 +58,13 @@ #include <geom/geom.h> #include <geom/geom_vfs.h> -#include <fs/ext2fs/ext2_mount.h> -#include <fs/ext2fs/inode.h> +#include <fs/ext4fs/ext4_mount.h> +#include <fs/ext4fs/inode.h> -#include <fs/ext2fs/fs.h> -#include <fs/ext2fs/ext2_extern.h> -#include <fs/ext2fs/ext2fs.h> -#include <fs/ext2fs/ext2_dinode.h> +#include <fs/ext4fs/fs.h> +#include <fs/ext4fs/ext4_extern.h> +#include <fs/ext4fs/ext4fs.h> +#include <fs/ext4fs/ext4_dinode.h> static int ext2_flushfiles(struct mount *mp, int flags, struct thread *td); static int ext2_mountfs(struct vnode *, struct mount *); @@ -98,6 +98,8 @@ int ronly); static int compute_sb_data(struct vnode * devvp, struct ext2fs * es, struct m_ext2fs * fs); +static int ext4_init_fg(struct m_ext2fs *); +static int find_most_set_bit(int64_t n); static const char *ext2_opts[] = { "from", "export", "acls", "noexec", "noatime", "union", "suiddir", "multilabel", "nosymfollow", @@ -353,6 +355,7 @@ fs->e2fs_ipb = fs->e2fs_bsize / EXT2_INODE_SIZE(fs); fs->e2fs_itpg = fs->e2fs_ipg /fs->e2fs_ipb; fs->e2fs_descpb = fs->e2fs_bsize / sizeof (struct ext2_gd); + fs->e2fs_descpbbits = find_most_set_bit(fs->e2fs_descpb); /* s_resuid / s_resgid ? */ fs->e2fs_gcount = (((int64_t)(es->e2fs_bcount_hi) << 32 | es->e2fs_bcount_lo) - es->e2fs_first_dblock + EXT2_BLOCKS_PER_GROUP(fs) - 1) / @@ -389,6 +392,9 @@ bp = NULL; } + /* initialize flex groups */ + ext4_init_fg(fs); + fs->e2fs_total_dir = 0; for (i=0; i < fs->e2fs_gcount; i++){ fs->e2fs_total_dir += (fs->e2fs_gd[i].ext2bgd_ndirs_lo); @@ -414,11 +420,77 @@ } if (E2FS_REV0_INODE_SIZE + fs->e2fs_want_extra_isize > - fs->e2fs_isize) + fs->e2fs_isize) { printf("EXT2-fs: no space for extra inode.\n"); + return (EIO); + } + + return (0); +} +/* + * Initialize flex groups data structure. + */ +static int +ext4_init_fg(struct m_ext2fs *fs) +{ + struct ext2fs *es = fs->e2fs; + int i, gpf = 0; + unsigned int fgcount, fg; + long nifree, nbfree, ndirs; - return (0); + fs->e2fs_log_gpf = es->e2fs_log_gpf; + gpf = 1 << fs->e2fs_log_gpf; + + if (gpf < 2) { + fs->e2fs_log_gpf = 0; + return (0); + } + + fgcount = ((fs->e2fs_gcount + gpf - 1) + + ((es->e2fs_reserved_ngdb + 1) << fs->e2fs_descpbbits)) / gpf; + + fs->e2fs_fg = malloc(fgcount * sizeof(struct ext4_flex_groups), + M_EXT2MNT, M_WAITOK | M_ZERO); + + for (i = 0; i < fs->e2fs_gcount; i++) { + nifree = 0; + nbfree = 0; + ndirs = 0; + fg = i >> fs->e2fs_log_gpf; + + /* XXX: need to support 64 bits. */ + nifree = fs->e2fs_gd[i].ext2bgd_nifree_lo; + nbfree = fs->e2fs_gd[i].ext2bgd_nbfree_lo; + ndirs = fs->e2fs_gd[i].ext2bgd_ndirs_lo; + + atomic_add_long(&fs->e2fs_fg[fg].e2fg_nifree, nifree); + atomic_add_long(&fs->e2fs_fg[fg].e2fg_nbfree, nbfree); + atomic_add_long(&fs->e2fs_fg[fg].e2fg_ndirs, ndirs); + } + + return (0); +} + +/* + * Find most significant set bit. + * + * TODO: Maybe it need to rewrite by assembly language for + * improving the performance. + */ +static int +find_most_set_bit(int64_t n) +{ + int64_t num, i; + unsigned int pos, res = 0; + + for (num = 1; num <= n; num++) { + for (i = (num >> 1), pos = 0; i != 0; pos++) + i >>= 1; + res = pos; + } + + return res; } /* @@ -606,6 +678,12 @@ if ((error = compute_sb_data(devvp, ump->um_e2fs->e2fs, ump->um_e2fs))) goto out; + /* Initial reservation window index and lock */ + bzero(&ump->um_e2fs->e2fs_rsv_lock, sizeof(struct mtx)); + mtx_init(&ump->um_e2fs->e2fs_rsv_lock, + "rsv tree lock", NULL, MTX_DEF); + RB_INIT(&ump->um_e2fs->e2fs_rsv_tree); + brelse(bp); bp = NULL; fs = ump->um_e2fs; @@ -705,6 +783,8 @@ g_topology_unlock(); PICKUP_GIANT(); vrele(ump->um_devvp); + mtx_destroy(&fs->e2fs_rsv_lock); + free(fs->e2fs_fg, M_EXT2MNT); free(fs->e2fs_gd, M_EXT2MNT); free(fs->e2fs_contigdirs, M_EXT2MNT); free(fs->e2fs, M_EXT2MNT); @@ -948,6 +1028,15 @@ ip->i_prealloc_count = 0; ip->i_prealloc_block = 0; + /* initialize rsv lock and rsv data structure */ + bzero(&ip->i_rsv_lock, sizeof(struct mtx)); + mtx_init(&ip->i_rsv_lock, "inode rsv lock", NULL, MTX_DEF); + EXT2_RSV_LOCK(ip); + ip->i_rsv = NULL; + if (ip->i_rsv == NULL) + ext2_init_rsv(ip); + EXT2_RSV_UNLOCK(ip); + /* initialize ext lock */ bzero(&ip->i_ext_lock, sizeof(struct mtx)); mtx_init(&ip->i_ext_lock, "inode ext lock", NULL, MTX_DEF); ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4_vnops.c#2 (text+ko) ==== @@ -39,7 +39,7 @@ * * @(#)ufs_vnops.c 8.7 (Berkeley) 2/3/94 * @(#)ufs_vnops.c 8.27 (Berkeley) 5/27/95 - * $FreeBSD: src/sys/fs/ext2fs/ext2_vnops.c,v 1.3 2010/02/20 10:19:19 uqs Exp $ + * $FreeBSD: src/sys/fs/ext4fs/ext4_vnops.c,v 1.3 2010/09/16 20:45:00 lz Exp $ */ #include "opt_suiddir.h" @@ -74,12 +74,12 @@ #include <sys/signalvar.h> #include <ufs/ufs/dir.h> -#include <fs/ext2fs/inode.h> -#include <fs/ext2fs/ext2_mount.h> -#include <fs/ext2fs/fs.h> -#include <fs/ext2fs/ext2_extern.h> -#include <fs/ext2fs/ext2fs.h> -#include <fs/ext2fs/ext2_dir.h> +#include <fs/ext4fs/inode.h> +#include <fs/ext4fs/ext4_mount.h> +#include <fs/ext4fs/fs.h> +#include <fs/ext4fs/ext4_extern.h> +#include <fs/ext4fs/ext4fs.h> +#include <fs/ext4fs/ext4_dir.h> static int ext2_makeinode(int mode, struct vnode *, struct vnode **, struct componentname *); static void ext2_itimes_locked(struct vnode *); ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/ext4fs.h#2 (text+ko) ==== @@ -4,7 +4,7 @@ * Aug 1995, Godmar Back (gback@cs.utah.edu) * University of Utah, Department of Computer Science * - * $FreeBSD: src/sys/fs/ext2fs/ext2fs.h,v 1.1 2010/01/14 14:30:54 lulf Exp $ + * $FreeBSD: src/sys/fs/ext4fs/ext4fs.h,v 1.1 2010/09/16 20:46:00 lz Exp $ */ /*- * Copyright (c) 2009 Aditya Sarawgi @@ -34,12 +34,14 @@ * */ -#ifndef _FS_EXT2FS_EXT2_FS_H -#define _FS_EXT2FS_EXT2_FS_H +#ifndef _FS_EXT4FS_EXT4_FS_H +#define _FS_EXT4FS_EXT4_FS_H #include <sys/types.h> #include <sys/lock.h> +#include <fs/ext4fs/ext4_rsv_win.h> + /* * Special inode numbers */ @@ -91,6 +93,15 @@ */ #define MAXMNTLEN 512 +/* ext4 flex block group data structure */ +struct ext4_flex_groups { + long e2fg_nifree; + long e2fg_nbfree; + long e2fg_ndirs; +}; + +#define EXT4_FLEX_ALLOC_DIR_SIZE 4 + /* * Super block for an ext2fs file system. */ @@ -204,6 +215,13 @@ off_t e2fs_maxfilesize; struct ext2_gd *e2fs_gd; /* Group Descriptors */ + struct mtx e2fs_rsv_lock; /* Protect reservation window RB tree */ + struct ext2_rsv_win_tree e2fs_rsv_tree; /* Reservation window index */ + + u_int8_t e2fs_log_gpf; /* FLEX_BG group size */ + int e2fs_descpbbits; + struct ext4_flex_groups *e2fs_fg; + u_int16_t e2fs_min_extra_isize; /* all inodes have at least some bytes */ u_int16_t e2fs_want_extra_isize; /* new inodes should reserve some bytes */ }; @@ -399,4 +417,4 @@ #endif -#endif /* _LINUX_EXT2_FS_H */ +#endif /* _LINUX_EXT4_FS_H */ ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/fs.h#2 (text+ko) ==== ==== //depot/projects/soc2010/ext4fs/src/sys/fs/ext4fs/inode.h#2 (text+ko) ==== @@ -35,15 +35,15 @@ * $FreeBSD: src/sys/fs/ext2fs/inode.h,v 1.1 2010/01/14 14:30:54 lulf Exp $ */ -#ifndef _FS_EXT2FS_INODE_H_ -#define _FS_EXT2FS_INODE_H_ +#ifndef _FS_EXT4FS_INODE_H_ +#define _FS_EXT4FS_INODE_H_ #include <sys/param.h> #include <sys/lock.h> #include <sys/mutex.h> #include <sys/queue.h> -#include <fs/ext2fs/ext2_extents.h> +#include <fs/ext4fs/ext4_extents.h> #define ROOTINO ((ino_t)2) @@ -105,6 +105,10 @@ u_int32_t i_uid; /* File owner. */ u_int32_t i_gid; /* File group. */ + /* Fields for reservation window */ + struct mtx i_rsv_lock; /* Protects i_rsv */ + struct ext2_rsv_win *i_rsv; /* Reservation window */ + /* ext4 extents support */ struct mtx i_ext_lock; /* this lock only is required in read/write mode but we still use it in read-only mode. */ @@ -176,4 +180,4 @@ }; #endif /* _KERNEL */ -#endif /* !_FS_EXT2FS_INODE_H_ */ +#endif /* !_FS_EXT4FS_INODE_H_ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201009161325.o8GDPmEc012714>