Rearrange lbatview.pbat handling

This commit is contained in:
Tom Marshall 2019-10-30 10:21:05 -07:00
parent 8c7adec85d
commit e1ec3567df
1 changed files with 11 additions and 22 deletions

View File

@ -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) {