diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/Makefile linux-2.6.14-vs2.0.1-rc1/Makefile --- linux-2.6.14-vs2.0.1-pre3/Makefile 2005-10-30 16:37:14 +0100 +++ linux-2.6.14-vs2.0.1-rc1/Makefile 2005-11-06 02:18:13 +0100 @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 14 -EXTRAVERSION = -vs2.0.1-pre3 +EXTRAVERSION = -vs2.0.1-rc1 NAME=Affluent Albatross # *DOCUMENTATION* diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/arch/ppc64/kernel/vdso.c linux-2.6.14-vs2.0.1-rc1/arch/ppc64/kernel/vdso.c --- linux-2.6.14-vs2.0.1-pre3/arch/ppc64/kernel/vdso.c 2005-10-28 20:49:15 +0200 +++ linux-2.6.14-vs2.0.1-rc1/arch/ppc64/kernel/vdso.c 2005-11-03 03:48:04 +0100 @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -270,7 +271,7 @@ int arch_setup_additional_pages(struct l kmem_cache_free(vm_area_cachep, vma); return -ENOMEM; } - mm->total_vm += (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; + vx_vmpages_add(mm, (vma->vm_end - vma->vm_start) >> PAGE_SHIFT); up_write(&mm->mmap_sem); return 0; diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/arch/x86_64/ia32/syscall32.c linux-2.6.14-vs2.0.1-rc1/arch/x86_64/ia32/syscall32.c --- linux-2.6.14-vs2.0.1-pre3/arch/x86_64/ia32/syscall32.c 2005-10-28 20:49:18 +0200 +++ linux-2.6.14-vs2.0.1-rc1/arch/x86_64/ia32/syscall32.c 2005-11-03 03:48:04 +0100 @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -70,7 +71,7 @@ int syscall32_setup_pages(struct linux_b kmem_cache_free(vm_area_cachep, vma); return ret; } - mm->total_vm += npages; + vx_vmpages_add(mm, npages); up_write(&mm->mmap_sem); return 0; } diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/drivers/infiniband/core/uverbs_mem.c linux-2.6.14-vs2.0.1-rc1/drivers/infiniband/core/uverbs_mem.c --- linux-2.6.14-vs2.0.1-pre3/drivers/infiniband/core/uverbs_mem.c 2005-10-28 20:49:23 +0200 +++ linux-2.6.14-vs2.0.1-rc1/drivers/infiniband/core/uverbs_mem.c 2005-11-03 03:48:04 +0100 @@ -36,6 +36,7 @@ #include #include +#include #include "uverbs.h" @@ -161,7 +162,7 @@ out: if (ret < 0) __ib_umem_release(dev, mem, 0); else - current->mm->locked_vm = locked; + vx_vmlocked_sub(current->mm, current->mm->locked_vm - locked); up_write(¤t->mm->mmap_sem); free_page((unsigned long) page_list); @@ -174,8 +175,8 @@ void ib_umem_release(struct ib_device *d __ib_umem_release(dev, umem, 1); down_write(¤t->mm->mmap_sem); - current->mm->locked_vm -= - PAGE_ALIGN(umem->length + umem->offset) >> PAGE_SHIFT; + vx_vmlocked_sub(current->mm, + PAGE_ALIGN(umem->length + umem->offset) >> PAGE_SHIFT); up_write(¤t->mm->mmap_sem); } @@ -184,7 +185,7 @@ static void ib_umem_account(void *work_p struct ib_umem_account_work *work = work_ptr; down_write(&work->mm->mmap_sem); - work->mm->locked_vm -= work->diff; + vx_vmlocked_sub(work->mm, work->diff); up_write(&work->mm->mmap_sem); mmput(work->mm); kfree(work); diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/fs/attr.c linux-2.6.14-vs2.0.1-rc1/fs/attr.c --- linux-2.6.14-vs2.0.1-pre3/fs/attr.c 2005-10-29 04:22:54 +0200 +++ linux-2.6.14-vs2.0.1-rc1/fs/attr.c 2005-11-01 00:40:03 +0100 @@ -89,24 +89,6 @@ error: EXPORT_SYMBOL(inode_change_ok); -int inode_setattr_flags(struct inode *inode, unsigned int flags) -{ - unsigned int oldflags, newflags; - - oldflags = inode->i_flags; - newflags = oldflags & ~(S_IMMUTABLE | S_IUNLINK | S_BARRIER); - if (flags & ATTR_FLAG_IMMUTABLE) - newflags |= S_IMMUTABLE; - if (flags & ATTR_FLAG_IUNLINK) - newflags |= S_IUNLINK; - if (flags & ATTR_FLAG_BARRIER) - newflags |= S_BARRIER; - - if (oldflags ^ newflags) - inode->i_flags = newflags; - return 0; -} - int inode_setattr(struct inode * inode, struct iattr * attr) { unsigned int ia_valid = attr->ia_valid; @@ -148,8 +130,6 @@ int inode_setattr(struct inode * inode, mode &= ~S_ISGID; inode->i_mode = mode; } - if (ia_valid & ATTR_ATTR_FLAG) - inode_setattr_flags(inode, attr->ia_attr_flags); mark_inode_dirty(inode); out: return error; diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/fs/ext2/ext2.h linux-2.6.14-vs2.0.1-rc1/fs/ext2/ext2.h --- linux-2.6.14-vs2.0.1-pre3/fs/ext2/ext2.h 2005-08-29 22:25:30 +0200 +++ linux-2.6.14-vs2.0.1-rc1/fs/ext2/ext2.h 2005-11-03 17:52:25 +0100 @@ -162,6 +162,7 @@ extern struct file_operations ext2_xip_f extern struct address_space_operations ext2_aops; extern struct address_space_operations ext2_aops_xip; extern struct address_space_operations ext2_nobh_aops; +extern int ext2_sync_flags(struct inode *inode); /* namei.c */ extern struct inode_operations ext2_dir_inode_operations; diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/fs/ext2/file.c linux-2.6.14-vs2.0.1-rc1/fs/ext2/file.c --- linux-2.6.14-vs2.0.1-pre3/fs/ext2/file.c 2005-10-30 04:29:36 +0100 +++ linux-2.6.14-vs2.0.1-rc1/fs/ext2/file.c 2005-11-03 17:52:25 +0100 @@ -79,4 +79,5 @@ struct inode_operations ext2_file_inode_ #endif .setattr = ext2_setattr, .permission = ext2_permission, + .sync_flags = ext2_sync_flags, }; diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/fs/ext2/inode.c linux-2.6.14-vs2.0.1-rc1/fs/ext2/inode.c --- linux-2.6.14-vs2.0.1-pre3/fs/ext2/inode.c 2005-10-29 04:22:54 +0200 +++ linux-2.6.14-vs2.0.1-rc1/fs/ext2/inode.c 2005-11-03 17:52:25 +0100 @@ -1056,23 +1056,62 @@ void ext2_set_inode_flags(struct inode * { unsigned int flags = EXT2_I(inode)->i_flags; - inode->i_flags &= ~(S_SYNC|S_APPEND|S_IMMUTABLE|S_IUNLINK|S_BARRIER|S_NOATIME|S_DIRSYNC); - if (flags & EXT2_SYNC_FL) - inode->i_flags |= S_SYNC; - if (flags & EXT2_APPEND_FL) - inode->i_flags |= S_APPEND; + inode->i_flags &= ~(S_IMMUTABLE | S_IUNLINK | S_BARRIER | + S_SYNC | S_APPEND | S_NOATIME | S_DIRSYNC); + if (flags & EXT2_IMMUTABLE_FL) inode->i_flags |= S_IMMUTABLE; if (flags & EXT2_IUNLINK_FL) inode->i_flags |= S_IUNLINK; if (flags & EXT2_BARRIER_FL) inode->i_flags |= S_BARRIER; + + if (flags & EXT2_SYNC_FL) + inode->i_flags |= S_SYNC; + if (flags & EXT2_APPEND_FL) + inode->i_flags |= S_APPEND; if (flags & EXT2_NOATIME_FL) inode->i_flags |= S_NOATIME; if (flags & EXT2_DIRSYNC_FL) inode->i_flags |= S_DIRSYNC; } +int ext2_sync_flags(struct inode *inode) +{ + unsigned int oldflags, newflags; + + oldflags = EXT2_I(inode)->i_flags; + newflags = oldflags & ~(EXT2_APPEND_FL | + EXT2_IMMUTABLE_FL | EXT2_IUNLINK_FL | + EXT2_BARRIER_FL | EXT2_NOATIME_FL | + EXT2_SYNC_FL | EXT2_DIRSYNC_FL); + + if (IS_APPEND(inode)) + newflags |= EXT2_APPEND_FL; + if (IS_IMMUTABLE(inode)) + newflags |= EXT2_IMMUTABLE_FL; + if (IS_IUNLINK(inode)) + newflags |= EXT2_IUNLINK_FL; + if (IS_BARRIER(inode)) + newflags |= EXT2_BARRIER_FL; + + /* we do not want to copy superblock flags */ + if (inode->i_flags & S_NOATIME) + newflags |= EXT2_NOATIME_FL; + if (inode->i_flags & S_SYNC) + newflags |= EXT2_SYNC_FL; + if (inode->i_flags & S_DIRSYNC) + newflags |= EXT2_DIRSYNC_FL; + + if (oldflags ^ newflags) { + EXT2_I(inode)->i_flags = newflags; + inode->i_ctime = CURRENT_TIME; + mark_inode_dirty(inode); + } + + return 0; +} + void ext2_read_inode (struct inode * inode) { struct ext2_inode_info *ei = EXT2_I(inode); @@ -1315,27 +1354,6 @@ int ext2_sync_inode(struct inode *inode) return sync_inode(inode, &wbc); } -int ext2_setattr_flags(struct inode *inode, unsigned int flags) -{ - unsigned int oldflags, newflags; - - oldflags = EXT2_I(inode)->i_flags; - newflags = oldflags & - ~(EXT2_IMMUTABLE_FL | EXT2_IUNLINK_FL | EXT2_BARRIER_FL); - if (flags & ATTR_FLAG_IMMUTABLE) - newflags |= EXT2_IMMUTABLE_FL; - if (flags & ATTR_FLAG_IUNLINK) - newflags |= EXT2_IUNLINK_FL; - if (flags & ATTR_FLAG_BARRIER) - newflags |= EXT2_BARRIER_FL; - - if (oldflags ^ newflags) { - EXT2_I(inode)->i_flags = newflags; - inode->i_ctime = CURRENT_TIME; - } - return 0; -} - int ext2_setattr(struct dentry *dentry, struct iattr *iattr) { struct inode *inode = dentry->d_inode; @@ -1351,8 +1369,6 @@ int ext2_setattr(struct dentry *dentry, if (error) return error; } - if (iattr->ia_valid & ATTR_ATTR_FLAG) - ext2_setattr_flags(inode, iattr->ia_attr_flags); error = inode_setattr(inode, iattr); if (!error && (iattr->ia_valid & ATTR_MODE)) diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/fs/ext2/namei.c linux-2.6.14-vs2.0.1-rc1/fs/ext2/namei.c --- linux-2.6.14-vs2.0.1-pre3/fs/ext2/namei.c 2005-10-29 04:22:54 +0200 +++ linux-2.6.14-vs2.0.1-rc1/fs/ext2/namei.c 2005-11-03 17:52:25 +0100 @@ -412,6 +412,7 @@ struct inode_operations ext2_dir_inode_o #endif .setattr = ext2_setattr, .permission = ext2_permission, + .sync_flags = ext2_sync_flags, }; struct inode_operations ext2_special_inode_operations = { @@ -423,4 +424,5 @@ struct inode_operations ext2_special_ino #endif .setattr = ext2_setattr, .permission = ext2_permission, + .sync_flags = ext2_sync_flags, }; diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/fs/ext2/symlink.c linux-2.6.14-vs2.0.1-rc1/fs/ext2/symlink.c --- linux-2.6.14-vs2.0.1-pre3/fs/ext2/symlink.c 2005-08-29 22:25:30 +0200 +++ linux-2.6.14-vs2.0.1-rc1/fs/ext2/symlink.c 2005-11-03 17:52:25 +0100 @@ -38,6 +38,7 @@ struct inode_operations ext2_symlink_ino .listxattr = ext2_listxattr, .removexattr = generic_removexattr, #endif + .sync_flags = ext2_sync_flags, }; struct inode_operations ext2_fast_symlink_inode_operations = { @@ -49,4 +50,5 @@ struct inode_operations ext2_fast_symlin .listxattr = ext2_listxattr, .removexattr = generic_removexattr, #endif + .sync_flags = ext2_sync_flags, }; diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/fs/ext3/file.c linux-2.6.14-vs2.0.1-rc1/fs/ext3/file.c --- linux-2.6.14-vs2.0.1-pre3/fs/ext3/file.c 2005-10-30 04:29:36 +0100 +++ linux-2.6.14-vs2.0.1-rc1/fs/ext3/file.c 2005-11-03 17:52:25 +0100 @@ -131,5 +131,6 @@ struct inode_operations ext3_file_inode_ .removexattr = generic_removexattr, #endif .permission = ext3_permission, + .sync_flags = ext3_sync_flags, }; diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/fs/ext3/inode.c linux-2.6.14-vs2.0.1-rc1/fs/ext3/inode.c --- linux-2.6.14-vs2.0.1-pre3/fs/ext3/inode.c 2005-10-29 04:22:54 +0200 +++ linux-2.6.14-vs2.0.1-rc1/fs/ext3/inode.c 2005-11-03 17:52:25 +0100 @@ -2420,23 +2420,77 @@ void ext3_set_inode_flags(struct inode * { unsigned int flags = EXT3_I(inode)->i_flags; - inode->i_flags &= ~(S_SYNC|S_APPEND|S_IMMUTABLE|S_IUNLINK|S_BARRIER|S_NOATIME|S_DIRSYNC); - if (flags & EXT3_SYNC_FL) - inode->i_flags |= S_SYNC; - if (flags & EXT3_APPEND_FL) - inode->i_flags |= S_APPEND; + inode->i_flags &= ~(S_IMMUTABLE | S_IUNLINK | S_BARRIER | + S_SYNC | S_APPEND | S_NOATIME | S_DIRSYNC); + if (flags & EXT3_IMMUTABLE_FL) inode->i_flags |= S_IMMUTABLE; if (flags & EXT3_IUNLINK_FL) inode->i_flags |= S_IUNLINK; if (flags & EXT3_BARRIER_FL) inode->i_flags |= S_BARRIER; + + if (flags & EXT3_SYNC_FL) + inode->i_flags |= S_SYNC; + if (flags & EXT3_APPEND_FL) + inode->i_flags |= S_APPEND; if (flags & EXT3_NOATIME_FL) inode->i_flags |= S_NOATIME; if (flags & EXT3_DIRSYNC_FL) inode->i_flags |= S_DIRSYNC; } +int ext3_sync_flags(struct inode *inode) +{ + unsigned int oldflags, newflags; + int err = 0; + + oldflags = EXT3_I(inode)->i_flags; + newflags = oldflags & ~(EXT3_APPEND_FL | + EXT3_IMMUTABLE_FL | EXT3_IUNLINK_FL | + EXT3_BARRIER_FL | EXT3_NOATIME_FL | + EXT3_SYNC_FL | EXT3_DIRSYNC_FL); + + if (IS_APPEND(inode)) + newflags |= EXT3_APPEND_FL; + if (IS_IMMUTABLE(inode)) + newflags |= EXT3_IMMUTABLE_FL; + if (IS_IUNLINK(inode)) + newflags |= EXT3_IUNLINK_FL; + if (IS_BARRIER(inode)) + newflags |= EXT3_BARRIER_FL; + + /* we do not want to copy superblock flags */ + if (inode->i_flags & S_NOATIME) + newflags |= EXT3_NOATIME_FL; + if (inode->i_flags & S_SYNC) + newflags |= EXT3_SYNC_FL; + if (inode->i_flags & S_DIRSYNC) + newflags |= EXT3_DIRSYNC_FL; + + if (oldflags ^ newflags) { + handle_t *handle; + struct ext3_iloc iloc; + + handle = ext3_journal_start(inode, 1); + if (IS_ERR(handle)) + return PTR_ERR(handle); + if (IS_SYNC(inode)) + handle->h_sync = 1; + err = ext3_reserve_inode_write(handle, inode, &iloc); + if (err) + goto flags_err; + + EXT3_I(inode)->i_flags = newflags; + inode->i_ctime = CURRENT_TIME; + + err = ext3_mark_iloc_dirty(handle, inode, &iloc); + flags_err: + ext3_journal_stop(handle); + } + return err; +} + void ext3_read_inode(struct inode * inode) { struct ext3_iloc iloc; @@ -2756,44 +2810,6 @@ int ext3_write_inode(struct inode *inode return ext3_force_commit(inode->i_sb); } -int ext3_setattr_flags(struct inode *inode, unsigned int flags) -{ - unsigned int oldflags, newflags; - int err = 0; - - oldflags = EXT3_I(inode)->i_flags; - newflags = oldflags & - ~(EXT3_IMMUTABLE_FL | EXT3_IUNLINK_FL | EXT3_BARRIER_FL); - if (flags & ATTR_FLAG_IMMUTABLE) - newflags |= EXT3_IMMUTABLE_FL; - if (flags & ATTR_FLAG_IUNLINK) - newflags |= EXT3_IUNLINK_FL; - if (flags & ATTR_FLAG_BARRIER) - newflags |= EXT3_BARRIER_FL; - - if (oldflags ^ newflags) { - handle_t *handle; - struct ext3_iloc iloc; - - handle = ext3_journal_start(inode, 1); - if (IS_ERR(handle)) - return PTR_ERR(handle); - if (IS_SYNC(inode)) - handle->h_sync = 1; - err = ext3_reserve_inode_write(handle, inode, &iloc); - if (err) - goto flags_err; - - EXT3_I(inode)->i_flags = newflags; - inode->i_ctime = CURRENT_TIME; - - err = ext3_mark_iloc_dirty(handle, inode, &iloc); - flags_err: - ext3_journal_stop(handle); - } - return err; -} - /* * ext3_setattr() * @@ -2869,12 +2885,6 @@ int ext3_setattr(struct dentry *dentry, ext3_journal_stop(handle); } - if (ia_valid & ATTR_ATTR_FLAG) { - rc = ext3_setattr_flags(inode, attr->ia_attr_flags); - if (!error) - error = rc; - } - rc = inode_setattr(inode, attr); /* If inode_setattr's call to ext3_truncate failed to get a diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/fs/ext3/namei.c linux-2.6.14-vs2.0.1-rc1/fs/ext3/namei.c --- linux-2.6.14-vs2.0.1-pre3/fs/ext3/namei.c 2005-10-29 04:22:54 +0200 +++ linux-2.6.14-vs2.0.1-rc1/fs/ext3/namei.c 2005-11-03 17:52:25 +0100 @@ -2375,6 +2375,7 @@ struct inode_operations ext3_dir_inode_o .removexattr = generic_removexattr, #endif .permission = ext3_permission, + .sync_flags = ext3_sync_flags, }; struct inode_operations ext3_special_inode_operations = { @@ -2386,4 +2387,5 @@ struct inode_operations ext3_special_ino .removexattr = generic_removexattr, #endif .permission = ext3_permission, + .sync_flags = ext3_sync_flags, }; diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/fs/ext3/symlink.c linux-2.6.14-vs2.0.1-rc1/fs/ext3/symlink.c --- linux-2.6.14-vs2.0.1-pre3/fs/ext3/symlink.c 2005-08-29 22:25:30 +0200 +++ linux-2.6.14-vs2.0.1-rc1/fs/ext3/symlink.c 2005-11-03 17:52:25 +0100 @@ -40,6 +40,7 @@ struct inode_operations ext3_symlink_ino .listxattr = ext3_listxattr, .removexattr = generic_removexattr, #endif + .sync_flags = ext3_sync_flags, }; struct inode_operations ext3_fast_symlink_inode_operations = { @@ -51,4 +52,5 @@ struct inode_operations ext3_fast_symlin .listxattr = ext3_listxattr, .removexattr = generic_removexattr, #endif + .sync_flags = ext3_sync_flags, }; diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/fs/reiserfs/file.c linux-2.6.14-vs2.0.1-rc1/fs/reiserfs/file.c --- linux-2.6.14-vs2.0.1-pre3/fs/reiserfs/file.c 2005-10-30 04:29:36 +0100 +++ linux-2.6.14-vs2.0.1-rc1/fs/reiserfs/file.c 2005-11-03 17:52:25 +0100 @@ -1567,4 +1567,5 @@ struct inode_operations reiserfs_file_in .listxattr = reiserfs_listxattr, .removexattr = reiserfs_removexattr, .permission = reiserfs_permission, + .sync_flags = reiserfs_sync_flags, }; diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/fs/reiserfs/inode.c linux-2.6.14-vs2.0.1-rc1/fs/reiserfs/inode.c --- linux-2.6.14-vs2.0.1-pre3/fs/reiserfs/inode.c 2005-10-29 04:22:54 +0200 +++ linux-2.6.14-vs2.0.1-rc1/fs/reiserfs/inode.c 2005-11-03 17:52:25 +0100 @@ -2921,24 +2921,21 @@ static ssize_t reiserfs_direct_IO(int rw reiserfs_get_blocks_direct_io, NULL); } -int reiserfs_setattr_flags(struct inode *inode, unsigned int flags) +int reiserfs_sync_flags(struct inode *inode) { - unsigned int oldflags, newflags; + u16 oldflags, newflags; + reiserfs_write_lock(inode->i_sb); oldflags = REISERFS_I(inode)->i_flags; - newflags = oldflags & ~(REISERFS_IMMUTABLE_FL | - REISERFS_IUNLINK_FL | REISERFS_BARRIER_FL); - if (flags & ATTR_FLAG_IMMUTABLE) - newflags |= REISERFS_IMMUTABLE_FL; - if (flags & ATTR_FLAG_IUNLINK) - newflags |= REISERFS_IUNLINK_FL; - if (flags & ATTR_FLAG_BARRIER) - newflags |= REISERFS_BARRIER_FL; + newflags = oldflags; + i_attrs_to_sd_attrs(inode, &newflags); if (oldflags ^ newflags) { REISERFS_I(inode)->i_flags = newflags; inode->i_ctime = CURRENT_TIME; + mark_inode_dirty(inode); } + reiserfs_write_unlock(inode->i_sb); return 0; } @@ -2987,9 +2984,6 @@ int reiserfs_setattr(struct dentry *dent error = inode_change_ok(inode, attr); - if (!error && attr->ia_valid & ATTR_ATTR_FLAG) - reiserfs_setattr_flags(inode, attr->ia_attr_flags); - if (!error) { if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) || (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid) || diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/fs/reiserfs/namei.c linux-2.6.14-vs2.0.1-rc1/fs/reiserfs/namei.c --- linux-2.6.14-vs2.0.1-pre3/fs/reiserfs/namei.c 2005-10-29 04:22:54 +0200 +++ linux-2.6.14-vs2.0.1-rc1/fs/reiserfs/namei.c 2005-11-03 17:52:25 +0100 @@ -1553,6 +1553,7 @@ struct inode_operations reiserfs_dir_ino .listxattr = reiserfs_listxattr, .removexattr = reiserfs_removexattr, .permission = reiserfs_permission, + .sync_flags = reiserfs_sync_flags, }; /* @@ -1569,6 +1570,7 @@ struct inode_operations reiserfs_symlink .listxattr = reiserfs_listxattr, .removexattr = reiserfs_removexattr, .permission = reiserfs_permission, + .sync_flags = reiserfs_sync_flags, }; @@ -1582,5 +1584,6 @@ struct inode_operations reiserfs_special .listxattr = reiserfs_listxattr, .removexattr = reiserfs_removexattr, .permission = reiserfs_permission, + .sync_flags = reiserfs_sync_flags, }; diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/fs/xfs/linux-2.6/xfs_iops.c linux-2.6.14-vs2.0.1-rc1/fs/xfs/linux-2.6/xfs_iops.c --- linux-2.6.14-vs2.0.1-pre3/fs/xfs/linux-2.6/xfs_iops.c 2005-10-29 15:38:05 +0200 +++ linux-2.6.14-vs2.0.1-rc1/fs/xfs/linux-2.6/xfs_iops.c 2005-11-03 17:52:25 +0100 @@ -473,25 +473,38 @@ linvfs_getattr( } STATIC int -linvfs_setattr_flags( - vattr_t *vap, - unsigned int flags) +linvfs_sync_flags(struct inode *inode) { unsigned int oldflags, newflags; + vattr_t vattr; + int flags = 0; + int error; + vnode_t *vp = LINVFS_GET_VP(inode); - oldflags = vap->va_xflags; + memset(&vattr, 0, sizeof(vattr_t)); + + vattr.va_mask = XFS_AT_XFLAGS; + VOP_GETATTR(vp, &vattr, 0, NULL, error); + if (error) + return error; + oldflags = vattr.va_xflags; newflags = oldflags & ~(XFS_XFLAG_IMMUTABLE | XFS_XFLAG_IUNLINK | XFS_XFLAG_BARRIER); - if (flags & ATTR_FLAG_IMMUTABLE) + + if (IS_IMMUTABLE(inode)) newflags |= XFS_XFLAG_IMMUTABLE; - if (flags & ATTR_FLAG_IUNLINK) + if (IS_IUNLINK(inode)) newflags |= XFS_XFLAG_IUNLINK; - if (flags & ATTR_FLAG_BARRIER) + if (IS_BARRIER(inode)) newflags |= XFS_XFLAG_BARRIER; - if (oldflags ^ newflags) - vap->va_xflags = newflags; - return 0; + if (oldflags ^ newflags) { + vattr.va_xflags = newflags; + vattr.va_mask |= XFS_AT_XFLAGS; + VOP_SETATTR(vp, &vattr, flags, NULL, error); + } + vn_revalidate(vp); + return error; } STATIC int @@ -553,11 +566,6 @@ linvfs_setattr( flags |= ATTR_NONBLOCK; #endif - if (ia_valid & ATTR_ATTR_FLAG) { - vattr.va_mask |= XFS_AT_XFLAGS; - linvfs_setattr_flags(&vattr, attr->ia_attr_flags); - } - VOP_SETATTR(vp, &vattr, flags, NULL, error); if (error) return -error; @@ -685,6 +693,7 @@ struct inode_operations linvfs_file_inod .getxattr = linvfs_getxattr, .listxattr = linvfs_listxattr, .removexattr = linvfs_removexattr, + .sync_flags = linvfs_sync_flags, }; struct inode_operations linvfs_dir_inode_operations = { @@ -704,6 +713,7 @@ struct inode_operations linvfs_dir_inode .getxattr = linvfs_getxattr, .listxattr = linvfs_listxattr, .removexattr = linvfs_removexattr, + .sync_flags = linvfs_sync_flags, }; struct inode_operations linvfs_symlink_inode_operations = { @@ -717,4 +727,5 @@ struct inode_operations linvfs_symlink_i .getxattr = linvfs_getxattr, .listxattr = linvfs_listxattr, .removexattr = linvfs_removexattr, + .sync_flags = linvfs_sync_flags, }; diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/include/linux/ext3_fs.h linux-2.6.14-vs2.0.1-rc1/include/linux/ext3_fs.h --- linux-2.6.14-vs2.0.1-pre3/include/linux/ext3_fs.h 2005-10-29 04:28:52 +0200 +++ linux-2.6.14-vs2.0.1-rc1/include/linux/ext3_fs.h 2005-11-03 17:52:25 +0100 @@ -787,6 +787,7 @@ extern unsigned long ext3_count_free (st extern int ext3_forget(handle_t *, int, struct inode *, struct buffer_head *, int); extern struct buffer_head * ext3_getblk (handle_t *, struct inode *, long, int, int *); extern struct buffer_head * ext3_bread (handle_t *, struct inode *, int, int, int *); +extern int ext3_sync_flags(struct inode *inode); extern void ext3_read_inode (struct inode *); extern int ext3_write_inode (struct inode *, int); diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/include/linux/fs.h linux-2.6.14-vs2.0.1-rc1/include/linux/fs.h --- linux-2.6.14-vs2.0.1-pre3/include/linux/fs.h 2005-10-30 04:30:05 +0100 +++ linux-2.6.14-vs2.0.1-rc1/include/linux/fs.h 2005-11-03 17:52:25 +0100 @@ -293,10 +293,8 @@ struct iattr { struct timespec ia_atime; struct timespec ia_mtime; struct timespec ia_ctime; - unsigned int ia_attr_flags; }; -#define ATTR_FLAG_IMMUTABLE 256 /* Immutable file */ #define ATTR_FLAG_BARRIER 512 /* Barrier for chroot() */ #define ATTR_FLAG_IUNLINK 1024 /* Immutable unlink */ @@ -1013,6 +1011,7 @@ struct inode_operations { ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); ssize_t (*listxattr) (struct dentry *, char *, size_t); int (*removexattr) (struct dentry *, const char *); + int (*sync_flags) (struct inode *); }; struct seq_file; diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/include/linux/reiserfs_fs.h linux-2.6.14-vs2.0.1-rc1/include/linux/reiserfs_fs.h --- linux-2.6.14-vs2.0.1-pre3/include/linux/reiserfs_fs.h 2005-10-29 03:19:02 +0200 +++ linux-2.6.14-vs2.0.1-rc1/include/linux/reiserfs_fs.h 2005-11-03 17:52:25 +0100 @@ -1916,6 +1916,7 @@ static inline void reiserfs_update_sd(st void sd_attrs_to_i_attrs(__u16 sd_attrs, struct inode *inode); void i_attrs_to_sd_attrs(struct inode *inode, __u16 * sd_attrs); int reiserfs_setattr(struct dentry *dentry, struct iattr *attr); +int reiserfs_sync_flags(struct inode *inode); /* namei.c */ void set_de_name_and_namelen(struct reiserfs_dir_entry *de); diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/kernel/fork.c linux-2.6.14-vs2.0.1-rc1/kernel/fork.c --- linux-2.6.14-vs2.0.1-pre3/kernel/fork.c 2005-10-30 04:29:36 +0100 +++ linux-2.6.14-vs2.0.1-rc1/kernel/fork.c 2005-11-03 03:48:04 +0100 @@ -216,7 +216,7 @@ static inline int dup_mmap(struct mm_str if (mpnt->vm_flags & VM_DONTCOPY) { long pages = vma_pages(mpnt); - mm->total_vm -= pages; + vx_vmpages_sub(mm, pages); __vm_stat_account(mm, mpnt->vm_flags, mpnt->vm_file, -pages); continue; diff -NurpP --minimal linux-2.6.14-vs2.0.1-pre3/kernel/vserver/inode.c linux-2.6.14-vs2.0.1-rc1/kernel/vserver/inode.c --- linux-2.6.14-vs2.0.1-pre3/kernel/vserver/inode.c 2005-10-30 04:29:36 +0100 +++ linux-2.6.14-vs2.0.1-rc1/kernel/vserver/inode.c 2005-11-03 17:52:25 +0100 @@ -161,30 +161,28 @@ static int __vc_set_iattr(struct dentry } if (*mask & (IATTR_BARRIER | IATTR_IUNLINK | IATTR_IMMUTABLE)) { - - attr.ia_valid |= ATTR_ATTR_FLAG; - attr.ia_attr_flags = - (IS_IMMUTABLE(in) ? ATTR_FLAG_IMMUTABLE : 0) | - (IS_IUNLINK(in) ? ATTR_FLAG_IUNLINK : 0) | - (IS_BARRIER(in) ? ATTR_FLAG_BARRIER : 0); - if (*mask & IATTR_IMMUTABLE) { if (*flags & IATTR_IMMUTABLE) - attr.ia_attr_flags |= ATTR_FLAG_IMMUTABLE; + in->i_flags |= S_IMMUTABLE; else - attr.ia_attr_flags &= ~ATTR_FLAG_IMMUTABLE; + in->i_flags &= ~S_IMMUTABLE; } if (*mask & IATTR_IUNLINK) { if (*flags & IATTR_IUNLINK) - attr.ia_attr_flags |= ATTR_FLAG_IUNLINK; + in->i_flags |= S_IUNLINK; else - attr.ia_attr_flags &= ~ATTR_FLAG_IUNLINK; + in->i_flags &= ~S_IUNLINK; } if (S_ISDIR(in->i_mode) && (*mask & IATTR_BARRIER)) { if (*flags & IATTR_BARRIER) - attr.ia_attr_flags |= ATTR_FLAG_BARRIER; + in->i_flags |= S_BARRIER; else - attr.ia_attr_flags &= ~ATTR_FLAG_BARRIER; + in->i_flags &= ~S_BARRIER; + } + if (in->i_op && in->i_op->sync_flags) { + error = in->i_op->sync_flags(in); + if (error) + goto out; } } @@ -198,8 +196,9 @@ static int __vc_set_iattr(struct dentry } } +out: up(&in->i_sem); - return 0; + return error; } int vc_set_iattr(uint32_t id, void __user *data)