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
This commit is contained in:
pfg 2014-01-21 19:06:29 +00:00
parent 35b032da46
commit 1317ca3f44
9 changed files with 35 additions and 21 deletions

View File

@ -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

View File

@ -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 */

View File

@ -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, struct componentname *cnp,
((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.

View File

@ -108,6 +108,8 @@ ext2_ei2i(struct ext2fs_dinode *ei, struct inode *ip)
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;

View File

@ -888,8 +888,9 @@ ext2_direnter(struct inode *ip, struct vnode *dvp, struct componentname *cnp)
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);
}

View File

@ -82,10 +82,10 @@ ext2_blkatoff(struct vnode *vp, off_t offset, char **res, struct buf **bpp)
*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 offset, char **res, struct buf **bpp)
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;

View File

@ -964,10 +964,10 @@ ext2_vget(struct mount *mp, ino_t ino, int flags, struct vnode **vpp)
* 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++)

View File

@ -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);

View File

@ -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