if (err)
                        break;
 
-               err = ubi_wl_flush(ubi);
+               err = ubi_wl_flush(ubi, UBI_ALL, UBI_ALL);
                break;
        }
 
 
        if (err)
                return err;
 
-       return ubi_wl_flush(ubi);
+       return ubi_wl_flush(ubi, vol->vol_id, lnum);
 }
 EXPORT_SYMBOL_GPL(ubi_leb_erase);
 
 }
 EXPORT_SYMBOL_GPL(ubi_sync);
 
+/**
+ * ubi_flush - flush UBI work queue.
+ * @ubi_num: UBI device to flush work queue
+ * @vol_id: volume id to flush for
+ * @lnum: logical eraseblock number to flush for
+ *
+ * This function executes all pending works for a particular volume id / logical
+ * eraseblock number pair. If either value is set to %UBI_ALL, then it acts as
+ * a wildcard for all of the corresponding volume numbers or logical
+ * eraseblock numbers. It returns zero in case of success and a negative error
+ * code in case of failure.
+ */
+int ubi_flush(int ubi_num, int vol_id, int lnum)
+{
+       struct ubi_device *ubi;
+       int err = 0;
+
+       ubi = ubi_get_device(ubi_num);
+       if (!ubi)
+               return -ENODEV;
+
+       err = ubi_wl_flush(ubi, vol_id, lnum);
+       ubi_put_device(ubi);
+       return err;
+}
+EXPORT_SYMBOL_GPL(ubi_flush);
+
 BLOCKING_NOTIFIER_HEAD(ubi_notifiers);
 
 /**
 
 int ubi_wl_get_peb(struct ubi_device *ubi);
 int ubi_wl_put_peb(struct ubi_device *ubi, int vol_id, int lnum,
                   int pnum, int torture);
-int ubi_wl_flush(struct ubi_device *ubi);
+int ubi_wl_flush(struct ubi_device *ubi, int vol_id, int lnum);
 int ubi_wl_scrub_peb(struct ubi_device *ubi, int pnum);
 int ubi_wl_init(struct ubi_device *ubi, struct ubi_attach_info *ai);
 void ubi_wl_close(struct ubi_device *ubi);
 
        }
 
        if (bytes == 0) {
-               err = ubi_wl_flush(ubi);
+               err = ubi_wl_flush(ubi, UBI_ALL, UBI_ALL);
                if (err)
                        return err;
 
 
        ubi_assert(vol->upd_received <= vol->upd_bytes);
        if (vol->upd_received == vol->upd_bytes) {
-               err = ubi_wl_flush(ubi);
+               err = ubi_wl_flush(ubi, UBI_ALL, UBI_ALL);
                if (err)
                        return err;
                /* The update is finished, clear the update marker */
 
         * Finish all pending erases because there may be some LEBs belonging
         * to the same volume ID.
         */
-       err = ubi_wl_flush(ubi);
+       err = ubi_wl_flush(ubi, vol_id, UBI_ALL);
        if (err)
                goto out_acc;
 
 
 /**
  * ubi_wl_flush - flush all pending works.
  * @ubi: UBI device description object
+ * @vol_id: the volume id to flush for
+ * @lnum: the logical eraseblock number to flush for
  *
- * This function returns zero in case of success and a negative error code in
- * case of failure.
+ * This function executes all pending works for a particular volume id /
+ * logical eraseblock number pair. If either value is set to %UBI_ALL, then it
+ * acts as a wildcard for all of the corresponding volume numbers or logical
+ * eraseblock numbers. It returns zero in case of success and a negative error
+ * code in case of failure.
  */
-int ubi_wl_flush(struct ubi_device *ubi)
+int ubi_wl_flush(struct ubi_device *ubi, int vol_id, int lnum)
 {
-       int err;
+       int err = 0;
+       int found = 1;
 
        /*
         * Erase while the pending works queue is not empty, but not more than
         * the number of currently pending works.
         */
-       dbg_wl("flush (%d pending works)", ubi->works_count);
-       while (ubi->works_count) {
-               err = do_work(ubi);
-               if (err)
-                       return err;
-       }
+       dbg_wl("flush pending work for LEB %d:%d (%d pending works)",
+              vol_id, lnum, ubi->works_count);
 
-       /*
-        * Make sure all the works which have been done in parallel are
-        * finished.
-        */
        down_write(&ubi->work_sem);
-       up_write(&ubi->work_sem);
+       while (found) {
+               struct ubi_work *wrk;
+               found = 0;
 
-       /*
-        * And in case last was the WL worker and it canceled the LEB
-        * movement, flush again.
-        */
-       while (ubi->works_count) {
-               dbg_wl("flush more (%d pending works)", ubi->works_count);
-               err = do_work(ubi);
-               if (err)
-                       return err;
+               spin_lock(&ubi->wl_lock);
+               list_for_each_entry(wrk, &ubi->works, list) {
+                       if ((vol_id == UBI_ALL || wrk->vol_id == vol_id) &&
+                           (lnum == UBI_ALL || wrk->lnum == lnum)) {
+                               list_del(&wrk->list);
+                               ubi->works_count -= 1;
+                               ubi_assert(ubi->works_count >= 0);
+                               spin_unlock(&ubi->wl_lock);
+
+                               err = wrk->func(ubi, wrk, 0);
+                               if (err)
+                                       goto out;
+                               spin_lock(&ubi->wl_lock);
+                               found = 1;
+                               break;
+                       }
+               }
+               spin_unlock(&ubi->wl_lock);
        }
 
-       return 0;
+out:
+       up_write(&ubi->work_sem);
+       return err;
 }
 
 /**
 
 int ubi_leb_map(struct ubi_volume_desc *desc, int lnum);
 int ubi_is_mapped(struct ubi_volume_desc *desc, int lnum);
 int ubi_sync(int ubi_num);
+int ubi_flush(int ubi_num, int vol_id, int lnum);
 
 /*
  * This function is the same as the 'ubi_leb_read()' function, but it does not