荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: GyeaonWoo (柏林恋人), 信区: Linux
标  题: Linus's Linux--fs/super.c
发信站: 荔园晨风BBS站 (Mon Aug 25 20:04:13 2003), 站内信件

/*
 * super.c contains code to handle the super-block tables.
 */
#include <linux/config.h>
#include <linux/sched.h>
#include <linux/kernel.h>

/* set_bit uses setb, as gas doesn't recognize setc */
#define set_bit(bitnr,addr) ({ \
register int __res __asm__("ax"); \
__asm__("bt %2,%3;setb %%al":"=a" (__res):"a" (0),"r" (bitnr),"m"
(*(addr))); \
__res; })

struct super_block super_block[NR_SUPER];

struct super_block * do_mount(int dev)
{
        struct super_block * p;
        struct buffer_head * bh;
        int i,block;

        for(p = &super_block[0] ; p < &super_block[NR_SUPER] ; p++ )
                if (!(p->s_dev))
                        break;
        p->s_dev = -1;          /* mark it in use */
        if (p >= &super_block[NR_SUPER])
                return NULL;
        if (!(bh = bread(dev,1)))
                return NULL;
        *p = *((struct super_block *) bh->b_data);
        brelse(bh);
        if (p->s_magic != SUPER_MAGIC) {
                p->s_dev = 0;
                return NULL;
        }
        for (i=0;i<I_MAP_SLOTS;i++)
                p->s_imap[i] = NULL;
        for (i=0;i<Z_MAP_SLOTS;i++)
                p->s_zmap[i] = NULL;
        block=2;
        for (i=0 ; i < p->s_imap_blocks ; i++)
                if (p->s_imap[i]=bread(dev,block))
                        block++;
                else
                        break;
        for (i=0 ; i < p->s_zmap_blocks ; i++)
                if (p->s_zmap[i]=bread(dev,block))
                        block++;
                else
                        break;
        if (block != 2+p->s_imap_blocks+p->s_zmap_blocks) {
                for(i=0;i<I_MAP_SLOTS;i++)
                        brelse(p->s_imap[i]);
                for(i=0;i<Z_MAP_SLOTS;i++)
                        brelse(p->s_zmap[i]);
                p->s_dev=0;
                return NULL;
        }
        p->s_imap[0]->b_data[0] |= 1;
        p->s_zmap[0]->b_data[0] |= 1;
        p->s_dev = dev;
        p->s_isup = NULL;
        p->s_imount = NULL;
        p->s_time = 0;
        p->s_rd_only = 0;
        p->s_dirt = 0;
        return p;
}

void mount_root(void)
{
        int i,free;
        struct super_block * p;
        struct m_inode * mi;

        if (32 != sizeof (struct d_inode))
                panic("bad i-node size");
        for(i=0;i<NR_FILE;i++)
                file_table[i].f_count=0;
        for(p = &super_block[0] ; p < &super_block[NR_SUPER] ; p++)
                p->s_dev = 0;
        if (!(p=do_mount(ROOT_DEV)))
                panic("Unable to mount root");
        if (!(mi=iget(ROOT_DEV,1)))
                panic("Unable to read root i-node");
        mi->i_count += 3 ;      /* NOTE! it is logically used 4 times, not 1 */
        p->s_isup = p->s_imount = mi;
        current->pwd = mi;
        current->root = mi;
        free=0;
        i=p->s_nzones;
        while (-- i >= 0)
                if (!set_bit(i&8191,p->s_zmap[i>>13]->b_data))
                        free++;
        printk("%d/%d free blocks\n\r",free,p->s_nzones);
        free=0;
        i=p->s_ninodes+1;
        while (-- i >= 0)
                if (!set_bit(i&8191,p->s_imap[i>>13]->b_data))
                        free++;
        printk("%d/%d free inodes\n\r",free,p->s_ninodes);
}

--
终于能按照自己的内心写作了
却不能按照一个人的内心生活
花太香,只好梦蝶一场唉唉

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.35.5]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店