Merge to Fedora kernel-2.6.18-1.2255_FC5-vs2.0.2.2-rc9 patched with stable patch...
[linux-2.6.git] / kernel / vserver / proc.c
index 06141cd..d7a5edc 100644 (file)
@@ -15,7 +15,6 @@
  *
  */
 
-#include <linux/config.h>
 #include <linux/errno.h>
 #include <linux/proc_fs.h>
 #include <linux/sched.h>
@@ -77,7 +76,7 @@ int proc_xid_info (int vid, char *buffer)
        struct vx_info *vxi;
        int length;
 
-       vxi = locate_vx_info(vid);
+       vxi = lookup_vx_info(vid);
        if (!vxi)
                return 0;
        length = sprintf(buffer,
@@ -97,7 +96,7 @@ int proc_xid_status (int vid, char *buffer)
        struct vx_info *vxi;
        int length;
 
-       vxi = locate_vx_info(vid);
+       vxi = lookup_vx_info(vid);
        if (!vxi)
                return 0;
        length = sprintf(buffer,
@@ -123,7 +122,7 @@ int proc_xid_limit (int vid, char *buffer)
        struct vx_info *vxi;
        int length;
 
-       vxi = locate_vx_info(vid);
+       vxi = lookup_vx_info(vid);
        if (!vxi)
                return 0;
        length = vx_info_proc_limit(&vxi->limit, buffer);
@@ -136,7 +135,7 @@ int proc_xid_sched (int vid, char *buffer)
        struct vx_info *vxi;
        int length;
 
-       vxi = locate_vx_info(vid);
+       vxi = lookup_vx_info(vid);
        if (!vxi)
                return 0;
        length = vx_info_proc_sched(&vxi->sched, buffer);
@@ -149,7 +148,7 @@ int proc_xid_cvirt (int vid, char *buffer)
        struct vx_info *vxi;
        int length;
 
-       vxi = locate_vx_info(vid);
+       vxi = lookup_vx_info(vid);
        if (!vxi)
                return 0;
        vx_update_load(vxi);
@@ -163,7 +162,7 @@ int proc_xid_cacct (int vid, char *buffer)
        struct vx_info *vxi;
        int length;
 
-       vxi = locate_vx_info(vid);
+       vxi = lookup_vx_info(vid);
        if (!vxi)
                return 0;
        length = vx_info_proc_cacct(&vxi->cacct, buffer);
@@ -183,16 +182,13 @@ static int proc_vnet_info(int vid, char *buffer)
                );
 }
 
-#define atoquad(a) \
-       (((a)>>0) & 0xff), (((a)>>8) & 0xff), \
-       (((a)>>16) & 0xff), (((a)>>24) & 0xff)
 
 int proc_nid_info (int vid, char *buffer)
 {
        struct nx_info *nxi;
        int length, i;
 
-       nxi = locate_nx_info(vid);
+       nxi = lookup_nx_info(vid);
        if (!nxi)
                return 0;
        length = sprintf(buffer,
@@ -203,9 +199,8 @@ int proc_nid_info (int vid, char *buffer)
                );
        for (i=0; i<nxi->nbipv4; i++) {
                length += sprintf(buffer + length,
-                       "%d:\t%d.%d.%d.%d/%d.%d.%d.%d\n", i,
-                       atoquad(nxi->ipv4[i]),
-                       atoquad(nxi->mask[i]));
+                       "%d:\t" NIPQUAD_FMT "/" NIPQUAD_FMT "\n", i,
+                       NIPQUAD(nxi->ipv4[i]), NIPQUAD(nxi->mask[i]));
        }
        put_nx_info(nxi);
        return length;
@@ -216,14 +211,16 @@ int proc_nid_status (int vid, char *buffer)
        struct nx_info *nxi;
        int length;
 
-       nxi = locate_nx_info(vid);
+       nxi = lookup_nx_info(vid);
        if (!nxi)
                return 0;
        length = sprintf(buffer,
                "UseCnt:\t%d\n"
-               "RefCnt:\t%d\n"
+               "Tasks:\t%d\n"
+               "Flags:\t%016llx\n"
                ,atomic_read(&nxi->nx_usecnt)
-               ,atomic_read(&nxi->nx_refcnt)
+               ,atomic_read(&nxi->nx_tasks)
+               ,(unsigned long long)nxi->nx_flags
                );
        put_nx_info(nxi);
        return length;
@@ -255,7 +252,6 @@ static struct inode *proc_vid_make_inode(struct super_block * sb,
 
        inode->i_uid = 0;
        inode->i_gid = 0;
-       // inode->i_xid = xid;
 out:
        return inode;
 }
@@ -280,17 +276,10 @@ static int proc_vid_revalidate(struct dentry * dentry, struct nameidata *nd)
        return 0;
 }
 
-/*
-static int proc_vid_delete_dentry(struct dentry * dentry)
-{
-       return 1;
-}
-*/
-
 
 #define PROC_BLOCK_SIZE (PAGE_SIZE - 1024)
 
-static ssize_t proc_vid_info_read(struct file * file, char * buf,
+static ssize_t proc_vid_info_read(struct file * file, char __user * buf,
                          size_t count, loff_t *ppos)
 {
        struct inode * inode = file->f_dentry->d_inode;
@@ -320,12 +309,11 @@ static ssize_t proc_vid_info_read(struct file * file, char * buf,
 /* here comes the lower level (vid) */
 
 static struct file_operations proc_vid_info_file_operations = {
-       read:           proc_vid_info_read,
+       .read =         proc_vid_info_read,
 };
 
 static struct dentry_operations proc_vid_dentry_operations = {
-       d_revalidate:   proc_vid_revalidate,
-//     d_delete:       proc_vid_delete_dentry,
+       .d_revalidate = proc_vid_revalidate,
 };
 
 
@@ -424,7 +412,6 @@ static struct dentry *proc_vid_lookup(struct inode *dir,
                        return ERR_PTR(-EINVAL);
        }
        inode->i_mode = p->mode;
-//     inode->i_op = &proc_vid_info_inode_operations;
        inode->i_fop = &proc_vid_info_file_operations;
        inode->i_nlink = 1;
        inode->i_flags|=S_IMMUTABLE;
@@ -446,44 +433,44 @@ static int proc_vid_readdir(struct file * filp,
 
        i = filp->f_pos;
        switch (i) {
-               case 0:
-                       if (filldir(dirent, ".", 1, i,
-                               inode->i_ino, DT_DIR) < 0)
-                               return 0;
-                       i++;
-                       filp->f_pos++;
-                       /* fall through */
-               case 1:
-                       if (filldir(dirent, "..", 2, i,
-                               PROC_ROOT_INO, DT_DIR) < 0)
+       case 0:
+               if (filldir(dirent, ".", 1, i,
+                       inode->i_ino, DT_DIR) < 0)
+                       return 0;
+               i++;
+               filp->f_pos++;
+               /* fall through */
+       case 1:
+               if (filldir(dirent, "..", 2, i,
+                       PROC_ROOT_INO, DT_DIR) < 0)
+                       return 0;
+               i++;
+               filp->f_pos++;
+               /* fall through */
+       default:
+               i -= 2;
+               switch (inode_type(inode)) {
+                       case PROC_XID_INO:
+                               size = sizeof(vx_base_stuff);
+                               p = vx_base_stuff + i;
+                               break;
+                       case PROC_NID_INO:
+                               size = sizeof(vn_base_stuff);
+                               p = vn_base_stuff + i;
+                               break;
+                       default:
+                               return 1;
+               }
+               if (i >= size/sizeof(struct vid_entry))
+                       return 1;
+               while (p->name) {
+                       if (filldir(dirent, p->name, p->len,
+                               filp->f_pos, fake_ino(inode_vid(inode),
+                               p->type), p->mode >> 12) < 0)
                                return 0;
-                       i++;
                        filp->f_pos++;
-                       /* fall through */
-               default:
-                       i -= 2;
-                       switch (inode_type(inode)) {
-                               case PROC_XID_INO:
-                                       size = sizeof(vx_base_stuff);
-                                       p = vx_base_stuff + i;
-                                       break;
-                               case PROC_NID_INO:
-                                       size = sizeof(vn_base_stuff);
-                                       p = vn_base_stuff + i;
-                                       break;
-                               default:
-                                       return 1;
-                       }
-                       if (i >= size/sizeof(struct vid_entry))
-                               return 1;
-                       while (p->name) {
-                               if (filldir(dirent, p->name, p->len,
-                                       filp->f_pos, fake_ino(inode_vid(inode),
-                                       p->type), p->mode >> 12) < 0)
-                                       return 0;
-                               filp->f_pos++;
-                               p++;
-                       }
+                       p++;
+               }
        }
        return 1;
 }
@@ -494,12 +481,12 @@ static int proc_vid_readdir(struct file * filp,
 /* now the upper level (virtual) */
 
 static struct file_operations proc_vid_file_operations = {
-       read:           generic_read_dir,
-       readdir:        proc_vid_readdir,
+       .read =         generic_read_dir,
+       .readdir =      proc_vid_readdir,
 };
 
 static struct inode_operations proc_vid_inode_operations = {
-       lookup:         proc_vid_lookup,
+       .lookup =       proc_vid_lookup,
 };
 
 
@@ -546,8 +533,6 @@ struct dentry *proc_virtual_lookup(struct inode *dir,
                inode->i_ino = fake_ino(1, PROC_XID_INO);
                inode->i_mode = S_IFLNK|S_IRWXUGO;
                inode->i_uid = inode->i_gid = 0;
-               inode->i_size = 64;
-//             inode->i_op = &proc_current_inode_operations;
                d_add(dentry, inode);
                return NULL;
        }
@@ -558,8 +543,6 @@ struct dentry *proc_virtual_lookup(struct inode *dir,
                inode->i_fop = &proc_vid_info_file_operations;
                PROC_I(inode)->op.proc_vid_read = proc_virtual_info;
                inode->i_mode = S_IFREG|S_IRUGO;
-//             inode->i_size = 64;
-//             inode->i_op = &proc_current_inode_operations;
                d_add(dentry, inode);
                return NULL;
        }
@@ -568,7 +551,7 @@ struct dentry *proc_virtual_lookup(struct inode *dir,
        xid = atovid(name, len);
        if (xid < 0)
                goto out;
-       vxi = locate_vx_info(xid);
+       vxi = lookup_vx_info(xid);
        if (!vxi)
                goto out;
 
@@ -579,7 +562,7 @@ struct dentry *proc_virtual_lookup(struct inode *dir,
        if (!inode)
                goto out_release;
 
-       inode->i_mode = S_IFDIR|S_IRUGO;
+       inode->i_mode = S_IFDIR|S_IRUGO|S_IXUGO;
        inode->i_op = &proc_vid_inode_operations;
        inode->i_fop = &proc_vid_file_operations;
        inode->i_nlink = 2;
@@ -616,8 +599,6 @@ struct dentry *proc_vnet_lookup(struct inode *dir,
                inode->i_ino = fake_ino(1, PROC_NID_INO);
                inode->i_mode = S_IFLNK|S_IRWXUGO;
                inode->i_uid = inode->i_gid = 0;
-               inode->i_size = 64;
-//             inode->i_op = &proc_current_inode_operations;
                d_add(dentry, inode);
                return NULL;
        }
@@ -628,8 +609,6 @@ struct dentry *proc_vnet_lookup(struct inode *dir,
                inode->i_fop = &proc_vid_info_file_operations;
                PROC_I(inode)->op.proc_vid_read = proc_vnet_info;
                inode->i_mode = S_IFREG|S_IRUGO;
-//             inode->i_size = 64;
-//             inode->i_op = &proc_current_inode_operations;
                d_add(dentry, inode);
                return NULL;
        }
@@ -638,7 +617,7 @@ struct dentry *proc_vnet_lookup(struct inode *dir,
        nid = atovid(name, len);
        if (nid < 0)
                goto out;
-       nxi = locate_nx_info(nid);
+       nxi = lookup_nx_info(nid);
        if (!nxi)
                goto out;
 
@@ -649,7 +628,7 @@ struct dentry *proc_vnet_lookup(struct inode *dir,
        if (!inode)
                goto out_release;
 
-       inode->i_mode = S_IFDIR|S_IRUGO;
+       inode->i_mode = S_IFDIR|S_IRUGO|S_IXUGO;
        inode->i_op = &proc_vid_inode_operations;
        inode->i_fop = &proc_vid_file_operations;
        inode->i_nlink = 2;
@@ -681,35 +660,35 @@ int proc_virtual_readdir(struct file * filp,
        ino_t ino;
 
        switch ((long)filp->f_pos) {
-               case 0:
-                       ino = fake_ino(0, PROC_XID_INO);
-                       if (filldir(dirent, ".", 1,
-                               filp->f_pos, ino, DT_DIR) < 0)
-                               return 0;
-                       filp->f_pos++;
-                       /* fall through */
-               case 1:
-                       ino = filp->f_dentry->d_parent->d_inode->i_ino;
-                       if (filldir(dirent, "..", 2,
-                               filp->f_pos, ino, DT_DIR) < 0)
-                               return 0;
-                       filp->f_pos++;
-                       /* fall through */
-               case 2:
-                       ino = fake_ino(0, PROC_XID_INFO);
-                       if (filldir(dirent, "info", 4,
+       case 0:
+               ino = fake_ino(0, PROC_XID_INO);
+               if (filldir(dirent, ".", 1,
+                       filp->f_pos, ino, DT_DIR) < 0)
+                       return 0;
+               filp->f_pos++;
+               /* fall through */
+       case 1:
+               ino = filp->f_dentry->d_parent->d_inode->i_ino;
+               if (filldir(dirent, "..", 2,
+                       filp->f_pos, ino, DT_DIR) < 0)
+                       return 0;
+               filp->f_pos++;
+               /* fall through */
+       case 2:
+               ino = fake_ino(0, PROC_XID_INFO);
+               if (filldir(dirent, "info", 4,
+                       filp->f_pos, ino, DT_LNK) < 0)
+                       return 0;
+               filp->f_pos++;
+               /* fall through */
+       case 3:
+               if (vx_current_xid() > 1) {
+                       ino = fake_ino(1, PROC_XID_INO);
+                       if (filldir(dirent, "current", 7,
                                filp->f_pos, ino, DT_LNK) < 0)
                                return 0;
-                       filp->f_pos++;
-                       /* fall through */
-               case 3:
-                       if (vx_current_xid() > 1) {
-                               ino = fake_ino(1, PROC_XID_INO);
-                               if (filldir(dirent, "current", 7,
-                                       filp->f_pos, ino, DT_LNK) < 0)
-                                       return 0;
-                       }
-                       filp->f_pos++;
+               }
+               filp->f_pos++;
        }
 
        nr_xids = get_xid_list(nr, xid_array, PROC_MAXVIDS);
@@ -730,12 +709,12 @@ int proc_virtual_readdir(struct file * filp,
 
 
 static struct file_operations proc_virtual_dir_operations = {
-       read:           generic_read_dir,
-       readdir:        proc_virtual_readdir,
+       .read =         generic_read_dir,
+       .readdir =      proc_virtual_readdir,
 };
 
 static struct inode_operations proc_virtual_dir_inode_operations = {
-       lookup:         proc_virtual_lookup,
+       .lookup =       proc_virtual_lookup,
 };
 
 
@@ -744,40 +723,32 @@ int proc_vnet_readdir(struct file * filp,
 {
        unsigned int nid_array[PROC_MAXVIDS];
        char buf[PROC_NUMBUF];
-       unsigned int nr = filp->f_pos-3;
+       unsigned int nr = filp->f_pos-2;
        unsigned int nr_nids, i;
        ino_t ino;
 
        switch ((long)filp->f_pos) {
-               case 0:
-                       ino = fake_ino(0, PROC_NID_INO);
-                       if (filldir(dirent, ".", 1,
-                               filp->f_pos, ino, DT_DIR) < 0)
-                               return 0;
-                       filp->f_pos++;
-                       /* fall through */
-               case 1:
-                       ino = filp->f_dentry->d_parent->d_inode->i_ino;
-                       if (filldir(dirent, "..", 2,
-                               filp->f_pos, ino, DT_DIR) < 0)
-                               return 0;
-                       filp->f_pos++;
-                       /* fall through */
-               case 2:
-                       ino = fake_ino(0, PROC_NID_INFO);
-                       if (filldir(dirent, "info", 4,
-                               filp->f_pos, ino, DT_LNK) < 0)
-                               return 0;
-                       filp->f_pos++;
-                       /* fall through */
-               case 3:
-                       if (vx_current_xid() > 1) {
-                               ino = fake_ino(1, PROC_NID_INO);
-                               if (filldir(dirent, "current", 7,
-                                       filp->f_pos, ino, DT_LNK) < 0)
-                                       return 0;
-                       }
-                       filp->f_pos++;
+       case 0:
+               ino = fake_ino(0, PROC_NID_INO);
+               if (filldir(dirent, ".", 1,
+                       filp->f_pos, ino, DT_DIR) < 0)
+                       return 0;
+               filp->f_pos++;
+               /* fall through */
+       case 1:
+               ino = filp->f_dentry->d_parent->d_inode->i_ino;
+               if (filldir(dirent, "..", 2,
+                       filp->f_pos, ino, DT_DIR) < 0)
+                       return 0;
+               filp->f_pos++;
+               /* fall through */
+       case 2:
+               ino = fake_ino(0, PROC_NID_INFO);
+               if (filldir(dirent, "info", 4,
+                       filp->f_pos, ino, DT_REG) < 0)
+                       return 0;
+               filp->f_pos++;
+               /* fall through */
        }
 
        nr_nids = get_nid_list(nr, nid_array, PROC_MAXVIDS);
@@ -798,12 +769,12 @@ int proc_vnet_readdir(struct file * filp,
 
 
 static struct file_operations proc_vnet_dir_operations = {
-       read:           generic_read_dir,
-       readdir:        proc_vnet_readdir,
+       .read =         generic_read_dir,
+       .readdir =      proc_vnet_readdir,
 };
 
 static struct inode_operations proc_vnet_dir_inode_operations = {
-       lookup:         proc_vnet_lookup,
+       .lookup =       proc_vnet_lookup,
 };
 
 
@@ -839,18 +810,24 @@ int proc_pid_vx_info(struct task_struct *p, char *buffer)
        char * orig = buffer;
 
        buffer += sprintf (buffer,"XID:\t%d\n", vx_task_xid(p));
+       if (vx_flags(VXF_INFO_HIDE, 0))
+               goto out;
+
        vxi = task_get_vx_info(p);
-       if (vxi && !vx_flags(VXF_INFO_HIDE, 0)) {
-               buffer += sprintf (buffer,"BCaps:\t%016llx\n"
-                       ,(unsigned long long)vxi->vx_bcaps);
-               buffer += sprintf (buffer,"CCaps:\t%016llx\n"
-                       ,(unsigned long long)vxi->vx_ccaps);
-               buffer += sprintf (buffer,"CFlags:\t%016llx\n"
-                       ,(unsigned long long)vxi->vx_flags);
-               buffer += sprintf (buffer,"CIPid:\t%d\n"
-                       ,vxi->vx_initpid);
-       }
+       if (!vxi)
+               goto out;
+
+       buffer += sprintf (buffer,"BCaps:\t%016llx\n"
+               ,(unsigned long long)vxi->vx_bcaps);
+       buffer += sprintf (buffer,"CCaps:\t%016llx\n"
+               ,(unsigned long long)vxi->vx_ccaps);
+       buffer += sprintf (buffer,"CFlags:\t%016llx\n"
+               ,(unsigned long long)vxi->vx_flags);
+       buffer += sprintf (buffer,"CIPid:\t%d\n"
+               ,vxi->vx_initpid);
+
        put_vx_info(vxi);
+out:
        return buffer - orig;
 }
 
@@ -859,23 +836,27 @@ int proc_pid_nx_info(struct task_struct *p, char *buffer)
 {
        struct nx_info *nxi;
        char * orig = buffer;
+       int i;
 
        buffer += sprintf (buffer,"NID:\t%d\n", nx_task_nid(p));
+       if (vx_flags(VXF_INFO_HIDE, 0))
+               goto out;
        nxi = task_get_nx_info(p);
-       if (nxi && !vx_flags(VXF_INFO_HIDE, 0)) {
-               int i;
-
-               for (i=0; i<nxi->nbipv4; i++){
-                       buffer += sprintf (buffer,
-                               "V4Root[%d]:\t%d.%d.%d.%d/%d.%d.%d.%d\n", i
-                               ,NIPQUAD(nxi->ipv4[i])
-                               ,NIPQUAD(nxi->mask[i]));
-               }
+       if (!nxi)
+               goto out;
+
+       for (i=0; i<nxi->nbipv4; i++){
                buffer += sprintf (buffer,
-                       "V4Root[bcast]:\t%d.%d.%d.%d\n"
-                       ,NIPQUAD(nxi->v4_bcast));
+                       "V4Root[%d]:\t%d.%d.%d.%d/%d.%d.%d.%d\n", i
+                       ,NIPQUAD(nxi->ipv4[i])
+                       ,NIPQUAD(nxi->mask[i]));
        }
+       buffer += sprintf (buffer,
+               "V4Root[bcast]:\t%d.%d.%d.%d\n"
+               ,NIPQUAD(nxi->v4_bcast));
+
        put_nx_info(nxi);
+out:
        return buffer - orig;
 }