--- linux-2.6.32.24/fs/ext4/inode.c 2010-10-02 12:08:25.000000000 -0500 +++ linux-2.6.32.24-vs2.3.0.36.29.6/fs/ext4/inode.c 2010-10-02 11:58:18.000000000 -0500 @@ -4800,7 +4800,14 @@ void ext4_set_inode_flags(struct inode * { unsigned int flags = EXT4_I(inode)->i_flags; - inode->i_flags &= ~(S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC); + inode->i_flags &= ~(S_IMMUTABLE | S_IXUNLINK | + S_SYNC | S_APPEND | S_NOATIME | S_DIRSYNC); + + if (flags & EXT4_IMMUTABLE_FL) + inode->i_flags |= S_IMMUTABLE; + if (flags & EXT4_IXUNLINK_FL) + inode->i_flags |= S_IXUNLINK; + if (flags & EXT4_SYNC_FL) inode->i_flags |= S_SYNC; if (flags & EXT4_APPEND_FL) @@ -4811,30 +4818,48 @@ void ext4_set_inode_flags(struct inode * inode->i_flags |= S_NOATIME; if (flags & EXT4_DIRSYNC_FL) inode->i_flags |= S_DIRSYNC; + + inode->i_vflags &= ~(V_BARRIER | V_COW); + + if (flags & EXT4_BARRIER_FL) + inode->i_vflags |= V_BARRIER; + if (flags & EXT4_COW_FL) + inode->i_vflags |= V_COW; } /* Propagate flags from i_flags to EXT4_I(inode)->i_flags */ void ext4_get_inode_flags(struct ext4_inode_info *ei) { - unsigned int vfs_fl; + unsigned int vfs_fl, vfs_vf; unsigned long old_fl, new_fl; do { vfs_fl = ei->vfs_inode.i_flags; + vfs_vf = ei->vfs_inode.i_vflags; old_fl = ei->i_flags; new_fl = old_fl & ~(EXT4_SYNC_FL|EXT4_APPEND_FL| EXT4_IMMUTABLE_FL|EXT4_NOATIME_FL| - EXT4_DIRSYNC_FL); + EXT4_DIRSYNC_FL|EXT4_BARRIER_FL| + EXT4_COW_FL); + + if (vfs_fl & S_IMMUTABLE) + new_fl |= EXT4_IMMUTABLE_FL; + if (vfs_fl & S_IXUNLINK) + new_fl |= EXT4_IXUNLINK_FL; + if (vfs_fl & S_SYNC) new_fl |= EXT4_SYNC_FL; if (vfs_fl & S_APPEND) new_fl |= EXT4_APPEND_FL; - if (vfs_fl & S_IMMUTABLE) - new_fl |= EXT4_IMMUTABLE_FL; if (vfs_fl & S_NOATIME) new_fl |= EXT4_NOATIME_FL; if (vfs_fl & S_DIRSYNC) new_fl |= EXT4_DIRSYNC_FL; + + if (vfs_vf & V_BARRIER) + new_fl |= EXT4_BARRIER_FL; + if (vfs_vf & V_COW) + new_fl |= EXT4_COW_FL; } while (cmpxchg(&ei->i_flags, old_fl, new_fl) != old_fl); }