|
@@ -360,6 +360,15 @@ out:
|
|
bio_endio(bio, err);
|
|
bio_endio(bio, err);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int brd_rw_page(struct block_device *bdev, sector_t sector,
|
|
|
|
+ struct page *page, int rw)
|
|
|
|
+{
|
|
|
|
+ struct brd_device *brd = bdev->bd_disk->private_data;
|
|
|
|
+ int err = brd_do_bvec(brd, page, PAGE_CACHE_SIZE, 0, rw, sector);
|
|
|
|
+ page_endio(page, rw & WRITE, err);
|
|
|
|
+ return err;
|
|
|
|
+}
|
|
|
|
+
|
|
#ifdef CONFIG_BLK_DEV_XIP
|
|
#ifdef CONFIG_BLK_DEV_XIP
|
|
static int brd_direct_access(struct block_device *bdev, sector_t sector,
|
|
static int brd_direct_access(struct block_device *bdev, sector_t sector,
|
|
void **kaddr, unsigned long *pfn)
|
|
void **kaddr, unsigned long *pfn)
|
|
@@ -419,6 +428,7 @@ static int brd_ioctl(struct block_device *bdev, fmode_t mode,
|
|
|
|
|
|
static const struct block_device_operations brd_fops = {
|
|
static const struct block_device_operations brd_fops = {
|
|
.owner = THIS_MODULE,
|
|
.owner = THIS_MODULE,
|
|
|
|
+ .rw_page = brd_rw_page,
|
|
.ioctl = brd_ioctl,
|
|
.ioctl = brd_ioctl,
|
|
#ifdef CONFIG_BLK_DEV_XIP
|
|
#ifdef CONFIG_BLK_DEV_XIP
|
|
.direct_access = brd_direct_access,
|
|
.direct_access = brd_direct_access,
|