2012-10-04 25 views
11

में जैव अनुरोध का उपयोग करके किसी क्षेत्र को कैसे पढ़ा जाए डिस्क डिस्क से किसी क्षेत्र को पढ़ने के लिए मैं अपना स्वयं का जैव अनुरोध कैसे बना सकता हूं?लिनक्स कर्नेल

मैं निम्नलिखित कोशिश कर रहा हूं लेकिन यह सिस्टम को जमा करता है।

static void read_bio() 
{ 
    struct bio *b; 
    struct page *p; 

    b = bio_alloc(GFP_KERNEL, 1); 
    if (!b) { 
     printk(KERN_INFO "bio allocation failed\n"); 
    } 
    bio_init(b); 

    b->bi_sector = 10000; 
    b->bi_bdev = bd; /* "/dev/sda1" */ 
    b->bi_end_io = bio_end_clone; 

    p = alloc_page(GFP_KERNEL); 
    if (!p) { 
     printk(KERN_INFO "page allocation failed\n"); 
    } 
    bio_add_page(b, p, PAGE_SIZE, 0); 
    b->bi_private = p; 

    bio_get(b); 
    submit_bio(READ, b); 
    printk(KERN_DEBUG "submit read request\n"); 
} 
+0

मैंने sb_bread() का उपयोग करने की कोशिश की जो बहुत बेहतर काम करता है। लेकिन फिर भी यह ड्राइवर कस्टम अनुरोध समारोह के भीतर ब्लॉक करता है। (मैं कुछ लॉक के कारण इसकी अनुमान लगा रहा हूं)। जो मैं हासिल करने की कोशिश कर रहा हूं वह है कि मैं ब्लॉक को लिखने से पहले ब्लॉक को पढ़ना चाहता हूं, मैं ब्लॉक डिवाइस के make_request_fn को बदलकर इसे संभाल रहा हूं। –

उत्तर

6

यह पुराने सवाल है, लेकिन वैसे भी यहां पढ़ने के लिए कोड है, मुझे आशा है कि यह मदद मिलेगी किसी:

int readPage(struct block_device *device, sector_t sector, int size, 
    struct page *page) 
{ 
    int ret; 
    struct completion event; 
    struct bio *bio = bio_alloc(GFP_NOIO, 1); 
    bio->bi_bdev = device; 
    bio->bi_sector = sector; 
    bio_add_page(bio, page, size, 0); 
    init_completion(&event); 
    bio->bi_private = &event; 
    bio->bi_end_io = readComplete; 
    submit_bio(READ | REQ_SYNC, bio); 
    wait_for_completion(&event); 
    ret = test_bit(BIO_UPTODATE, &bio->bi_flags); 
    bio_put(bio); 
    return ret; 
} 

और लिखने के लिए:

void writePage(struct block_device *device, 
      sector_t sector, int size, struct page *page) 
{ 
    struct bio *bio = bio_alloc(GFP_NOIO, 1); 
    bio->bi_bdev = vnode->blkDevice; 
    bio->bi_sector = sector; 
    bio_add_page(bio, page, size, 0); 
    bio->bi_end_io = writeComplete; 
    submit_bio(WRITE_FLUSH_FUA, bio); 
} 

page आवंटित किया जा सकता है alloc_page (GFP_KERNEL) के साथ। page में डेटा बदलने के लिए page_address(page) का उपयोग करें। यह void* देता है ताकि आप जो भी चाहें उस पॉइंटर को समझ सकें।

संबंधित मुद्दे