Hi Richard, On Sun, 08 Jul 2012 14:07:41 +0200 Richard Weinberger <rich...@nod.at> wrote: > > + /* TODO: in the new locking scheme, produce_free_peb is > > + * called under wl_lock taken. > > + * so when returning, should reacquire the lock > > + */ > > Which new locking scheme?
I am diffing linux-ubi fastmap HEAD against its fork point (vanilla ubi), that's 6b16351..d41a140 on linux-ubi. Which gives the following diff in produce_free_pebs: @@ -261,7 +266,6 @@ static int produce_free_peb(struct ubi_device *ubi) { int err; - spin_lock(&ubi->wl_lock); while (!ubi->free.rb_node) { spin_unlock(&ubi->wl_lock); @@ -272,7 +276,6 @@ static int produce_free_peb(struct ubi_device *ubi) spin_lock(&ubi->wl_lock); } - spin_unlock(&ubi->wl_lock); return 0; } Which is probably okay, since you obtain the lock in the new 'ubi_refill_pools', which calls produce_free_peb: +void ubi_refill_pools(struct ubi_device *ubi) +{ + spin_lock(&ubi->wl_lock); + refill_wl_pool(ubi); + refill_wl_user_pool(ubi); + spin_unlock(&ubi->wl_lock); +} However if 'do_work' fails within 'produce_free_peb', you return the error but leave wl_lock unlocked - where it is expected to be locked (otherwise, ubi_refill_pools will unlock it again): static int produce_free_peb(struct ubi_device *ubi) { int err; while (!ubi->free.rb_node) { spin_unlock(&ubi->wl_lock); dbg_wl("do one work synchronously"); err = do_work(ubi); if (err) return err; spin_lock(&ubi->wl_lock); } return 0; } Regards, Shmulik -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/