diff -NurpP --minimal linux-2.6.3-vs0.09.z/kernel/vserver/inode.c linux-2.6.3-vs0.09.z2/kernel/vserver/inode.c --- linux-2.6.3-vs0.09.z/kernel/vserver/inode.c 2004-02-22 00:09:42.000000000 +0100 +++ linux-2.6.3-vs0.09.z2/kernel/vserver/inode.c 2004-02-23 04:04:19.000000000 +0100 @@ -41,10 +41,13 @@ static int __vc_get_iattr(struct inode * if (in->i_sb->s_magic == PROC_SUPER_MAGIC) { struct proc_dir_entry *entry = PROC_I(in)->pde; - - // check for specific inodes - *flags |= (entry->vx_flags & IATTR_FLAGS); + *mask |= IATTR_FLAGS; + // check for specific inodes ? + if (entry) + *flags |= (entry->vx_flags & IATTR_FLAGS); + else + *flags |= (PROC_I(in)->vx_flags & IATTR_FLAGS); } return 0; } @@ -119,10 +122,13 @@ static int __vc_set_iattr(struct inode * if (*mask & IATTR_FLAGS) { struct proc_dir_entry *entry = PROC_I(in)->pde; - unsigned int iflags = entry->vx_flags; + unsigned int iflags = PROC_I(in)->vx_flags; - entry->vx_flags = (iflags & ~(*mask & IATTR_FLAGS)) + iflags = (iflags & ~(*mask & IATTR_FLAGS)) | (*flags & IATTR_FLAGS); + PROC_I(in)->vx_flags = iflags; + if (entry) + entry->vx_flags = iflags; } if (*mask & IATTR_BARRIER) @@ -143,8 +149,6 @@ int vc_set_iattr_v0(uint32_t dev, void * struct vcmd_ctx_iattr_v0 vc_data; int ret; - if (!vx_check(0, VX_ADMIN)) - return -ENOSYS; if (!capable(CAP_SYS_ADMIN) || !capable(CAP_LINUX_IMMUTABLE)) return -EPERM; if (copy_from_user (&vc_data, data, sizeof(vc_data))) @@ -173,8 +177,8 @@ int vc_set_iattr(uint32_t id, void *data struct vcmd_ctx_iattr_v1 vc_data; int ret; - if (!vx_check(0, VX_ADMIN)) - return -ENOSYS; + if (!capable(CAP_SYS_ADMIN) || !capable(CAP_LINUX_IMMUTABLE)) + return -EPERM; if (copy_from_user (&vc_data, data, sizeof(vc_data))) return -EFAULT;