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;
 
                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: