|
@@ -417,6 +417,7 @@ static int mtd_ioctl(struct inode *inode, struct file *file,
|
|
break;
|
|
break;
|
|
|
|
|
|
case MEMERASE:
|
|
case MEMERASE:
|
|
|
|
+ case MEMERASE64:
|
|
{
|
|
{
|
|
struct erase_info *erase;
|
|
struct erase_info *erase;
|
|
|
|
|
|
@@ -427,20 +428,32 @@ static int mtd_ioctl(struct inode *inode, struct file *file,
|
|
if (!erase)
|
|
if (!erase)
|
|
ret = -ENOMEM;
|
|
ret = -ENOMEM;
|
|
else {
|
|
else {
|
|
- struct erase_info_user einfo;
|
|
|
|
-
|
|
|
|
wait_queue_head_t waitq;
|
|
wait_queue_head_t waitq;
|
|
DECLARE_WAITQUEUE(wait, current);
|
|
DECLARE_WAITQUEUE(wait, current);
|
|
|
|
|
|
init_waitqueue_head(&waitq);
|
|
init_waitqueue_head(&waitq);
|
|
|
|
|
|
- if (copy_from_user(&einfo, argp,
|
|
|
|
- sizeof(struct erase_info_user))) {
|
|
|
|
- kfree(erase);
|
|
|
|
- return -EFAULT;
|
|
|
|
|
|
+ if (cmd == MEMERASE64) {
|
|
|
|
+ struct erase_info_user64 einfo64;
|
|
|
|
+
|
|
|
|
+ if (copy_from_user(&einfo64, argp,
|
|
|
|
+ sizeof(struct erase_info_user64))) {
|
|
|
|
+ kfree(erase);
|
|
|
|
+ return -EFAULT;
|
|
|
|
+ }
|
|
|
|
+ erase->addr = einfo64.start;
|
|
|
|
+ erase->len = einfo64.length;
|
|
|
|
+ } else {
|
|
|
|
+ struct erase_info_user einfo32;
|
|
|
|
+
|
|
|
|
+ if (copy_from_user(&einfo32, argp,
|
|
|
|
+ sizeof(struct erase_info_user))) {
|
|
|
|
+ kfree(erase);
|
|
|
|
+ return -EFAULT;
|
|
|
|
+ }
|
|
|
|
+ erase->addr = einfo32.start;
|
|
|
|
+ erase->len = einfo32.length;
|
|
}
|
|
}
|
|
- erase->addr = einfo.start;
|
|
|
|
- erase->len = einfo.length;
|
|
|
|
erase->mtd = mtd;
|
|
erase->mtd = mtd;
|
|
erase->callback = mtdchar_erase_callback;
|
|
erase->callback = mtdchar_erase_callback;
|
|
erase->priv = (unsigned long)&waitq;
|
|
erase->priv = (unsigned long)&waitq;
|