Sat, 2 Oct 2010 12:37:51 -0500
the attached patch can be applied after patching 2.6.32.23 (or 2.6.32.24,
as i was doing, not having gotten to 2.6.32.23 yet) with
patch-2.6.32.22-vs2.3.0.36.29.6.diff (the most recent vserver patch for
2.6.32).
the patch was taken from patch-2.6.35.5-vs2.3.0.36.32.diff.
corey
--
undefined@pobox.com
--- 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);
}