Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 31 Jan 2014 03:58:36 +0000 (UTC)
From:      "Pedro F. Giffuni" <pfg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r261311 - stable/10/sys/fs/ext2fs
Message-ID:  <201401310358.s0V3wamb094996@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: pfg
Date: Fri Jan 31 03:58:36 2014
New Revision: 261311
URL: http://svnweb.freebsd.org/changeset/base/261311

Log:
  MFC	r260988, r261034, r261120,  r261235:
  
  ext2fs: Properly the EXT4_EXTENTS and EXT4_INDEX to the inode flags.
  
  In order to support Ext4 extents we need to pass the Ext4 inode flags
  without interfering with the chflags. This is better done by using the
  i_flag field in the inode and doing proper translation to the linux
  ext4 equivalents.
  
  Solve a potential corruption issue in the dirindex code. The dirindex
  code can now be renabled as the problems related to it have been
  solved.
  
  Suggested by:	bde
  Tested by:	kevlo

Modified:
  stable/10/sys/fs/ext2fs/ext2_bmap.c
  stable/10/sys/fs/ext2fs/ext2_dinode.h
  stable/10/sys/fs/ext2fs/ext2_htree.c
  stable/10/sys/fs/ext2fs/ext2_inode_cnv.c
  stable/10/sys/fs/ext2fs/ext2_lookup.c
  stable/10/sys/fs/ext2fs/ext2_subr.c
  stable/10/sys/fs/ext2fs/ext2_vfsops.c
  stable/10/sys/fs/ext2fs/ext2_vnops.c
  stable/10/sys/fs/ext2fs/inode.h

Modified: stable/10/sys/fs/ext2fs/ext2_bmap.c
==============================================================================
--- stable/10/sys/fs/ext2fs/ext2_bmap.c	Fri Jan 31 03:57:49 2014	(r261310)
+++ stable/10/sys/fs/ext2fs/ext2_bmap.c	Fri Jan 31 03:58:36 2014	(r261311)
@@ -74,7 +74,7 @@ ext2_bmap(struct vop_bmap_args *ap)
 	if (ap->a_bnp == NULL)
 		return (0);
 
-	if (VTOI(ap->a_vp)->i_flags & EXT4_EXTENTS)
+	if (VTOI(ap->a_vp)->i_flag & IN_E4EXTENTS)
 		error = ext4_bmapext(ap->a_vp, ap->a_bn, &blkno,
 		    ap->a_runp, ap->a_runb);
 	else

Modified: stable/10/sys/fs/ext2fs/ext2_dinode.h
==============================================================================
--- stable/10/sys/fs/ext2fs/ext2_dinode.h	Fri Jan 31 03:57:49 2014	(r261310)
+++ stable/10/sys/fs/ext2fs/ext2_dinode.h	Fri Jan 31 03:58:36 2014	(r261311)
@@ -50,22 +50,24 @@
 
 /*
  * Inode flags
- * The current implementation uses only EXT2_IMMUTABLE and EXT2_APPEND flags
+ * The system supports EXT2_IMMUTABLE, EXT2_APPEND and EXT2_NODUMP flags.
+ * The current implementation also uses EXT4_INDEX, EXT4_EXTENTS and
+ * EXT4_HUGE_FILE with some restrictions, imposed the lack of write
+ * support.
  */
 #define EXT2_SECRM		0x00000001	/* Secure deletion */
 #define EXT2_UNRM		0x00000002	/* Undelete */
 #define EXT2_COMPR		0x00000004	/* Compress file */
 #define EXT2_SYNC		0x00000008	/* Synchronous updates */
 #define EXT2_IMMUTABLE		0x00000010	/* Immutable file */
-#define EXT2_APPEND		0x00000020 /* writes to file may only append */
-#define EXT2_NODUMP		0x00000040	/* do not dump file */
-#define EXT2_NOATIME		0x00000080	/* do not update atime */
-
-#define EXT4_INDEX		0x00001000 	/* hash-indexed directory */
+#define EXT2_APPEND		0x00000020 /* Writes to file may only append */
+#define EXT2_NODUMP		0x00000040	/* Do not dump file */
+#define EXT2_NOATIME		0x00000080	/* Do not update atime */
+#define EXT4_INDEX		0x00001000 	/* Hash-indexed directory */
 #define EXT4_IMAGIC		0x00002000 	/* AFS directory */
-#define EXT4_JOURNAL_DATA	0x00004000 /* file data should be journaled */
-#define EXT4_NOTAIL		0x00008000 /* file tail should not be merged */
-#define EXT4_DIRSYNC		0x00010000	/* dirsync behaviour */
+#define EXT4_JOURNAL_DATA	0x00004000 /* File data should be journaled */
+#define EXT4_NOTAIL		0x00008000 /* File tail should not be merged */
+#define EXT4_DIRSYNC		0x00010000	/* Dirsync behaviour */
 #define EXT4_TOPDIR		0x00020000 /* Top of directory hierarchies*/
 #define EXT4_HUGE_FILE		0x00040000	/* Set to each huge file */
 #define EXT4_EXTENTS		0x00080000	/* Inode uses extents */

Modified: stable/10/sys/fs/ext2fs/ext2_htree.c
==============================================================================
--- stable/10/sys/fs/ext2fs/ext2_htree.c	Fri Jan 31 03:57:49 2014	(r261310)
+++ stable/10/sys/fs/ext2fs/ext2_htree.c	Fri Jan 31 03:58:36 2014	(r261311)
@@ -89,12 +89,10 @@ static int	ext2_htree_writebuf(struct ex
 int
 ext2_htree_has_idx(struct inode *ip)
 {
-#ifdef EXT2FS_HTREE
 	if (EXT2_HAS_COMPAT_FEATURE(ip->i_e2fs, EXT2F_COMPAT_DIRHASHINDEX) &&
-	    ip->i_flags & EXT4_INDEX)
+	    ip->i_flag & IN_E4INDEX)
 		return (1);
 	else
-#endif
 		return (0);
 }
 
@@ -656,7 +654,7 @@ ext2_htree_create_index(struct vnode *vp
 		    ((char *)ep + ep->e2d_reclen);
 	ep->e2d_reclen = buf1 + blksize - (char *)ep;
 
-	dp->i_flags |= EXT4_INDEX;
+	dp->i_flag |= IN_E4INDEX;
 
 	/*
 	 * Initialize index root.

Modified: stable/10/sys/fs/ext2fs/ext2_inode_cnv.c
==============================================================================
--- stable/10/sys/fs/ext2fs/ext2_inode_cnv.c	Fri Jan 31 03:57:49 2014	(r261310)
+++ stable/10/sys/fs/ext2fs/ext2_inode_cnv.c	Fri Jan 31 03:58:36 2014	(r261311)
@@ -108,6 +108,8 @@ ext2_ei2i(struct ext2fs_dinode *ei, stru
 	ip->i_flags |= (ei->e2di_flags & EXT2_APPEND) ? SF_APPEND : 0;
 	ip->i_flags |= (ei->e2di_flags & EXT2_IMMUTABLE) ? SF_IMMUTABLE : 0;
 	ip->i_flags |= (ei->e2di_flags & EXT2_NODUMP) ? UF_NODUMP : 0;
+	ip->i_flag |= (ei->e2di_flags & EXT4_INDEX) ? IN_E4INDEX : 0;
+	ip->i_flag |= (ei->e2di_flags & EXT4_EXTENTS) ? IN_E4EXTENTS : 0;
 	ip->i_blocks = ei->e2di_nblock;
 	if (E2DI_HAS_HUGE_FILE(ip)) {
 		ip->i_blocks |= (uint64_t)ei->e2di_nblock_high << 32;
@@ -156,6 +158,8 @@ ext2_i2ei(struct inode *ip, struct ext2f
 	ei->e2di_flags |= (ip->i_flags & SF_APPEND) ? EXT2_APPEND: 0;
 	ei->e2di_flags |= (ip->i_flags & SF_IMMUTABLE) ? EXT2_IMMUTABLE: 0;
 	ei->e2di_flags |= (ip->i_flags & UF_NODUMP) ? EXT2_NODUMP: 0;
+	ei->e2di_flags |= (ip->i_flag & IN_E4INDEX) ? EXT4_INDEX: 0;
+	ei->e2di_flags |= (ip->i_flag & IN_E4EXTENTS) ? EXT4_EXTENTS: 0;
 	ei->e2di_nblock = ip->i_blocks & 0xffffffff;
 	ei->e2di_nblock_high = ip->i_blocks >> 32 & 0xffff;
 	ei->e2di_gen = ip->i_gen;

Modified: stable/10/sys/fs/ext2fs/ext2_lookup.c
==============================================================================
--- stable/10/sys/fs/ext2fs/ext2_lookup.c	Fri Jan 31 03:57:49 2014	(r261310)
+++ stable/10/sys/fs/ext2fs/ext2_lookup.c	Fri Jan 31 03:58:36 2014	(r261311)
@@ -884,12 +884,11 @@ ext2_direnter(struct inode *ip, struct v
 	bcopy(cnp->cn_nameptr, newdir.e2d_name, (unsigned)cnp->cn_namelen + 1);
 	newentrysize = EXT2_DIR_REC_LEN(newdir.e2d_namlen);
 
-#ifdef EXT2FS_HTREE
 	if (ext2_htree_has_idx(dp)) {
 		error = ext2_htree_add_entry(dvp, &newdir, cnp);
 		if (error) {
-			dp->i_flags &= ~EXT4_INDEX;
-			dp->i_flags |= IN_CHANGE | IN_UPDATE;
+			dp->i_flag &= ~IN_E4INDEX;
+			dp->i_flag |= IN_CHANGE | IN_UPDATE;
 		}
 		return (error);
 	}
@@ -905,7 +904,6 @@ ext2_direnter(struct inode *ip, struct v
 			return ext2_htree_create_index(dvp, cnp, &newdir);
 		}
 	}
-#endif	/* EXT2FS_HTREE */
 
 	if (dp->i_count == 0) {
 		/*

Modified: stable/10/sys/fs/ext2fs/ext2_subr.c
==============================================================================
--- stable/10/sys/fs/ext2fs/ext2_subr.c	Fri Jan 31 03:57:49 2014	(r261310)
+++ stable/10/sys/fs/ext2fs/ext2_subr.c	Fri Jan 31 03:58:36 2014	(r261311)
@@ -82,10 +82,10 @@ ext2_blkatoff(struct vnode *vp, off_t of
 	*bpp = NULL;
 
 	/*
-	 * The EXT4_EXTENTS requires special treatment, otherwise we can
-	 * fall back to the normal path.
+	 * IN_E4EXTENTS requires special treatment as we can otherwise fall
+	 * back to the normal path.
 	 */
-	if (!(ip->i_flags & EXT4_EXTENTS))
+	if (!(ip->i_flag & IN_E4EXTENTS))
 		goto normal;
 
 	memset(&path, 0, sizeof(path));
@@ -110,7 +110,7 @@ ext2_blkatoff(struct vnode *vp, off_t of
 	if (res)
 		*res = (char *)bp->b_data + blkoff(fs, offset);
 	/*
-	 * If EXT4_EXTENTS is enabled we would get a wrong offset so
+	 * If IN_E4EXTENTS is enabled we would get a wrong offset so
 	 * reset b_offset here.
 	 */
 	bp->b_offset = lbn * bsize;

Modified: stable/10/sys/fs/ext2fs/ext2_vfsops.c
==============================================================================
--- stable/10/sys/fs/ext2fs/ext2_vfsops.c	Fri Jan 31 03:57:49 2014	(r261310)
+++ stable/10/sys/fs/ext2fs/ext2_vfsops.c	Fri Jan 31 03:58:36 2014	(r261311)
@@ -964,10 +964,10 @@ ext2_vget(struct mount *mp, ino_t ino, i
 	 * blocks are zeroed out - ext2_balloc depends on this
 	 * although for regular files and directories only
 	 *
-	 * If EXT4_EXTENTS flag is enabled, unused blocks aren't
-	 * zeroed out because we could corrupt the extent tree.
+	 * If IN_E4EXTENTS is enabled, unused blocks are not zeroed
+	 * out because we could corrupt the extent tree.
 	 */
-	if (!(ip->i_flags & EXT4_EXTENTS) &&
+	if (!(ip->i_flag & IN_E4EXTENTS) &&
 	    (S_ISDIR(ip->i_mode) || S_ISREG(ip->i_mode))) {
 		used_blocks = (ip->i_size+fs->e2fs_bsize-1) / fs->e2fs_bsize;
 		for (i = used_blocks; i < EXT2_NDIR_BLOCKS; i++)

Modified: stable/10/sys/fs/ext2fs/ext2_vnops.c
==============================================================================
--- stable/10/sys/fs/ext2fs/ext2_vnops.c	Fri Jan 31 03:57:49 2014	(r261310)
+++ stable/10/sys/fs/ext2fs/ext2_vnops.c	Fri Jan 31 03:58:36 2014	(r261311)
@@ -1615,7 +1615,7 @@ ext2_read(struct vop_read_args *ap)
 	ip = VTOI(vp);
 
 	/*EXT4_EXT_LOCK(ip);*/
-	if (ip->i_flags & EXT4_EXTENTS)
+	if (ip->i_flag & IN_E4EXTENTS)
 		error = ext4_ext_read(ap);
 	else
 		error = ext2_ind_read(ap);

Modified: stable/10/sys/fs/ext2fs/inode.h
==============================================================================
--- stable/10/sys/fs/ext2fs/inode.h	Fri Jan 31 03:57:49 2014	(r261310)
+++ stable/10/sys/fs/ext2fs/inode.h	Fri Jan 31 03:58:36 2014	(r261311)
@@ -153,6 +153,13 @@ struct inode {
 #define IN_LAZYACCESS   0x0100		/* Process IN_ACCESS after the
 					    suspension finished */
 
+/*
+ * These are translation flags for some attributes that Ext4
+ * passes as inode flags but that we cannot pass directly.
+ */
+#define	IN_E4INDEX	0x010000
+#define	IN_E4EXTENTS	0x020000
+
 #define i_devvp i_ump->um_devvp
 
 #ifdef _KERNEL



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201401310358.s0V3wamb094996>