Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 21 Jan 2014 19:06:29 +0000 (UTC)
From:      "Pedro F. Giffuni" <pfg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r260988 - head/sys/fs/ext2fs
Message-ID:  <201401211906.s0LJ6TnI011079@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: pfg
Date: Tue Jan 21 19:06:29 2014
New Revision: 260988
URL: http://svnweb.freebsd.org/changeset/base/260988

Log:
  ext2fs: Translate the EXT4_EXTENTS and EXT4_INDEX to the inode flags.
  
  r260545 cleared the inode flags to fix corruption problems but
  we still need to pass some EXT4 flags for the ext4 read-only
  mode.  None of these attributes has an equivalent in FreeBSD and
  are uninteresting for the system utilities so they should be
  innaccessible in ext2_getattrib().
  
  Note: we also use EXT4_HUGE_FILE but we use it directly from the
  dinode structure so it is not necessary to translate it,
  
  Suggested by:	bde
  MFC after:	3 days

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

Modified: head/sys/fs/ext2fs/ext2_bmap.c
==============================================================================
--- head/sys/fs/ext2fs/ext2_bmap.c	Tue Jan 21 18:57:49 2014	(r260987)
+++ head/sys/fs/ext2fs/ext2_bmap.c	Tue Jan 21 19:06:29 2014	(r260988)
@@ -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_flags & E4_EXTENTS)
 		error = ext4_bmapext(ap->a_vp, ap->a_bn, &blkno,
 		    ap->a_runp, ap->a_runb);
 	else

Modified: head/sys/fs/ext2fs/ext2_dinode.h
==============================================================================
--- head/sys/fs/ext2fs/ext2_dinode.h	Tue Jan 21 18:57:49 2014	(r260987)
+++ head/sys/fs/ext2fs/ext2_dinode.h	Tue Jan 21 19:06:29 2014	(r260988)
@@ -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: head/sys/fs/ext2fs/ext2_htree.c
==============================================================================
--- head/sys/fs/ext2fs/ext2_htree.c	Tue Jan 21 18:57:49 2014	(r260987)
+++ head/sys/fs/ext2fs/ext2_htree.c	Tue Jan 21 19:06:29 2014	(r260988)
@@ -91,7 +91,7 @@ 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_flags & E4_INDEX)
 		return (1);
 	else
 #endif
@@ -656,7 +656,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_flags |= E4_INDEX;
 
 	/*
 	 * Initialize index root.

Modified: head/sys/fs/ext2fs/ext2_inode_cnv.c
==============================================================================
--- head/sys/fs/ext2fs/ext2_inode_cnv.c	Tue Jan 21 18:57:49 2014	(r260987)
+++ head/sys/fs/ext2fs/ext2_inode_cnv.c	Tue Jan 21 19:06:29 2014	(r260988)
@@ -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_flags |= (ei->e2di_flags & EXT4_INDEX) ? E4_INDEX : 0;
+	ip->i_flags |= (ei->e2di_flags & EXT4_EXTENTS) ? E4_EXTENTS : 0;
 	ip->i_blocks = ei->e2di_nblock;
 	if (E2DI_HAS_HUGE_FILE(ip)) {
 		ip->i_blocks |= (uint64_t)ei->e2di_nblock_high << 32;

Modified: head/sys/fs/ext2fs/ext2_lookup.c
==============================================================================
--- head/sys/fs/ext2fs/ext2_lookup.c	Tue Jan 21 18:57:49 2014	(r260987)
+++ head/sys/fs/ext2fs/ext2_lookup.c	Tue Jan 21 19:06:29 2014	(r260988)
@@ -888,8 +888,9 @@ ext2_direnter(struct inode *ip, struct v
 	if (ext2_htree_has_idx(dp)) {
 		error = ext2_htree_add_entry(dvp, &newdir, cnp);
 		if (error) {
-			dp->i_flags &= ~EXT4_INDEX;
+			/* XXX: These seem to be set in the wrong place. */
 			dp->i_flags |= IN_CHANGE | IN_UPDATE;
+			dp->i_flags &= ~E4_INDEX;
 		}
 		return (error);
 	}

Modified: head/sys/fs/ext2fs/ext2_subr.c
==============================================================================
--- head/sys/fs/ext2fs/ext2_subr.c	Tue Jan 21 18:57:49 2014	(r260987)
+++ head/sys/fs/ext2fs/ext2_subr.c	Tue Jan 21 19:06:29 2014	(r260988)
@@ -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.
+	 * E4_EXTENTS requires special treatment otherwise we can fall
+	 * back to the normal path.
 	 */
-	if (!(ip->i_flags & EXT4_EXTENTS))
+	if (!(ip->i_flags & E4_EXTENTS))
 		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 E4_EXTENTS is enabled we would get a wrong offset so
 	 * reset b_offset here.
 	 */
 	bp->b_offset = lbn * bsize;

Modified: head/sys/fs/ext2fs/ext2_vfsops.c
==============================================================================
--- head/sys/fs/ext2fs/ext2_vfsops.c	Tue Jan 21 18:57:49 2014	(r260987)
+++ head/sys/fs/ext2fs/ext2_vfsops.c	Tue Jan 21 19:06:29 2014	(r260988)
@@ -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 E4_EXTENTS is enabled, unused blocks are not zeroed
+	 * out because we could corrupt the extent tree.
 	 */
-	if (!(ip->i_flags & EXT4_EXTENTS) &&
+	if (!(ip->i_flags & E4_EXTENTS) &&
 	    (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: head/sys/fs/ext2fs/ext2_vnops.c
==============================================================================
--- head/sys/fs/ext2fs/ext2_vnops.c	Tue Jan 21 18:57:49 2014	(r260987)
+++ head/sys/fs/ext2fs/ext2_vnops.c	Tue Jan 21 19:06:29 2014	(r260988)
@@ -344,6 +344,8 @@ ext2_getattr(struct vop_getattr_args *ap
 		vap->va_birthtime.tv_nsec = ip->i_birthnsec;
 	}
 	vap->va_flags = ip->i_flags;
+	/* E4_* flags are private to the driver */
+	vap->va_flags &= !(E4_INDEX | E4_EXTENTS);
 	vap->va_gen = ip->i_gen;
 	vap->va_blocksize = vp->v_mount->mnt_stat.f_iosize;
 	vap->va_bytes = dbtob((u_quad_t)ip->i_blocks);
@@ -1615,7 +1617,7 @@ ext2_read(struct vop_read_args *ap)
 	ip = VTOI(vp);
 
 	/*EXT4_EXT_LOCK(ip);*/
-	if (ip->i_flags & EXT4_EXTENTS)
+	if (ip->i_flags & E4_EXTENTS)
 		error = ext4_ext_read(ap);
 	else
 		error = ext2_ind_read(ap);

Modified: head/sys/fs/ext2fs/inode.h
==============================================================================
--- head/sys/fs/ext2fs/inode.h	Tue Jan 21 18:57:49 2014	(r260987)
+++ head/sys/fs/ext2fs/inode.h	Tue Jan 21 19:06:29 2014	(r260988)
@@ -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	E4_INDEX	0x01000000
+#define	E4_EXTENTS	0x02000000
+
 #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?201401211906.s0LJ6TnI011079>