All pastes #2092346 Raw Edit

Miscellany

public text v1 · immutable
#2092346 ·published 2011-10-21 22:35 UTC
rendered paste body
static void my_request(struct request_queue *q)
{
        struct request *rq;
        int size, res = 0;
        char *ptr;
        unsigned nr_sectors, sector;
        printk(KERN_INFO "entering request routine\n");

        rq = blk_fetch_request(q);
        while (rq) {
                if (!blk_fs_request(rq)) {
                        printk(KERN_WARNING
                               "This was not a normal fs request, skipping\n");
                        goto done;
                }
                nr_sectors = blk_rq_cur_sectors(rq);
                sector = blk_rq_pos(rq);

                ptr = my_blockdevice + sector * sector_size;
                size = nr_sectors * sector_size;

                if ((ptr + size) > (my_blockdevice + disk_size)) {
                        printk(KERN_WARNING
                               " tried to go past end of device\n");
                        goto done;
                }

                if (rq_data_dir(rq)) {
                        printk(KERN_INFO "writing at sector %d, %u sectors \n",
                               sector, nr_sectors);
                        memcpy(ptr, rq->buffer, size);
                } else {
                        printk(KERN_INFO "reading at sector %d, %u sectors \n",
                               sector, nr_sectors);
                        memcpy(rq->buffer, ptr, size);
                }
              done:
                if (!__blk_end_request_cur(rq, res))
                        rq = blk_fetch_request(q);
        }
        printk(KERN_INFO "leaving request\n");
}