-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

tag 329087 +security
tag 329087 +patch

The upstream kernel patch maintainer looked at the Debian patch and
found that when the port was done, key pieces were not included that
would prevent such an escape. Namely the immutable unlink extended
filesystem attributes and the capability system that would enforce the
chroot barrier. This this is a Debian specific problem, limited to
the 2.4 kernel patch included with kernel-patch-vserver.

The attached patch resolves this issue.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (GNU/Linux)

iD8DBQFDgOVM9n4qXRzy1ioRAs+GAJ9ec41DDqeIHh+DFD2iVLO8hnVqKgCgkJwl
fCVp+hwOQVpi6dA/5mae8DE=
=7D0W
-----END PGP SIGNATURE-----
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/ext2/ialloc.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/ext2/ialloc.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/ext2/ialloc.c      2005-11-11 03:28:50 
+0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/ext2/ialloc.c        2005-11-11 
04:51:07 +0100
@@ -390,9 +390,9 @@ repeat:
        inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
        inode->u.ext2_i.i_state = EXT2_STATE_NEW;
        inode->u.ext2_i.i_flags = dir->u.ext2_i.i_flags &
-               ~(EXT2_BTREE_FL|EXT2_IMMUTABLE_LINK_FL);
+               ~(EXT2_BTREE_FL|EXT2_IUNLINK_FL);
        if (S_ISLNK(mode))
-               inode->u.ext2_i.i_flags &= 
~(EXT2_IMMUTABLE_FILE_FL|EXT2_APPEND_FL);
+               inode->u.ext2_i.i_flags &= ~(EXT2_IMMUTABLE_FL|EXT2_APPEND_FL);
        inode->u.ext2_i.i_block_group = group;
        ext2_set_inode_flags(inode);
        insert_inode_hash(inode);
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/ext2/inode.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/ext2/inode.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/ext2/inode.c       2005-11-11 03:28:50 
+0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/ext2/inode.c 2005-11-11 04:51:07 
+0100
@@ -892,7 +892,7 @@ do_indirects:
 
 void ext2_truncate (struct inode * inode)
 {
-       if (IS_APPEND(inode) || IS_IMMUTABLE_FILE(inode))
+       if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
                return;
        ext2_truncate_nocheck(inode);
 }
@@ -901,15 +901,15 @@ void ext2_set_inode_flags(struct inode *
 {
        unsigned int flags = inode->u.ext2_i.i_flags;
 
-       inode->i_flags &= 
~(S_SYNC|S_APPEND|S_IMMUTABLE_FILE|S_IMMUTABLE_LINK|S_NOATIME);
+       inode->i_flags &= ~(S_SYNC|S_APPEND|S_IMMUTABLE|S_IUNLINK|S_NOATIME);
        if (flags & EXT2_SYNC_FL)
                inode->i_flags |= S_SYNC;
        if (flags & EXT2_APPEND_FL)
                inode->i_flags |= S_APPEND;
-       if (flags & EXT2_IMMUTABLE_FILE_FL)
-               inode->i_flags |= S_IMMUTABLE_FILE;
-       if (flags & EXT2_IMMUTABLE_LINK_FL)
-               inode->i_flags |= S_IMMUTABLE_LINK;
+       if (flags & EXT2_IMMUTABLE_FL)
+               inode->i_flags |= S_IMMUTABLE;
+       if (flags & EXT2_IUNLINK_FL)
+               inode->i_flags |= S_IUNLINK;
        if (flags & EXT2_NOATIME_FL)
                inode->i_flags |= S_NOATIME;
 }
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/ext2/ioctl.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/ext2/ioctl.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/ext2/ioctl.c       2005-11-11 03:28:50 
+0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/ext2/ioctl.c 2005-11-11 04:51:07 
+0100
@@ -44,9 +44,9 @@ int ext2_ioctl (struct inode * inode, st
                 *
                 * This test looks nicer. Thanks to Pauline Middelink
                 */
-               if ((oldflags & EXT2_IMMUTABLE_FILE_FL) ||
+               if ((oldflags & EXT2_IMMUTABLE_FL) ||
                        ((flags ^ oldflags) & (EXT2_APPEND_FL |
-                       EXT2_IMMUTABLE_FILE_FL | EXT2_IMMUTABLE_LINK_FL))) {
+                       EXT2_IMMUTABLE_FL | EXT2_IUNLINK_FL))) {
                        if (!capable(CAP_LINUX_IMMUTABLE))
                                return -EPERM;
                }
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/ext3/ialloc.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/ext3/ialloc.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/ext3/ialloc.c      2005-11-11 03:28:50 
+0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/ext3/ialloc.c        2005-11-11 
04:51:07 +0100
@@ -486,9 +486,9 @@ repeat:
        inode->i_blocks = 0;
        inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
        inode->u.ext3_i.i_flags = dir->u.ext3_i.i_flags &
-               ~(EXT3_INDEX_FL|EXT3_IMMUTABLE_LINK_FL);
+               ~(EXT3_INDEX_FL|EXT3_IUNLINK_FL);
        if (S_ISLNK(mode))
-               inode->u.ext3_i.i_flags &= 
~(EXT3_IMMUTABLE_FILE_FL|EXT3_APPEND_FL);
+               inode->u.ext3_i.i_flags &= ~(EXT3_IMMUTABLE_FL|EXT3_APPEND_FL);
 #ifdef EXT3_FRAGMENTS
        inode->u.ext3_i.i_faddr = 0;
        inode->u.ext3_i.i_frag_no = 0;
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/ext3/inode.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/ext3/inode.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/ext3/inode.c       2005-11-11 03:28:50 
+0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/ext3/inode.c 2005-11-11 04:51:07 
+0100
@@ -2017,7 +2017,7 @@ out_stop:
 
 void ext3_truncate(struct inode * inode)
 {
-       if (IS_APPEND(inode) || IS_IMMUTABLE_FILE(inode))
+       if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
                return;
        ext3_truncate_nocheck(inode);
 }
@@ -2091,15 +2091,15 @@ void ext3_set_inode_flags(struct inode *
 {
        unsigned int flags = inode->u.ext3_i.i_flags;
 
-       inode->i_flags &= 
~(S_SYNC|S_APPEND|S_IMMUTABLE_FILE|S_IMMUTABLE_LINK|S_NOATIME);
+       inode->i_flags &= ~(S_SYNC|S_APPEND|S_IMMUTABLE|S_IUNLINK|S_NOATIME);
        if (flags & EXT3_SYNC_FL)
                inode->i_flags |= S_SYNC;
        if (flags & EXT3_APPEND_FL)
                inode->i_flags |= S_APPEND;
-       if (flags & EXT3_IMMUTABLE_FILE_FL)
-               inode->i_flags |= S_IMMUTABLE_FILE;
-       if (flags & EXT3_IMMUTABLE_LINK_FL)
-               inode->i_flags |= S_IMMUTABLE_LINK;
+       if (flags & EXT3_IMMUTABLE_FL)
+               inode->i_flags |= S_IMMUTABLE;
+       if (flags & EXT3_IUNLINK_FL)
+               inode->i_flags |= S_IUNLINK;
        if (flags & EXT3_NOATIME_FL)
                inode->i_flags |= S_NOATIME;
 }
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/ext3/ioctl.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/ext3/ioctl.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/ext3/ioctl.c       2005-11-11 03:28:50 
+0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/ext3/ioctl.c 2005-11-11 04:51:07 
+0100
@@ -53,9 +53,9 @@ int ext3_ioctl (struct inode * inode, st
                 *
                 * This test looks nicer. Thanks to Pauline Middelink
                 */
-               if ((oldflags & EXT3_IMMUTABLE_FILE_FL) ||
+               if ((oldflags & EXT3_IMMUTABLE_FL) ||
                        ((flags ^ oldflags) & (EXT3_APPEND_FL |
-                       EXT3_IMMUTABLE_FILE_FL | EXT3_IMMUTABLE_LINK_FL))) {
+                       EXT3_IMMUTABLE_FL | EXT3_IUNLINK_FL))) {
                        if (!capable(CAP_LINUX_IMMUTABLE))
                                return -EPERM;
                }
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/fat/file.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/fat/file.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/fat/file.c 2005-11-11 03:28:50 +0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/fat/file.c   2005-11-11 04:51:07 
+0100
@@ -119,7 +119,7 @@ void fat_truncate(struct inode *inode)
        /* Why no return value?  Surely the disk could fail... */
        if (IS_RDONLY (inode))
                return /* -EPERM */;
-       if (IS_IMMUTABLE_FILE(inode))
+       if (IS_IMMUTABLE(inode))
                return /* -EPERM */;
        cluster = 1 << sbi->cluster_bits;
        /* 
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/fat/inode.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/fat/inode.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/fat/inode.c        2005-11-11 03:28:50 
+0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/fat/inode.c  2005-11-11 04:51:07 
+0100
@@ -960,7 +960,7 @@ static void fat_fill_inode(struct inode 
        }
        if(de->attr & ATTR_SYS)
                if (sbi->options.sys_immutable)
-                       inode->i_flags |= S_IMMUTABLE_FILE;
+                       inode->i_flags |= S_IMMUTABLE;
        MSDOS_I(inode)->i_attrs = de->attr & ATTR_UNUSED;
        /* this is as close to the truth as we can get ... */
        inode->i_blksize = 1 << sbi->cluster_bits;
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/hpfs/file.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/hpfs/file.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/hpfs/file.c        2005-11-11 03:28:50 
+0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/hpfs/file.c  2005-11-11 04:51:07 
+0100
@@ -60,7 +60,7 @@ secno hpfs_bmap(struct inode *inode, uns
 
 void hpfs_truncate(struct inode *i)
 {
-       if (IS_IMMUTABLE_FILE(i)) return /*-EPERM*/;
+       if (IS_IMMUTABLE(i)) return /*-EPERM*/;
        i->i_hpfs_n_secs = 0;
        i->i_blocks = 1 + ((i->i_size + 511) >> 9);
        i->u.hpfs_i.mmu_private = i->i_size;
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/intermezzo/vfs.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/intermezzo/vfs.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/intermezzo/vfs.c   2005-11-11 03:28:50 
+0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/intermezzo/vfs.c     2005-11-11 
04:51:07 +0100
@@ -139,8 +139,8 @@ static inline int may_delete(struct inod
                 return error;
         if (IS_APPEND(dir))
                 return -EPERM;
-        if (check_sticky(dir, victim->d_inode)||IS_APPEND(victim->d_inode)||
-           IS_IMMUTABLE_LINK(victim->d_inode))
+       if (check_sticky(dir, victim->d_inode) ||
+           IS_APPEND(victim->d_inode) || IS_IXORUNLINK(victim->d_inode))
                 return -EPERM;
         if (isdir) {
                 if (!S_ISDIR(victim->d_inode->i_mode))
@@ -262,7 +262,7 @@ int presto_settime(struct presto_file_se
                         return -EROFS;
                 }
 
-               if (IS_IMMUTABLE_FILE(inode) || IS_APPEND(inode)) {
+               if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) {
                         EXIT;
                         return -EPERM;
                 }
@@ -377,7 +377,7 @@ int presto_do_setattr(struct presto_file
                 return -EROFS;
         }
 
-       if (IS_IMMUTABLE_FILE(inode) || IS_APPEND(inode)) {
+       if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) {
                 EXIT;
                 return -EPERM;
         }
@@ -772,7 +772,7 @@ int presto_do_link(struct presto_file_se
          * A link to an append-only or immutable file cannot be created.
          */
         error = -EPERM;
-       if (IS_APPEND(inode) || IS_IMMUTABLE_LINK(inode)) {
+       if (IS_APPEND(inode) || IS_IXORUNLINK(inode)) {
                 EXIT;
                 goto exit_lock;
         }
@@ -2362,7 +2362,7 @@ int presto_do_set_ext_attr(struct presto
                 return -EROFS;
         }
 
-       if (IS_IMMUTABLE_FILE(inode) || IS_APPEND(inode)) {
+       if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) {
                 EXIT;
                 return -EPERM;
         }
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/jfs/xattr.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/jfs/xattr.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/jfs/xattr.c        2005-11-11 03:28:50 
+0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/jfs/xattr.c  2005-11-11 04:51:07 
+0100
@@ -654,7 +654,7 @@ static int can_set_xattr(struct inode *i
        if (IS_RDONLY(inode))
                return -EROFS;
 
-       if (IS_IMMUTABLE_FILE(inode) || IS_APPEND(inode) || 
S_ISLNK(inode->i_mode))
+       if (IS_IMMUTABLE(inode) || IS_APPEND(inode) || S_ISLNK(inode->i_mode))
                return -EPERM;
 
        if((strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) != 0) &&
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/namei.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/namei.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/namei.c    2005-11-11 03:28:50 +0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/namei.c      2005-11-11 04:51:07 
+0100
@@ -153,9 +153,6 @@ int vfs_permission(struct inode * inode,
 {
        umode_t                 mode = inode->i_mode;
 
-       if (IS_BARRIER(inode) && !vx_check(0, VX_ADMIN))
-               return -EACCES;
-
        if (mask & MAY_WRITE) {
                /*
                 * Nobody gets write access to a read-only fs.
@@ -167,7 +164,7 @@ int vfs_permission(struct inode * inode,
                /*
                 * Nobody gets write access to an immutable file.
                 */
-               if (IS_IMMUTABLE_FILE(inode))
+               if (IS_IMMUTABLE(inode))
                        return -EACCES;
        }
 
@@ -202,6 +199,9 @@ int vfs_permission(struct inode * inode,
 
 int permission(struct inode * inode,int mask)
 {
+       if (IS_BARRIER(inode) && !vx_check(0, VX_ADMIN))
+               return -EACCES;
+
        if (inode->i_op && inode->i_op->permission) {
                int retval;
                lock_kernel();
@@ -908,7 +908,8 @@ static inline int may_delete(struct inod
                return error;
        if (IS_APPEND(dir))
                return -EPERM;
-       if (check_sticky(dir, 
victim->d_inode)||IS_APPEND(victim->d_inode)||IS_IMMUTABLE_LINK(victim->d_inode))
+       if (check_sticky(dir, victim->d_inode) ||
+           IS_APPEND(victim->d_inode) || IS_IXORUNLINK(victim->d_inode))
                return -EPERM;
        if (isdir) {
                if (!S_ISDIR(victim->d_inode->i_mode))
@@ -1624,7 +1625,7 @@ int vfs_link(struct dentry *old_dentry, 
         * A link to an append-only or immutable file cannot be created.
         */
        error = -EPERM;
-       if (IS_APPEND(inode) || IS_IMMUTABLE_LINK(inode))
+       if (IS_APPEND(inode) || IS_IXORUNLINK(inode))
                goto exit_lock;
        if (!dir->i_op || !dir->i_op->link)
                goto exit_lock;
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/nfsd/vfs.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/nfsd/vfs.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/nfsd/vfs.c 2005-11-11 03:28:50 +0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/nfsd/vfs.c   2005-11-11 04:51:07 
+0100
@@ -1491,8 +1491,8 @@ nfsd_permission(struct svc_export *exp, 
                (acc & MAY_LOCK)?       " lock"  : "",
                (acc & MAY_OWNER_OVERRIDE)? " owneroverride" : "",
                inode->i_mode,
-               IS_IMMUTABLE_FILE(inode)? " immut(F)" : "",
-               IS_IMMUTABLE_LINK(inode)? " immut(L)" : "",
+               IS_IMMUTABLE(inode)?    " immut" : "",
+               IS_IUNLINK(inode)?      " iunlink" : "",
                IS_APPEND(inode)?       " append" : "",
                IS_RDONLY(inode)?       " ro" : "");
        dprintk("      owner %d/%d user %d/%d\n",
@@ -1511,7 +1511,7 @@ nfsd_permission(struct svc_export *exp, 
         && (acc & (MAY_WRITE | MAY_SATTR | MAY_TRUNC))) {
                if (EX_RDONLY(exp) || IS_RDONLY(inode))
                        return nfserr_rofs;
-               if (/* (acc & MAY_WRITE) && */ IS_IMMUTABLE_FILE(inode))
+               if (/* (acc & MAY_WRITE) && */ IS_IMMUTABLE(inode))
                        return nfserr_perm;
        }
        if ((acc & MAY_TRUNC) && IS_APPEND(inode))
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/open.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/open.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/open.c     2005-11-11 03:28:50 +0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/open.c       2005-11-11 04:51:07 
+0100
@@ -148,7 +148,7 @@ static inline long do_sys_truncate(const
                goto dput_and_out;
 
        error = -EPERM;
-       if (IS_IMMUTABLE_FILE(inode) || IS_APPEND(inode))
+       if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
                goto dput_and_out;
 
        /*
@@ -275,7 +275,7 @@ asmlinkage long sys_utime(char * filenam
        newattrs.ia_valid = ATTR_CTIME | ATTR_MTIME | ATTR_ATIME;
        if (times) {
                error = -EPERM;
-               if (IS_APPEND(inode) || IS_IMMUTABLE_FILE(inode))
+               if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
                        goto dput_and_out;
                error = get_user(newattrs.ia_atime, &times->actime);
                if (!error) 
@@ -286,7 +286,7 @@ asmlinkage long sys_utime(char * filenam
                newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
        } else {
                error = -EACCES;
-               if (IS_IMMUTABLE_FILE(inode))
+               if (IS_IMMUTABLE(inode))
                        goto dput_and_out;
                if (current->fsuid != inode->i_uid &&
                    (error = permission(inode,MAY_WRITE)) != 0)
@@ -327,7 +327,7 @@ asmlinkage long sys_utimes(char * filena
        if (utimes) {
                struct timeval times[2];
                error = -EPERM;
-               if (IS_APPEND(inode) || IS_IMMUTABLE_FILE(inode))
+               if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
                        goto dput_and_out;
                error = -EFAULT;
                if (copy_from_user(&times, utimes, sizeof(times)))
@@ -337,7 +337,7 @@ asmlinkage long sys_utimes(char * filena
                newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET;
        } else {
                error = -EACCES;
-               if (IS_IMMUTABLE_FILE(inode))
+               if (IS_IMMUTABLE(inode))
                        goto dput_and_out;
 
                if (current->fsuid != inode->i_uid &&
@@ -493,10 +493,10 @@ asmlinkage long sys_fchmod(unsigned int 
        if (IS_RDONLY(inode))
                goto out_putf;
        err = -EPERM;
-       if (IS_IMMUTABLE_FILE(inode) || IS_APPEND(inode))
+       if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
                goto out_putf;
        /* not required, but just to make sure ;) */
-       if (IS_BARRIER(inode))
+       if (IS_BARRIER(inode) && !vx_check(0, VX_ADMIN))
                goto out_putf;
        if (mode == (mode_t) -1)
                mode = inode->i_mode;
@@ -527,10 +527,10 @@ asmlinkage long sys_chmod(const char * f
                goto dput_and_out;
 
        error = -EPERM;
-       if (IS_IMMUTABLE_FILE(inode) || IS_APPEND(inode))
+       if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
                goto dput_and_out;
        /* not required, but just to make sure ;) */
-       if (IS_BARRIER(inode))
+       if (IS_BARRIER(inode) && !vx_check(0, VX_ADMIN))
                goto dput_and_out;
 
        if (mode == (mode_t) -1)
@@ -560,7 +560,7 @@ static int chown_common(struct dentry * 
        if (IS_RDONLY(inode))
                goto out;
        error = -EPERM;
-       if (IS_IMMUTABLE_FILE(inode) || IS_APPEND(inode))
+       if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
                goto out;
        if (user == (uid_t) -1)
                user = inode->i_uid;
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/proc/base.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/proc/base.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/proc/base.c        2005-11-11 03:28:50 
+0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/proc/base.c  2005-11-11 04:51:07 
+0100
@@ -1094,7 +1094,7 @@ struct dentry *proc_pid_lookup(struct in
        inode->i_op = &proc_base_inode_operations;
        inode->i_fop = &proc_base_operations;
        inode->i_nlink = 3;
-       inode->i_flags|=S_IMMUTABLE_FILE;
+       inode->i_flags|=S_IMMUTABLE;
 
        dentry->d_op = &pid_base_dentry_operations;
        d_add(dentry, inode);
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/reiserfs/inode.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/reiserfs/inode.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/reiserfs/inode.c   2005-11-11 03:28:50 
+0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/reiserfs/inode.c     2005-11-11 
04:51:07 +0100
@@ -1574,7 +1574,7 @@ int reiserfs_new_inode (struct reiserfs_
 
     /* symlink cannot be immutable or append only, right? */
     if( S_ISLNK( inode -> i_mode ) )
-           inode -> i_flags &= ~ ( S_IMMUTABLE_FILE | S_APPEND );
+           inode -> i_flags &= ~ ( S_IMMUTABLE | S_APPEND );
 
     /* item head of new item */
     ih.ih_key.k_dir_id = INODE_PKEY (dir)->k_objectid;
@@ -2177,14 +2177,14 @@ void sd_attrs_to_i_attrs( __u16 sd_attrs
                        inode -> i_flags |= S_SYNC;
                else
                        inode -> i_flags &= ~S_SYNC;
-               if( sd_attrs & REISERFS_IMMUTABLE_FILE_FL )
-                       inode -> i_flags |= S_IMMUTABLE_FILE;
+               if( sd_attrs & REISERFS_IMMUTABLE_FL )
+                       inode -> i_flags |= S_IMMUTABLE;
                else
-                       inode -> i_flags &= ~S_IMMUTABLE_FILE;
-               if( sd_attrs & REISERFS_IMMUTABLE_LINK_FL )
-                       inode -> i_flags |= S_IMMUTABLE_LINK;
+                       inode -> i_flags &= ~S_IMMUTABLE;
+               if( sd_attrs & REISERFS_IUNLINK_FL )
+                       inode -> i_flags |= S_IUNLINK;
                else
-                       inode -> i_flags &= ~S_IMMUTABLE_LINK;
+                       inode -> i_flags &= ~S_IUNLINK;
                if( sd_attrs & REISERFS_APPEND_FL )
                        inode -> i_flags |= S_APPEND;
                else
@@ -2203,14 +2203,14 @@ void sd_attrs_to_i_attrs( __u16 sd_attrs
 void i_attrs_to_sd_attrs( struct inode *inode, __u16 *sd_attrs )
 {
        if( reiserfs_attrs( inode -> i_sb ) ) {
-               if( inode -> i_flags & S_IMMUTABLE_FILE )
-                       *sd_attrs |= REISERFS_IMMUTABLE_FILE_FL;
+               if( inode -> i_flags & S_IMMUTABLE )
+                       *sd_attrs |= REISERFS_IMMUTABLE_FL;
                else
-                       *sd_attrs &= ~REISERFS_IMMUTABLE_FILE_FL;
-               if( inode -> i_flags & S_IMMUTABLE_LINK )
-                       *sd_attrs |= REISERFS_IMMUTABLE_LINK_FL;
+                       *sd_attrs &= ~REISERFS_IMMUTABLE_FL;
+               if( inode -> i_flags & S_IUNLINK )
+                       *sd_attrs |= REISERFS_IUNLINK_FL;
                else
-                       *sd_attrs &= ~REISERFS_IMMUTABLE_LINK_FL;
+                       *sd_attrs &= ~REISERFS_IUNLINK_FL;
                if( inode -> i_flags & S_SYNC )
                        *sd_attrs |= REISERFS_SYNC_FL;
                else
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/reiserfs/ioctl.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/reiserfs/ioctl.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/reiserfs/ioctl.c   2005-11-11 03:28:50 
+0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/reiserfs/ioctl.c     2005-11-11 
04:51:07 +0100
@@ -42,6 +42,8 @@ int reiserfs_ioctl (struct inode * inode
                i_attrs_to_sd_attrs( inode, ( __u16 * ) &flags );
                return put_user(flags, (int *) arg);
        case REISERFS_IOC_SETFLAGS: {
+               unsigned int oldflags;
+
                if (IS_RDONLY(inode))
                        return -EROFS;
 
@@ -51,12 +53,14 @@ int reiserfs_ioctl (struct inode * inode
                if (get_user(flags, (int *) arg))
                        return -EFAULT;
 
-               if ( (inode->u.reiserfs_i.i_attrs & REISERFS_IMMUTABLE_FILE_FL) 
||
-                    ( ( ( flags ^ inode->u.reiserfs_i.i_attrs) &
-                    ( REISERFS_IMMUTABLE_FILE_FL |
-                      REISERFS_IMMUTABLE_LINK_FL | REISERFS_APPEND_FL ) ) &&
-                    !capable( CAP_LINUX_IMMUTABLE ) ) )
+               oldflags = inode->u.reiserfs_i.i_attrs;
+
+               if ((oldflags & REISERFS_IMMUTABLE_FL) ||
+                   ((flags ^ oldflags) & (REISERFS_APPEND_FL |
+                   REISERFS_IMMUTABLE_FL | REISERFS_IUNLINK_FL))) {
+                       if (!capable(CAP_LINUX_IMMUTABLE))
                        return -EPERM;
+               }
                        
                if( ( flags & REISERFS_NOTAIL_FL ) &&
                    S_ISREG( inode -> i_mode ) ) {
@@ -66,6 +70,9 @@ int reiserfs_ioctl (struct inode * inode
                                if( result )
                                        return result;
                }
+
+               flags = flags & REISERFS_FL_USER_MODIFIABLE;
+               flags |= oldflags & ~REISERFS_FL_USER_MODIFIABLE;
                sd_attrs_to_i_attrs( flags, inode );
                inode -> u.reiserfs_i.i_attrs = flags;
                inode->i_ctime = CURRENT_TIME;
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/udf/inode.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/udf/inode.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/udf/inode.c        2005-11-11 03:28:50 
+0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/udf/inode.c  2005-11-11 04:51:07 
+0100
@@ -860,7 +860,7 @@ void udf_truncate(struct inode * inode)
        if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
                        S_ISLNK(inode->i_mode)))
                return;
-       if (IS_APPEND(inode) || IS_IMMUTABLE_FILE(inode))
+       if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
                return;
 
        if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/ufs/truncate.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/ufs/truncate.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/ufs/truncate.c     2005-11-11 03:28:50 
+0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/ufs/truncate.c       2005-11-11 
04:51:07 +0100
@@ -434,7 +434,7 @@ void ufs_truncate (struct inode * inode)
 
        if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || 
S_ISLNK(inode->i_mode)))
                return;
-       if (IS_APPEND(inode) || IS_IMMUTABLE_FILE(inode))
+       if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
                return;
        while (1) {
                retry = ufs_trunc_direct(inode);
diff -NurpP --minimal 
linux-2.4.27-9-vs1.2.10.micah/fs/xfs/linux-2.4/xfs_ioctl.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/xfs/linux-2.4/xfs_ioctl.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/xfs/linux-2.4/xfs_ioctl.c  2005-11-11 
03:28:50 +0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/xfs/linux-2.4/xfs_ioctl.c    
2005-11-11 04:51:07 +0100
@@ -339,7 +339,7 @@ xfs_open_by_handle(
                return -XFS_ERROR(EPERM);
        }
 
-       if ((permflag & FMODE_WRITE) && IS_IMMUTABLE_FILE(inode)) {
+       if ((permflag & FMODE_WRITE) && IS_IMMUTABLE(inode)) {
                iput(inode);
                return -XFS_ERROR(EACCES);
        }
@@ -445,7 +445,7 @@ xfs_fssetdm_by_handle(
        if (error)
                return -error;
 
-       if (IS_IMMUTABLE_FILE(inode) || IS_APPEND(inode)) {
+       if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) {
                VN_RELE(vp);
                return -XFS_ERROR(EPERM);
        }
@@ -540,7 +540,7 @@ xfs_attrmulti_by_handle(
                                        NULL, ops[i].am_error);
                        break;
                case ATTR_OP_SET:
-                       if (IS_IMMUTABLE_FILE(inode) || IS_APPEND(inode)) {
+                       if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) {
                                ops[i].am_error = EPERM;
                                break;
                        }
@@ -549,7 +549,7 @@ xfs_attrmulti_by_handle(
                                        NULL, ops[i].am_error);
                        break;
                case ATTR_OP_REMOVE:
-                       if (IS_IMMUTABLE_FILE(inode) || IS_APPEND(inode)) {
+                       if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) {
                                ops[i].am_error = EPERM;
                                break;
                        }
@@ -892,7 +892,7 @@ xfs_ioc_space(
        int                     attr_flags = 0;
        int                     error;
 
-       if (vp->v_inode.i_flags & (S_IMMUTABLE_FILE|S_APPEND))
+       if (vp->v_inode.i_flags & (S_IMMUTABLE|S_APPEND))
                return -XFS_ERROR(EPERM);
 
        if (!(filp->f_flags & FMODE_WRITE))
@@ -1068,6 +1068,8 @@ xfs_di2lxflags(
 
        if (di_flags & XFS_DIFLAG_IMMUTABLE)
                flags |= LINUX_XFLAG_IMMUTABLE;
+       if (di_flags & XFS_DIFLAG_IUNLINK)
+               flags |= LINUX_XFLAG_IUNLINK;
        if (di_flags & XFS_DIFLAG_APPEND)
                flags |= LINUX_XFLAG_APPEND;
        if (di_flags & XFS_DIFLAG_SYNC)
diff -NurpP --minimal 
linux-2.4.27-9-vs1.2.10.micah/fs/xfs/linux-2.4/xfs_super.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/xfs/linux-2.4/xfs_super.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/xfs/linux-2.4/xfs_super.c  2005-11-11 
03:28:50 +0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/xfs/linux-2.4/xfs_super.c    
2005-11-11 04:51:07 +0100
@@ -176,13 +176,13 @@ xfs_revalidate_inode(
        inode->i_mtime  = ip->i_d.di_mtime.t_sec;
        inode->i_ctime  = ip->i_d.di_ctime.t_sec;
        if (ip->i_d.di_flags & XFS_DIFLAG_IMMUTABLE)
-               inode->i_flags |= S_IMMUTABLE_FILE;
+               inode->i_flags |= S_IMMUTABLE;
        else
-               inode->i_flags &= ~S_IMMUTABLE_FILE;
+               inode->i_flags &= ~S_IMMUTABLE;
        if (ip->i_d.di_flags & XFS_DIFLAG_IUNLINK)
-               inode->i_flags |= S_IMMUTABLE_LINK;
+               inode->i_flags |= S_IUNLINK;
        else
-               inode->i_flags &= ~S_IMMUTABLE_LINK;
+               inode->i_flags &= ~S_IUNLINK;
        if (ip->i_d.di_flags & XFS_DIFLAG_APPEND)
                inode->i_flags |= S_APPEND;
        else
diff -NurpP --minimal 
linux-2.4.27-9-vs1.2.10.micah/fs/xfs/linux-2.4/xfs_vnode.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/xfs/linux-2.4/xfs_vnode.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/xfs/linux-2.4/xfs_vnode.c  2005-11-11 
03:28:50 +0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/xfs/linux-2.4/xfs_vnode.c    
2005-11-11 04:51:07 +0100
@@ -219,13 +219,13 @@ vn_revalidate_core(
        inode->i_ctime      = vap->va_ctime.tv_sec;
        inode->i_atime      = vap->va_atime.tv_sec;
        if (vap->va_xflags & XFS_XFLAG_IMMUTABLE)
-                       inode->i_flags |= S_IMMUTABLE_FILE;
+               inode->i_flags |= S_IMMUTABLE;
        else
-                       inode->i_flags &= ~S_IMMUTABLE_FILE;
+               inode->i_flags &= ~S_IMMUTABLE;
                if (vap->va_xflags & XFS_XFLAG_IUNLINK)
-                       inode->i_flags |= S_IMMUTABLE_LINK;
+               inode->i_flags |= S_IUNLINK;
        else
-                       inode->i_flags &= ~S_IMMUTABLE_LINK;
+               inode->i_flags &= ~S_IUNLINK;
        if (vap->va_xflags & XFS_XFLAG_APPEND)
                inode->i_flags |= S_APPEND;
        else
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/xfs/xfs_acl.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/xfs/xfs_acl.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/xfs/xfs_acl.c      2005-11-11 03:28:50 
+0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/xfs/xfs_acl.c        2005-11-11 
04:51:07 +0100
@@ -387,7 +387,7 @@ xfs_acl_allow_set(
        vattr_t         va;
        int             error;
 
-       if (vp->v_inode.i_flags & (S_IMMUTABLE_FILE|S_APPEND))
+       if (vp->v_inode.i_flags & (S_IMMUTABLE|S_APPEND))
                return EPERM;
        if (kind == _ACL_TYPE_DEFAULT && vp->v_type != VDIR)
                return ENOTDIR;
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/xfs/xfs_attr.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/xfs/xfs_attr.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/xfs/xfs_attr.c     2005-11-11 03:28:50 
+0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/xfs/xfs_attr.c       2005-11-11 
04:51:07 +0100
@@ -2548,7 +2548,7 @@ attr_user_capable(
 {
        struct inode    *inode = LINVFS_GET_IP(vp);
 
-       if (IS_IMMUTABLE_FILE(inode) || IS_APPEND(inode))
+       if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
                return -EPERM;
        if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode) &&
            !capable(CAP_SYS_ADMIN))
@@ -2566,7 +2566,7 @@ attr_trusted_capable(
 {
        struct inode    *inode = LINVFS_GET_IP(vp);
 
-       if (IS_IMMUTABLE_FILE(inode) || IS_APPEND(inode))
+       if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
                return -EPERM;
        if (!capable(CAP_SYS_ADMIN))
                return -EPERM;
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/fs/xfs/xfs_inode.c 
linux-2.4.27-9-vs1.2.10.micah-fix01/fs/xfs/xfs_inode.c
--- linux-2.4.27-9-vs1.2.10.micah/fs/xfs/xfs_inode.c    2005-11-11 03:28:50 
+0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/fs/xfs/xfs_inode.c      2005-11-11 
04:51:07 +0100
@@ -869,6 +869,8 @@ xfs_dic2xflags(
                flags |= XFS_XFLAG_PREALLOC;
        if (di_flags & XFS_DIFLAG_IMMUTABLE)
                flags |= XFS_XFLAG_IMMUTABLE;
+       if (di_flags & XFS_DIFLAG_IUNLINK)
+               flags |= XFS_XFLAG_IUNLINK;
        if (di_flags & XFS_DIFLAG_APPEND)
                flags |= XFS_XFLAG_APPEND;
        if (di_flags & XFS_DIFLAG_SYNC)
@@ -3702,7 +3704,7 @@ xfs_iaccess(
                    (S_ISREG(imode) || S_ISDIR(imode) || S_ISLNK(imode)))
                        return XFS_ERROR(EROFS);
 
-               if (IS_IMMUTABLE_FILE(inode))
+               if (IS_IMMUTABLE(inode))
                        return XFS_ERROR(EACCES);
        }
 
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/include/linux/capability.h 
linux-2.4.27-9-vs1.2.10.micah-fix01/include/linux/capability.h
--- linux-2.4.27-9-vs1.2.10.micah/include/linux/capability.h    2005-11-11 
03:28:50 +0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/include/linux/capability.h      
2005-11-11 04:52:45 +0100
@@ -130,7 +130,7 @@ typedef __u32 kernel_cap_t;
 
 #define CAP_SETPCAP          8
 
-/* Allow modification of S_IMMUTABLE_* and S_APPEND file
+/* Allow modification of S_IUNLINK_* and S_APPEND file
    attributes */
 
 #define CAP_LINUX_IMMUTABLE  9
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/include/linux/ext2_fs.h 
linux-2.4.27-9-vs1.2.10.micah-fix01/include/linux/ext2_fs.h
--- linux-2.4.27-9-vs1.2.10.micah/include/linux/ext2_fs.h       2005-11-11 
03:28:50 +0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/include/linux/ext2_fs.h 2005-11-11 
04:54:27 +0100
@@ -162,7 +162,7 @@ struct ext2_group_desc
 #define        EXT2_UNRM_FL                    0x00000002 /* Undelete */
 #define        EXT2_COMPR_FL                   0x00000004 /* Compress file */
 #define EXT2_SYNC_FL                   0x00000008 /* Synchronous updates */
-#define EXT2_IMMUTABLE_FILE_FL         0x00000010 /* Immutable file */
+#define EXT2_IMMUTABLE_FL              0x00000010 /* Immutable file */
 #define EXT2_APPEND_FL                 0x00000020 /* writes to file may only 
append */
 #define EXT2_NODUMP_FL                 0x00000040 /* do not dump file */
 #define EXT2_NOATIME_FL                        0x00000080 /* do not update 
atime */
@@ -173,7 +173,7 @@ struct ext2_group_desc
 #define EXT2_ECOMPR_FL                 0x00000800 /* Compression error */
 /* End compression flags --- maybe not all used */     
 #define EXT2_BTREE_FL                  0x00001000 /* btree format dir */
-#define EXT2_IMMUTABLE_LINK_FL         0x00008000 /* Immutable link */
+#define EXT2_IUNLINK_FL                        0x00008000 /* Immutable unlink 
*/
 #define EXT2_RESERVED_FL               0x80000000 /* reserved for ext2 lib */
 
 #define EXT2_FL_USER_VISIBLE           0x00009FFF /* User visible flags */
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/include/linux/ext3_fs.h 
linux-2.4.27-9-vs1.2.10.micah-fix01/include/linux/ext3_fs.h
--- linux-2.4.27-9-vs1.2.10.micah/include/linux/ext3_fs.h       2005-11-11 
03:28:50 +0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/include/linux/ext3_fs.h 2005-11-11 
04:54:36 +0100
@@ -165,7 +165,7 @@ struct ext3_group_desc
 #define        EXT3_UNRM_FL                    0x00000002 /* Undelete */
 #define        EXT3_COMPR_FL                   0x00000004 /* Compress file */
 #define EXT3_SYNC_FL                   0x00000008 /* Synchronous updates */
-#define EXT3_IMMUTABLE_FILE_FL         0x00000010 /* Immutable file */
+#define EXT3_IMMUTABLE_FL              0x00000010 /* Immutable file */
 #define EXT3_APPEND_FL                 0x00000020 /* writes to file may only 
append */
 #define EXT3_NODUMP_FL                 0x00000040 /* do not dump file */
 #define EXT3_NOATIME_FL                        0x00000080 /* do not update 
atime */
@@ -178,7 +178,7 @@ struct ext3_group_desc
 #define EXT3_INDEX_FL                  0x00001000 /* hash-indexed directory */
 #define EXT3_IMAGIC_FL                 0x00002000 /* AFS directory */
 #define EXT3_JOURNAL_DATA_FL           0x00004000 /* file data should be 
journaled */
-#define EXT3_IMMUTABLE_LINK_FL         0x00008000 /* Immutable link */
+#define EXT3_IUNLINK_FL                        0x00008000 /* Immutable unlink 
*/
 #define EXT3_RESERVED_FL               0x80000000 /* reserved for ext3 lib */
 
 #define EXT3_FL_USER_VISIBLE           0x0000DFFF /* User visible flags */
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/include/linux/fs.h 
linux-2.4.27-9-vs1.2.10.micah-fix01/include/linux/fs.h
--- linux-2.4.27-9-vs1.2.10.micah/include/linux/fs.h    2005-11-11 03:28:50 
+0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/include/linux/fs.h      2005-11-11 
04:52:45 +0100
@@ -133,10 +133,10 @@ extern int leases_enable, dir_notify_ena
 #define S_NOATIME      2       /* Do not update access times */
 #define S_QUOTA                4       /* Quota initialized for file */
 #define S_APPEND       8       /* Append-only file */
-#define S_IMMUTABLE_FILE       16      /* Immutable file */
+#define S_IMMUTABLE    16      /* Immutable file */
 #define S_DEAD         32      /* removed, but still open directory */
 #define S_NOQUOTA      64      /* Inode is not counted to quota */
-#define S_IMMUTABLE_LINK       128     /* Immutable links */
+#define S_IUNLINK      128     /* Immutable unlink */
 
 /*
  * Note that nosuid etc flags are inode-specific: setting some file-system
@@ -160,16 +160,16 @@ extern int leases_enable, dir_notify_ena
 #define IS_QUOTAINIT(inode)    ((inode)->i_flags & S_QUOTA)
 #define IS_NOQUOTA(inode)      ((inode)->i_flags & S_NOQUOTA)
 #define IS_APPEND(inode)       ((inode)->i_flags & S_APPEND)
-#define IS_IMMUTABLE_FILE(inode) ((inode)->i_flags & S_IMMUTABLE_FILE)
-#define IS_IMMUTABLE_LINK(inode) ((((inode)->i_flags & S_IMMUTABLE_FILE) << 3) 
^\
-                               ((inode)->i_flags & S_IMMUTABLE_LINK))
+#define IS_IMMUTABLE(inode)    ((inode)->i_flags & S_IMMUTABLE)
+#define IS_IUNLINK(inode)       ((inode)->i_flags & S_IUNLINK)
+#define IS_IXORUNLINK(inode)   ((IS_IUNLINK(inode) ? S_IMMUTABLE : 0) ^ 
IS_IMMUTABLE(inode))
 #define IS_NOATIME(inode)      (__IS_FLG(inode, MS_NOATIME) || 
((inode)->i_flags & S_NOATIME))
 #define IS_NODIRATIME(inode)   __IS_FLG(inode, MS_NODIRATIME)
 #define IS_POSIXACL(inode)     __IS_FLG(inode, MS_POSIXACL)
 
 #define IS_BARRIER(inode)      (S_ISDIR((inode)->i_mode) && \
                                (inode->i_mode & 0777) == 0 && \
-                               ((inode)->i_flags & S_IMMUTABLE_LINK))
+                               ((inode)->i_flags & S_IUNLINK))
 
 #define IS_DEADDIR(inode)      ((inode)->i_flags & S_DEAD)
 
diff -NurpP --minimal linux-2.4.27-9-vs1.2.10.micah/include/linux/reiserfs_fs.h 
linux-2.4.27-9-vs1.2.10.micah-fix01/include/linux/reiserfs_fs.h
--- linux-2.4.27-9-vs1.2.10.micah/include/linux/reiserfs_fs.h   2005-11-11 
03:28:50 +0100
+++ linux-2.4.27-9-vs1.2.10.micah-fix01/include/linux/reiserfs_fs.h     
2005-11-11 04:55:53 +0100
@@ -866,8 +866,8 @@ struct stat_data_v1
 
 /* we want common flags to have the same values as in ext2,
    so chattr(1) will work without problems */
-#define REISERFS_IMMUTABLE_FILE_FL EXT2_IMMUTABLE_FILE_FL
-#define REISERFS_IMMUTABLE_LINK_FL EXT2_IMMUTABLE_LINK_FL
+#define REISERFS_IMMUTABLE_FL EXT2_IMMUTABLE_FL
+#define REISERFS_IUNLINK_FL   EXT2_IUNLINK_FL
 #define REISERFS_APPEND_FL    EXT2_APPEND_FL
 #define REISERFS_SYNC_FL      EXT2_SYNC_FL
 #define REISERFS_NOATIME_FL   EXT2_NOATIME_FL
@@ -883,8 +883,10 @@ struct stat_data_v1
    numeric constant to ext2 macro when available. */
 #define REISERFS_NOTAIL_FL    (0x00008000) /* EXT2_NOTAIL_FL */
 
+#define REISERFS_FL_USER_MODIFIABLE (REISERFS_IUNLINK_FL|0x80FF)
+
 /* persistent flags that file inherits from the parent directory */
-#define REISERFS_INHERIT_MASK ( REISERFS_IMMUTABLE_FILE_FL |   \
+#define REISERFS_INHERIT_MASK ( REISERFS_IMMUTABLE_FL |        \
                                REISERFS_SYNC_FL |      \
                                REISERFS_NOATIME_FL |   \
                                REISERFS_NODUMP_FL |    \

Reply via email to