Annotation of linux/fs/proc/inode.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *  linux/fs/proc/inode.c
        !             3:  *
        !             4:  *  Copyright (C) 1991, 1992  Linus Torvalds
        !             5:  */
        !             6: 
        !             7: #include <linux/sched.h>
        !             8: #include <linux/proc_fs.h>
        !             9: #include <linux/kernel.h>
        !            10: #include <linux/mm.h>
        !            11: #include <linux/string.h>
        !            12: #include <linux/stat.h>
        !            13: 
        !            14: #include <asm/system.h>
        !            15: #include <asm/segment.h>
        !            16: 
        !            17: void proc_put_inode(struct inode *inode)
        !            18: {
        !            19:        inode->i_size = 0;
        !            20: }
        !            21: 
        !            22: void proc_put_super(struct super_block *sb)
        !            23: {
        !            24:        lock_super(sb);
        !            25:        sb->s_dev = 0;
        !            26:        free_super(sb);
        !            27: }
        !            28: 
        !            29: static struct super_operations proc_sops = { 
        !            30:        proc_read_inode,
        !            31:        proc_write_inode,
        !            32:        proc_put_inode,
        !            33:        proc_put_super,
        !            34:        NULL,
        !            35:        proc_statfs
        !            36: };
        !            37: 
        !            38: struct super_block *proc_read_super(struct super_block *s,void *data)
        !            39: {
        !            40:        int dev=s->s_dev;
        !            41: 
        !            42:        lock_super(s);
        !            43:        s->s_blocksize = 1024;
        !            44:        s->s_magic = PROC_SUPER_MAGIC;
        !            45:        s->s_dev = dev;
        !            46:        s->s_op = &proc_sops;
        !            47:        free_super(s);
        !            48:        if (!(s->s_mounted = iget(dev,PROC_ROOT_INO))) {
        !            49:                s->s_dev=0;
        !            50:                printk("get root inode failed\n");
        !            51:                return NULL;
        !            52:        }
        !            53:        return s;
        !            54: }
        !            55: 
        !            56: void proc_statfs(struct super_block *sb, struct statfs *buf)
        !            57: {
        !            58:        put_fs_long(PROC_SUPER_MAGIC, &buf->f_type);
        !            59:        put_fs_long(1024, &buf->f_bsize);
        !            60:        put_fs_long(0, &buf->f_blocks);
        !            61:        put_fs_long(0, &buf->f_bfree);
        !            62:        put_fs_long(0, &buf->f_bavail);
        !            63:        put_fs_long(0, &buf->f_files);
        !            64:        put_fs_long(0, &buf->f_ffree);
        !            65:        /* Don't know what value to put in buf->f_fsid */
        !            66: }
        !            67: 
        !            68: int proc_bmap(struct inode * inode,int block)
        !            69: {
        !            70:        return 0;
        !            71: }
        !            72: 
        !            73: int proc_create_block(struct inode * inode, int block)
        !            74: {
        !            75:        return 0;
        !            76: }
        !            77: 
        !            78: void proc_read_inode(struct inode * inode)
        !            79: {
        !            80:        unsigned long ino, pid;
        !            81:        struct task_struct * p;
        !            82:        int i;
        !            83:        
        !            84:        inode->i_op = NULL;
        !            85:        inode->i_mode = 0;
        !            86:        inode->i_uid = 0;
        !            87:        inode->i_gid = 0;
        !            88:        inode->i_nlink = 1;
        !            89:        inode->i_size = 0;
        !            90:        inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
        !            91:        inode->i_blocks = inode->i_blksize = 0;
        !            92:        ino = inode->i_ino;
        !            93:        pid = ino >> 16;
        !            94:        p = task[0];
        !            95:        for (i = 0; i < NR_TASKS ; i++)
        !            96:                if ((p = task[i]) && (p->pid == pid))
        !            97:                        break;
        !            98:        if (!p || i >= NR_TASKS)
        !            99:                return;
        !           100:        if (ino == PROC_ROOT_INO) {
        !           101:                inode->i_mode = S_IFDIR | 0555;
        !           102:                inode->i_op = &proc_root_inode_operations;
        !           103:                return;
        !           104:        }
        !           105:        if (!pid)
        !           106:                return;
        !           107:        ino &= 0x0000ffff;
        !           108:        inode->i_uid = p->euid;
        !           109:        inode->i_gid = p->egid;
        !           110:        switch (ino) {
        !           111:                case 2:
        !           112:                        inode->i_nlink = 2;
        !           113:                        for (i = 1 ; i < NR_TASKS ; i++)
        !           114:                                if (task[i])
        !           115:                                        inode->i_nlink++;
        !           116:                        inode->i_mode = S_IFDIR | 0500;
        !           117:                        inode->i_op = &proc_base_inode_operations;
        !           118:                        return;
        !           119:                case 3:
        !           120:                        inode->i_op = &proc_mem_inode_operations;
        !           121:                        inode->i_mode = S_IFCHR | 0600;
        !           122:                        inode->i_rdev = 0x0101;
        !           123:                        return;
        !           124:                case 4:
        !           125:                case 5:
        !           126:                case 6:
        !           127:                        inode->i_op = &proc_link_inode_operations;
        !           128:                        inode->i_size = 3;
        !           129:                        inode->i_mode = S_IFLNK | 0700;
        !           130:                        return;
        !           131:                case 7:
        !           132:                case 8:
        !           133:                        inode->i_mode = S_IFDIR | 0500;
        !           134:                        inode->i_op = &proc_fd_inode_operations;
        !           135:                        inode->i_nlink = 2;
        !           136:                        return;
        !           137:        }
        !           138:        switch (ino >> 8) {
        !           139:                case 1:
        !           140:                        ino &= 0xff;
        !           141:                        if (ino >= NR_OPEN || !p->filp[ino])
        !           142:                                return;
        !           143:                        inode->i_op = &proc_link_inode_operations;
        !           144:                        inode->i_size = 3;
        !           145:                        inode->i_mode = S_IFLNK | 0700;
        !           146:                        return;
        !           147:                case 2:
        !           148:                        ino &= 0xff;
        !           149:                        if (ino >= p->numlibraries)
        !           150:                                return;
        !           151:                        inode->i_op = &proc_link_inode_operations;
        !           152:                        inode->i_size = 3;
        !           153:                        inode->i_mode = S_IFLNK | 0700;
        !           154:                        return;
        !           155:        }
        !           156:        return;
        !           157: }
        !           158: 
        !           159: void proc_write_inode(struct inode * inode)
        !           160: {
        !           161:        inode->i_dirt=0;
        !           162: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.