X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=kernel%2Fvserver%2Finode.c;h=274d05eb00719d65930cb0f4061f34b93d36b396;hb=refs%2Fheads%2Fvserver;hp=05919b0f90134312a122c5ac04e6ea8e9a714e45;hpb=f7f1b0f1e2fbadeab12d24236000e778aa9b1ead;p=linux-2.6.git diff --git a/kernel/vserver/inode.c b/kernel/vserver/inode.c index 05919b0f9..274d05eb0 100644 --- a/kernel/vserver/inode.c +++ b/kernel/vserver/inode.c @@ -3,14 +3,13 @@ * * Virtual Server: File System Support * - * Copyright (C) 2004-2005 Herbert Pötzl + * Copyright (C) 2004-2007 Herbert Pötzl * * V0.01 separated from vcontext V0.05 * */ #include -#include #include #include #include @@ -19,20 +18,21 @@ #include #include #include -#include +#include +#include #include #include -static int __vc_get_iattr(struct inode *in, uint32_t *xid, uint32_t *flags, uint32_t *mask) +static int __vc_get_iattr(struct inode *in, uint32_t *tag, uint32_t *flags, uint32_t *mask) { struct proc_dir_entry *entry; if (!in || !in->i_sb) return -ESRCH; - *flags = IATTR_XID + *flags = IATTR_TAG | (IS_BARRIER(in) ? IATTR_BARRIER : 0) | (IS_IUNLINK(in) ? IATTR_IUNLINK : 0) | (IS_IMMUTABLE(in) ? IATTR_IMMUTABLE : 0); @@ -41,9 +41,9 @@ static int __vc_get_iattr(struct inode *in, uint32_t *xid, uint32_t *flags, uint if (S_ISDIR(in->i_mode)) *mask |= IATTR_BARRIER; - if (in->i_sb->s_flags & MS_TAGXID) { - *xid = in->i_xid; - *mask |= IATTR_XID; + if (IS_TAGGED(in)) { + *tag = in->i_tag; + *mask |= IATTR_TAG; } switch (in->i_sb->s_magic) { @@ -60,8 +60,8 @@ static int __vc_get_iattr(struct inode *in, uint32_t *xid, uint32_t *flags, uint break; case DEVPTS_SUPER_MAGIC: - *xid = in->i_xid; - *mask |= IATTR_XID; + *tag = in->i_tag; + *mask |= IATTR_TAG; break; default: @@ -76,8 +76,6 @@ int vc_get_iattr(uint32_t id, void __user *data) struct vcmd_ctx_iattr_v1 vc_data = { .xid = -1 }; int ret; - if (!vx_check(0, VX_ADMIN)) - return -ENOSYS; if (copy_from_user (&vc_data, data, sizeof(vc_data))) return -EFAULT; @@ -103,7 +101,7 @@ int vc_get_iattr_x32(uint32_t id, void __user *data) struct vcmd_ctx_iattr_v1_x32 vc_data = { .xid = -1 }; int ret; - if (!vx_check(0, VX_ADMIN)) + if (!vx_check(0, VS_ADMIN)) return -ENOSYS; if (copy_from_user (&vc_data, data, sizeof(vc_data))) return -EFAULT; @@ -125,10 +123,10 @@ int vc_get_iattr_x32(uint32_t id, void __user *data) #endif /* CONFIG_COMPAT */ -static int __vc_set_iattr(struct dentry *de, uint32_t *xid, uint32_t *flags, uint32_t *mask) +static int __vc_set_iattr(struct dentry *de, uint32_t *tag, uint32_t *flags, uint32_t *mask) { struct inode *in = de->d_inode; - int error = 0, is_proc = 0, has_xid = 0; + int error = 0, is_proc = 0, has_tag = 0; struct iattr attr = { 0 }; if (!in || !in->i_sb) @@ -138,15 +136,15 @@ static int __vc_set_iattr(struct dentry *de, uint32_t *xid, uint32_t *flags, uin if ((*mask & IATTR_FLAGS) && !is_proc) return -EINVAL; - has_xid = (in->i_sb->s_flags & MS_TAGXID) || + has_tag = IS_TAGGED(in) || (in->i_sb->s_magic == DEVPTS_SUPER_MAGIC); - if ((*mask & IATTR_XID) && !has_xid) + if ((*mask & IATTR_TAG) && !has_tag) return -EINVAL; - down(&in->i_sem); - if (*mask & IATTR_XID) { - attr.ia_xid = *xid; - attr.ia_valid |= ATTR_XID; + mutex_lock(&in->i_mutex); + if (*mask & IATTR_TAG) { + attr.ia_tag = *tag; + attr.ia_valid |= ATTR_TAG; } if (*mask & IATTR_FLAGS) { @@ -161,30 +159,28 @@ static int __vc_set_iattr(struct dentry *de, uint32_t *xid, uint32_t *flags, uin } 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 +194,9 @@ static int __vc_set_iattr(struct dentry *de, uint32_t *xid, uint32_t *flags, uin } } - up(&in->i_sem); - return 0; +out: + mutex_unlock(&in->i_mutex); + return error; } int vc_set_iattr(uint32_t id, void __user *data) @@ -208,7 +205,7 @@ int vc_set_iattr(uint32_t id, void __user *data) struct vcmd_ctx_iattr_v1 vc_data; int ret; - if (!capable(CAP_SYS_ADMIN) || !capable(CAP_LINUX_IMMUTABLE)) + if (!capable(CAP_LINUX_IMMUTABLE)) return -EPERM; if (copy_from_user (&vc_data, data, sizeof(vc_data))) return -EFAULT; @@ -233,7 +230,7 @@ int vc_set_iattr_x32(uint32_t id, void __user *data) struct vcmd_ctx_iattr_v1_x32 vc_data; int ret; - if (!capable(CAP_SYS_ADMIN) || !capable(CAP_LINUX_IMMUTABLE)) + if (!capable(CAP_LINUX_IMMUTABLE)) return -EPERM; if (copy_from_user (&vc_data, data, sizeof(vc_data))) return -EFAULT; @@ -276,7 +273,7 @@ int vx_proc_ioctl(struct inode * inode, struct file * filp, error = -EPERM; flags = entry->vx_flags; if (capable(CAP_CONTEXT)) - error = put_user(flags, (int *) arg); + error = put_user(flags, (int __user *) arg); break; } case FIOC_SETXFLG: { @@ -288,7 +285,7 @@ int vx_proc_ioctl(struct inode * inode, struct file * filp, if (IS_RDONLY(inode)) break; error = -EFAULT; - if (get_user(flags, (int *) arg)) + if (get_user(flags, (int __user *) arg)) break; error = 0; entry->vx_flags = flags; @@ -299,13 +296,14 @@ int vx_proc_ioctl(struct inode * inode, struct file * filp, } return error; } -#endif +#endif /* CONFIG_VSERVER_LEGACY */ +#ifdef CONFIG_PROPAGATE -int vx_parse_xid(char *string, xid_t *xid, int remove) +int dx_parse_tag(char *string, tag_t *tag, int remove) { static match_table_t tokens = { - {1, "xid=%u"}, + {1, "tagid=%u"}, {0, NULL} }; substring_t args[MAX_OPT_ARGS]; @@ -315,15 +313,15 @@ int vx_parse_xid(char *string, xid_t *xid, int remove) return 0; token = match_token(string, tokens, args); - if (token && xid && !match_int(args, &option)) - *xid = option; + if (token && tag && !match_int(args, &option)) + *tag = option; - vxdprintk(VXD_CBIT(xid, 7), - "vx_parse_xid(»%s«): %d:#%d", + vxdprintk(VXD_CBIT(tag, 7), + "dx_parse_tag(»%s«): %d:#%d", string, token, option); - if (token && remove) { - char *p = strstr(string, "xid="); + if ((token == 1) && remove) { + char *p = strstr(string, "tagid="); char *q = p; if (p) { @@ -338,9 +336,9 @@ int vx_parse_xid(char *string, xid_t *xid, int remove) return token; } -void vx_propagate_xid(struct nameidata *nd, struct inode *inode) +void __dx_propagate_tag(struct nameidata *nd, struct inode *inode) { - xid_t new_xid = 0; + tag_t new_tag = 0; struct vfsmount *mnt; int propagate; @@ -350,20 +348,22 @@ void vx_propagate_xid(struct nameidata *nd, struct inode *inode) if (!mnt) return; - propagate = (mnt->mnt_flags & MNT_XID); + propagate = (mnt->mnt_flags & MNT_TAGID); if (propagate) - new_xid = mnt->mnt_xid; + new_tag = mnt->mnt_tag; - vxdprintk(VXD_CBIT(xid, 7), - "vx_propagate_xid(%p[#%lu.%d]): %d,%d", - inode, inode->i_ino, inode->i_xid, - new_xid, (propagate)?1:0); + vxdprintk(VXD_CBIT(tag, 7), + "dx_propagate_tag(%p[#%lu.%d]): %d,%d", + inode, inode->i_ino, inode->i_tag, + new_tag, (propagate)?1:0); if (propagate) - inode->i_xid = new_xid; + inode->i_tag = new_tag; } #include -EXPORT_SYMBOL_GPL(vx_propagate_xid); +EXPORT_SYMBOL_GPL(__dx_propagate_tag); + +#endif /* CONFIG_PROPAGATE */