/* Flags that are appropriate for non-directories/regular files. */
 #define EXT4_OTHER_FLMASK (EXT4_NODUMP_FL | EXT4_NOATIME_FL)
 
+/* The only flags that should be swapped */
+#define EXT4_FL_SHOULD_SWAP (EXT4_HUGE_FILE_FL | EXT4_EXTENTS_FL)
+
 /* Mask out flags that are inappropriate for the given type of inode. */
 static inline __u32 ext4_mask_flags(umode_t mode, __u32 flags)
 {
 
        loff_t isize;
        struct ext4_inode_info *ei1;
        struct ext4_inode_info *ei2;
+       unsigned long tmp;
 
        ei1 = EXT4_I(inode1);
        ei2 = EXT4_I(inode2);
        swap(inode1->i_mtime, inode2->i_mtime);
 
        memswap(ei1->i_data, ei2->i_data, sizeof(ei1->i_data));
-       swap(ei1->i_flags, ei2->i_flags);
+       tmp = ei1->i_flags & EXT4_FL_SHOULD_SWAP;
+       ei1->i_flags = (ei2->i_flags & EXT4_FL_SHOULD_SWAP) |
+               (ei1->i_flags & ~EXT4_FL_SHOULD_SWAP);
+       ei2->i_flags = tmp | (ei2->i_flags & ~EXT4_FL_SHOULD_SWAP);
        swap(ei1->i_disksize, ei2->i_disksize);
        ext4_es_remove_extent(inode1, 0, EXT_MAX_BLOCKS);
        ext4_es_remove_extent(inode2, 0, EXT_MAX_BLOCKS);