fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / kernel / vserver / inode.c
index 39a26b7..274d05e 100644 (file)
@@ -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 <linux/sched.h>
-#include <linux/vs_context.h>
 #include <linux/proc_fs.h>
 #include <linux/devpts_fs.h>
 #include <linux/namei.h>
 #include <linux/compat.h>
 #include <linux/vserver/inode.h>
 #include <linux/vserver/inode_cmd.h>
-#include <linux/vserver/xid.h>
+#include <linux/vs_base.h>
+#include <linux/vs_tag.h>
 
 #include <asm/errno.h>
 #include <asm/uaccess.h>
 
 
-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 (IS_TAGXID(in)) {
-               *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 = IS_TAGXID(in) ||
+       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;
 
        mutex_lock(&in->i_mutex);
-       if (*mask & IATTR_XID) {
-               attr.ia_xid = *xid;
-               attr.ia_valid |= ATTR_XID;
+       if (*mask & IATTR_TAG) {
+               attr.ia_tag = *tag;
+               attr.ia_valid |= ATTR_TAG;
        }
 
        if (*mask & IATTR_FLAGS) {
@@ -207,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;
@@ -232,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;
@@ -298,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];
@@ -314,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) {
@@ -337,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;
 
@@ -349,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 <linux/module.h>
 
-EXPORT_SYMBOL_GPL(vx_propagate_xid);
+EXPORT_SYMBOL_GPL(__dx_propagate_tag);
+
+#endif /* CONFIG_PROPAGATE */