Hi Charles,

Sorry to mail you about bugs in nandemul2k again. As to the email yesterday, erase will crash your nandemul2k. I found the reasons:

In your nand_erase() functions, you should add:

instr->state = MTD_ERASE_DONE;  //change state to ERASE_DONE

instr->callback(instr);  // this callback will wake up process waiting erased!

before “return 0”.

Without calling the callback, process will die after added to wait_queue in mtdchar.c here:

case MEMERASE:

{

    ...

    ret = mtd->erase(mtd, erase);

    if (!ret)

    {

      set_current_state(TASK_UNINTERRUPTIBLE);

      add_wait_queue(&waitq, &wait);

      if (erase->state != MTD_ERASE_DONE && erase->state != MTD_ERASE_FAILED)

        schedule();

      remove_wait_queue(&waitq, &wait);

      set_current_state(TASK_RUNNING);

 

      ret = (erase->state == MTD_ERASE_FAILED) ?  - EIO: 0;

}

kfree(erase);

  }

  break;

}

Callback in mtdchar.c will wake up it:

static void mtdchar_erase_callback (struct erase_info *instr)

{

         wake_up((wait_queue_head_t *)instr->priv);

}

 

Per my test, the bug was fixed by changing like that.

 

Thanks and best regards

Baohua Song