Kthread infrastructure
[akaros.git] / kern / src / ext2fs.c
index fc8b04a..8211e05 100644 (file)
@@ -111,7 +111,7 @@ void ext2_init(void)
 void *__ext2_get_metablock(struct block_device *bdev, unsigned long blk_num,
                            unsigned int blk_sz)
 {
-       return get_buffer(bdev, blk_num, blk_sz)->bh_buffer;
+       return bdev_get_buffer(bdev, blk_num, blk_sz)->bh_buffer;
 }
 
 /* Convenience wrapper */
@@ -141,12 +141,12 @@ static struct buffer_head *ext2_my_bh(struct super_block *sb, void *addr)
 
 /* Decrefs the buffer from get_metablock().  Call this when you no longer
  * reference your metadata block/buffer.  Yes, we could just decref the page,
- * but this will work if we end up changing how put_buffer() works. */
+ * but this will work if we end up changing how bdev_put_buffer() works. */
 void ext2_put_metablock(struct super_block *sb, void *buffer)
 {
        struct buffer_head *bh = ext2_my_bh(sb, buffer);
        if (bh)
-               put_buffer(bh);
+               bdev_put_buffer(bh);
 }
 
 /* Will dirty the block/BH/page for the given metadata block/buffer. */
@@ -154,7 +154,7 @@ void ext2_dirty_metablock(struct super_block *sb, void *buffer)
 {
        struct buffer_head *bh = ext2_my_bh(sb, buffer);
        if (bh)
-               dirty_buffer(bh);
+               bdev_dirty_buffer(bh);
 }
 
 /* Helper for alloc_block.  It will try to alloc a block from the BG, starting
@@ -706,17 +706,15 @@ int ext2_readpage(struct page_map *pm, struct page *page)
 
        assert(page->pg_flags & PG_BUFFER);
        retval = ext2_mappage(pm, page);
-       if (retval) {
-               unlock_page(page);
+       if (retval)
                return retval;
-       }
        /* Build and submit the request */
        breq = kmem_cache_alloc(breq_kcache, 0);
-       if (!breq) {
-               unlock_page(page);
+       if (!breq)
                return -ENOMEM;
-       }
        breq->flags = BREQ_READ;
+       breq->callback = generic_breq_done;
+       breq->data = 0;
        breq->bhs = breq->local_bhs;
        breq->nr_bhs = 0;
        /* Pack the BH pointers in the block request */
@@ -735,9 +733,10 @@ int ext2_readpage(struct page_map *pm, struct page *page)
                        bh->bh_page->pg_flags |= PG_DIRTY;
                }
        }
-       /* TODO: (BLK) this assumes we slept til the request was done */
-       retval = make_request(bdev, breq);
+       retval = bdev_submit_request(bdev, breq);
        assert(!retval);
+       sleep_on_breq(breq);
+       kmem_cache_free(breq_kcache, breq);
        /* zero out whatever is beyond the EOF.  we could do this by figuring out
         * where the BHs end and zeroing from there, but I'd rather zero from where
         * the file ends (which could be in the middle of an FS block */
@@ -747,10 +746,8 @@ int ext2_readpage(struct page_map *pm, struct page *page)
        /* at this point, eof_off is the offset into the page of the EOF, or 0 */
        if (eof_off)
                memset(eof_off + page2kva(page), 0, PGSIZE - eof_off);
-       /* after the data is read, we mark it up to date and unlock the page. */
+       /* Now the page is up to date */
        page->pg_flags |= PG_UPTODATE;
-       unlock_page(page);
-       kmem_cache_free(breq_kcache, breq);
        /* Useful debugging.  Put one higher up if the page is not getting mapped */
        //print_pageinfo(page);
        return 0;