您的位置:首页 > 运维架构 > Linux

linux-0.11调试教程 文件系统中b_uptodate字段的含义

2013-03-24 20:18 741 查看
b_uptodate的含义就是sync既是否同步了缓冲区和块设备的内容。

void do_hd_request(void)

{

......

    if (CURRENT->cmd == WRITE) {

        hd_out(dev,nsect,sec,head,cyl,WIN_WRITE,&write_intr);

        for(i=0 ; i<3000 && !(r=inb_p(HD_STATUS)&DRQ_STAT) ; i++)

            /* nothing */ ;

        if (!r) {

            bad_rw_intr();

            goto repeat;

        }

        port_write(HD_DATA,CURRENT->buffer,256);

    } else if (CURRENT->cmd == READ) {

        hd_out(dev,nsect,sec,head,cyl,WIN_READ,&read_intr);

    } else

        panic("unknown hd-command");

}

kernel\blk_drv\hd.c

static void read_intr(void)

{

    if (win_result()) {

        bad_rw_intr();

        do_hd_request();

        return;

    }

    port_read(HD_DATA,CURRENT->buffer,256);

    CURRENT->errors = 0;

    CURRENT->buffer += 512;

    CURRENT->sector++;

    if (--CURRENT->nr_sectors) {

        do_hd = &read_intr;

        return;

    }

    end_request(1);

    do_hd_request();

}

kernel\blk_drv\blk.h   

extern inline void end_request(int uptodate)

{

    DEVICE_OFF(CURRENT->dev);

    if (CURRENT->bh) {

        CURRENT->bh->b_uptodate = uptodate;

        unlock_buffer(CURRENT->bh);

    }

    if (!uptodate) {

        printk(DEVICE_NAME " I/O error\n\r");

        printk("dev %04x, block %d\n\r",CURRENT->dev,

            CURRENT->bh->b_blocknr);

    }

    wake_up(&CURRENT->waiting);

    wake_up(&wait_for_request);

    CURRENT->dev = -1;

    CURRENT = CURRENT->next;

}

当把内容从硬盘读入缓冲区后bh->b_uptodate被赋值为1。

struct request {

    int dev;        /* -1 if no request */

    int cmd;        /* READ or WRITE */

    int errors;

    unsigned long sector;

    unsigned long nr_sectors;

    char * buffer;

    struct task_struct * waiting;

    struct buffer_head * bh;

    struct request * next;

};

struct blk_dev_struct {

    void (*request_fn)(void);

    struct request * current_request;

};

extern struct blk_dev_struct blk_dev[NR_BLK_DEV];

同理,当把内容从缓冲区写入硬盘后bh->b_uptodate被赋值为1。

static void write_intr(void)

{

    if (win_result()) {

        bad_rw_intr();

        do_hd_request();

        return;

    }

    if (--CURRENT->nr_sectors) {

        CURRENT->sector++;

        CURRENT->buffer += 512;

        do_hd = &write_intr;

        port_write(HD_DATA,CURRENT->buffer,256);

        return;

    }

    end_request(1);

    do_hd_request();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐