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>