-----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, ×->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(×, 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 | \