Commit 70dcc535 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'upstream-3.7-rc9' of git://git.infradead.org/linux-ubi

Pull UBI changes from Artem Bityutskiy:
 "Fixes for 2 brown-paperbag bugs introduced this merge window by the
  fastmap code:

   1.  The UBI background thread got stuck when a bit-flip happened
       because free LEBs was not removed from the "free" tree when we
       started using it.
   2.  I/O debugging checks did not work because we called a sleeping
       function in atomic context."

* tag 'upstream-3.7-rc9' of git://git.infradead.org/linux-ubi:
  UBI: dont call ubi_self_check_all_ff() in __wl_get_peb()
  UBI: remove PEB from free tree in get_peb_for_wl()
parents ca50496e 894aef21
...@@ -498,7 +498,7 @@ struct ubi_wl_entry *ubi_wl_get_fm_peb(struct ubi_device *ubi, int anchor) ...@@ -498,7 +498,7 @@ struct ubi_wl_entry *ubi_wl_get_fm_peb(struct ubi_device *ubi, int anchor)
* @ubi: UBI device description object * @ubi: UBI device description object
* *
* This function returns a physical eraseblock in case of success and a * This function returns a physical eraseblock in case of success and a
* negative error code in case of failure. Might sleep. * negative error code in case of failure.
*/ */
static int __wl_get_peb(struct ubi_device *ubi) static int __wl_get_peb(struct ubi_device *ubi)
{ {
...@@ -540,13 +540,6 @@ static int __wl_get_peb(struct ubi_device *ubi) ...@@ -540,13 +540,6 @@ static int __wl_get_peb(struct ubi_device *ubi)
* ubi_wl_get_peb() after removing e from the pool. */ * ubi_wl_get_peb() after removing e from the pool. */
prot_queue_add(ubi, e); prot_queue_add(ubi, e);
#endif #endif
err = ubi_self_check_all_ff(ubi, e->pnum, ubi->vid_hdr_aloffset,
ubi->peb_size - ubi->vid_hdr_aloffset);
if (err) {
ubi_err("new PEB %d does not contain all 0xFF bytes", e->pnum);
return err;
}
return e->pnum; return e->pnum;
} }
...@@ -679,17 +672,30 @@ static struct ubi_wl_entry *get_peb_for_wl(struct ubi_device *ubi) ...@@ -679,17 +672,30 @@ static struct ubi_wl_entry *get_peb_for_wl(struct ubi_device *ubi)
#else #else
static struct ubi_wl_entry *get_peb_for_wl(struct ubi_device *ubi) static struct ubi_wl_entry *get_peb_for_wl(struct ubi_device *ubi)
{ {
return find_wl_entry(ubi, &ubi->free, WL_FREE_MAX_DIFF); struct ubi_wl_entry *e;
e = find_wl_entry(ubi, &ubi->free, WL_FREE_MAX_DIFF);
self_check_in_wl_tree(ubi, e, &ubi->free);
rb_erase(&e->u.rb, &ubi->free);
return e;
} }
int ubi_wl_get_peb(struct ubi_device *ubi) int ubi_wl_get_peb(struct ubi_device *ubi)
{ {
int peb; int peb, err;
spin_lock(&ubi->wl_lock); spin_lock(&ubi->wl_lock);
peb = __wl_get_peb(ubi); peb = __wl_get_peb(ubi);
spin_unlock(&ubi->wl_lock); spin_unlock(&ubi->wl_lock);
err = ubi_self_check_all_ff(ubi, peb, ubi->vid_hdr_aloffset,
ubi->peb_size - ubi->vid_hdr_aloffset);
if (err) {
ubi_err("new PEB %d does not contain all 0xFF bytes", peb);
return err;
}
return peb; return peb;
} }
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment