|
|
@@ -900,7 +900,7 @@ write_error:
|
|
|
int ubi_eba_atomic_leb_change(struct ubi_device *ubi, struct ubi_volume *vol,
|
|
|
int lnum, const void *buf, int len)
|
|
|
{
|
|
|
- int err, pnum, tries = 0, vol_id = vol->vol_id;
|
|
|
+ int err, pnum, old_pnum, tries = 0, vol_id = vol->vol_id;
|
|
|
struct ubi_vid_hdr *vid_hdr;
|
|
|
uint32_t crc;
|
|
|
|
|
|
@@ -963,16 +963,17 @@ retry:
|
|
|
goto write_error;
|
|
|
}
|
|
|
|
|
|
- if (vol->eba_tbl[lnum] >= 0) {
|
|
|
- err = ubi_wl_put_peb(ubi, vol_id, lnum, vol->eba_tbl[lnum], 0);
|
|
|
- if (err)
|
|
|
- goto out_leb_unlock;
|
|
|
- }
|
|
|
-
|
|
|
down_read(&ubi->fm_sem);
|
|
|
+ old_pnum = vol->eba_tbl[lnum];
|
|
|
vol->eba_tbl[lnum] = pnum;
|
|
|
up_read(&ubi->fm_sem);
|
|
|
|
|
|
+ if (old_pnum >= 0) {
|
|
|
+ err = ubi_wl_put_peb(ubi, vol_id, lnum, old_pnum, 0);
|
|
|
+ if (err)
|
|
|
+ goto out_leb_unlock;
|
|
|
+ }
|
|
|
+
|
|
|
out_leb_unlock:
|
|
|
leb_write_unlock(ubi, vol_id, lnum);
|
|
|
out_mutex:
|