Rearrange lbatview.pbat handling
This commit is contained in:
parent
8c7adec85d
commit
e1ec3567df
|
@ -126,10 +126,6 @@ lbatview_reset(struct lbatview* lv, u64 pblk, u32 count)
|
|||
if (lv->pages[1]) { printk(KERN_ERR "%s: lbatpage leak\n", __func__); }
|
||||
|
||||
zone = zone_for_pblk(lv->params, pblk);
|
||||
lv->pbat = pbatcache_get(lv->pbatcache, zone);
|
||||
if (!lv->pbat) {
|
||||
return false;
|
||||
}
|
||||
if (count > 0) {
|
||||
lv->pages[0] = lbatpagecache_get(lv->lpc, pblk + 0);
|
||||
if (!lv->pages[0]) {
|
||||
|
@ -186,23 +182,25 @@ lbatview_alloc_pblk(struct lbatview* lv)
|
|||
struct pbat* pbat;
|
||||
|
||||
if (!lv->pbat) {
|
||||
printk(KERN_ERR "%s: *** lv->pbat is NULL\n", __func__);
|
||||
return PBLK_NONE;
|
||||
}
|
||||
if (pbat_read(lv->pbat) != 0) {
|
||||
return PBLK_NONE;
|
||||
lv->pbat = pbatcache_get(lv->pbatcache, zone);
|
||||
if (!lv->pbat) {
|
||||
printk(KERN_ERR "%s: pbatcache_get failed\n", __func__);
|
||||
return PBLK_NONE;
|
||||
}
|
||||
if (pbat_read(lv->pbat) != 0) {
|
||||
return PBLK_NONE;
|
||||
}
|
||||
}
|
||||
pblk = pbat_alloc(lv->pbat);
|
||||
if (pblk != PBLK_NONE) {
|
||||
return pblk;
|
||||
}
|
||||
printk(KERN_INFO "%s: alloc failed for current zone\n", __func__);
|
||||
ret = pbatcache_put(lv->pbatcache, lv->pbat);
|
||||
lv->pbat = NULL;
|
||||
if (ret) {
|
||||
printk(KERN_ERR "%s: pbatcache_put failed\n", __func__);
|
||||
return PBLK_NONE;
|
||||
}
|
||||
lv->pbat = NULL;
|
||||
for (zone_off = 1;
|
||||
zone_off <= zone || zone + zone_off < lv->params->nr_zones;
|
||||
++zone_off) {
|
||||
|
@ -218,7 +216,6 @@ lbatview_alloc_pblk(struct lbatview* lv)
|
|||
}
|
||||
pblk = pbat_alloc(pbat);
|
||||
if (pblk != PBLK_NONE) {
|
||||
printk(KERN_INFO "%s: using zone %u, alloc=%lu\n", __func__, (zone - zone_off), (unsigned long)pblk);
|
||||
lv->pbat = pbat;
|
||||
return pblk;
|
||||
}
|
||||
|
@ -240,7 +237,6 @@ lbatview_alloc_pblk(struct lbatview* lv)
|
|||
}
|
||||
pblk = pbat_alloc(pbat);
|
||||
if (pblk != PBLK_NONE) {
|
||||
printk(KERN_INFO "%s: using zone %u, alloc=%lu\n", __func__, (zone + zone_off), (unsigned long)pblk);
|
||||
lv->pbat = pbat;
|
||||
return pblk;
|
||||
}
|
||||
|
@ -264,14 +260,6 @@ lbatview_free_pblk(struct lbatview* lv, u64 pblk)
|
|||
u32 pblk_zone;
|
||||
struct pbat* pbat;
|
||||
|
||||
if (!lv->pbat) {
|
||||
printk(KERN_ERR "%s: *** lv->pbat is NULL\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
ret = pbat_read(lv->pbat);
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
pblk_zone = zone_for_pblk(lv->params, pblk);
|
||||
if (pblk_zone == ZONE_NONE || pblk_zone >= lv->params->nr_zones) {
|
||||
printk(KERN_ERR "%s: pblk=%lu: zone out of bounds\n", __func__, (unsigned long)pblk);
|
||||
|
@ -288,7 +276,8 @@ lbatview_free_pblk(struct lbatview* lv, u64 pblk)
|
|||
return ret;
|
||||
}
|
||||
ret = pbat_free(pbat, pblk);
|
||||
if (pblk_zone == zone && pbat_zone(lv->pbat) != zone) {
|
||||
BUG_ON(ret != 0);
|
||||
if (lv->pbat && pbat_zone(lv->pbat) != zone && pblk_zone == zone) {
|
||||
printk(KERN_INFO "%s: freed block %lu in zone %u switching back\n", __func__, (unsigned long)pblk, zone);
|
||||
ret = pbatcache_put(lv->pbatcache, lv->pbat);
|
||||
if (ret) {
|
||||
|
|
Loading…
Reference in New Issue