Finally fixed the pbat writeback issue
This commit is contained in:
parent
164a09b9aa
commit
db3d323d27
|
@ -75,12 +75,12 @@ lbatpage_flush_endio(struct bio* bio)
|
|||
struct lbatpage* lp = bio->bi_private;
|
||||
int ret;
|
||||
|
||||
cbd_free_page(bio->bi_io_vec[0].bv_page);
|
||||
ret = pblk_endio(bio);
|
||||
if (ret) {
|
||||
printk(KERN_ERR "%s: I/O failed\n", __func__);
|
||||
lp->state = CACHE_STATE_ERROR;
|
||||
}
|
||||
cbd_free_page(bio->bi_io_vec[0].bv_page);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
@ -331,12 +331,12 @@ lbd_flush_endio(struct bio* bio)
|
|||
struct lbd* lbd = bio->bi_private;
|
||||
int ret;
|
||||
|
||||
cbd_free_page(bio->bi_io_vec[0].bv_page);
|
||||
ret = pblk_endio(bio);
|
||||
if (ret) {
|
||||
printk(KERN_ERR "%s: I/O failed\n", __func__);
|
||||
lbd->state = CACHE_STATE_ERROR;
|
||||
}
|
||||
cbd_free_page(bio->bi_io_vec[0].bv_page);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
@ -126,16 +126,13 @@ pbat_flush_endio(struct bio* bio)
|
|||
{
|
||||
struct pbat* pbat = bio->bi_private;
|
||||
int ret;
|
||||
unsigned int n;
|
||||
|
||||
for (n = 0; n < bio->bi_max_vecs; ++n) {
|
||||
cbd_free_page(bio->bi_io_vec[0].bv_page);
|
||||
}
|
||||
ret = pblk_endio(bio);
|
||||
if (ret) {
|
||||
printk(KERN_ERR "%s: I/O failed\n", __func__);
|
||||
pbat->state = CACHE_STATE_ERROR;
|
||||
}
|
||||
unlock_page(pbat->pages);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -146,24 +143,20 @@ pbat_flush(struct pbat* pbat)
|
|||
struct page* iopagev[count];
|
||||
u64 pblk;
|
||||
u32 n;
|
||||
u8* iobuf;
|
||||
u8* p;
|
||||
|
||||
mutex_lock(&pbat->lock);
|
||||
if (pbat->state != CACHE_STATE_DIRTY) {
|
||||
if (pbat->state == CACHE_STATE_ERROR) {
|
||||
ret = -EIO;
|
||||
}
|
||||
unlock_page(pbat->pages);
|
||||
goto out;
|
||||
}
|
||||
pblk = pbat_off(pbat->params, pbat->zone);
|
||||
if (!cbd_alloc_pagev(iopagev, count)) {
|
||||
printk(KERN_ERR "%s: out of memory\n", __func__);
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
for (n = 0; n < count; ++n) {
|
||||
iobuf = page_address(iopagev[n]);
|
||||
memcpy(iobuf, pbat->buf + n * PBLK_SIZE, PBLK_SIZE);
|
||||
p = pbat->buf;
|
||||
for (n = 0; n < count; ++n, p += PBLK_SIZE) {
|
||||
iopagev[n] = virt_to_page(p);
|
||||
}
|
||||
pbat_save_state(pbat);
|
||||
pblk_write(pbat->params, pblk, count, iopagev, pbat_flush_endio, pbat);
|
||||
|
@ -177,6 +170,7 @@ out:
|
|||
static void
|
||||
pbat_reset(struct pbat* pbat, u32 zone)
|
||||
{
|
||||
lock_page(pbat->pages);
|
||||
if (pbat->zone != zone) {
|
||||
pbat->zone = zone;
|
||||
pbat->state = CACHE_STATE_UNCACHED;
|
||||
|
@ -188,9 +182,10 @@ pbat_read(struct pbat* pbat)
|
|||
{
|
||||
int ret = 0;
|
||||
u32 count = pbat_len(pbat->params);
|
||||
struct page* pagev[count];
|
||||
struct page* iopagev[count];
|
||||
u64 pblk;
|
||||
u32 n;
|
||||
u8* p;
|
||||
bool retried = false;
|
||||
|
||||
mutex_lock(&pbat->lock);
|
||||
|
@ -198,11 +193,12 @@ pbat_read(struct pbat* pbat)
|
|||
goto out;
|
||||
}
|
||||
pblk = pbat_off(pbat->params, pbat->zone);
|
||||
for (n = 0; n < count; ++n) {
|
||||
pagev[n] = virt_to_page(pbat->buf + n * PBLK_SIZE);
|
||||
p = pbat->buf;
|
||||
for (n = 0; n < count; ++n, p += PBLK_SIZE) {
|
||||
iopagev[n] = virt_to_page(p);
|
||||
}
|
||||
again:
|
||||
ret = pblk_read_wait(pbat->params, pblk, count, pagev);
|
||||
ret = pblk_read_wait(pbat->params, pblk, count, iopagev);
|
||||
if (ret) {
|
||||
goto out;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue