|
@@ -170,16 +170,22 @@ static ssize_t mtd_read(struct file *file, char __user *buf, size_t count,loff_t
|
|
|
|
|
|
/* FIXME: Use kiovec in 2.5 to lock down the user's buffers
|
|
/* FIXME: Use kiovec in 2.5 to lock down the user's buffers
|
|
and pass them directly to the MTD functions */
|
|
and pass them directly to the MTD functions */
|
|
|
|
+
|
|
|
|
+ if (count > MAX_KMALLOC_SIZE)
|
|
|
|
+ kbuf=kmalloc(MAX_KMALLOC_SIZE, GFP_KERNEL);
|
|
|
|
+ else
|
|
|
|
+ kbuf=kmalloc(count, GFP_KERNEL);
|
|
|
|
+
|
|
|
|
+ if (!kbuf)
|
|
|
|
+ return -ENOMEM;
|
|
|
|
+
|
|
while (count) {
|
|
while (count) {
|
|
|
|
+
|
|
if (count > MAX_KMALLOC_SIZE)
|
|
if (count > MAX_KMALLOC_SIZE)
|
|
len = MAX_KMALLOC_SIZE;
|
|
len = MAX_KMALLOC_SIZE;
|
|
else
|
|
else
|
|
len = count;
|
|
len = count;
|
|
|
|
|
|
- kbuf=kmalloc(len,GFP_KERNEL);
|
|
|
|
- if (!kbuf)
|
|
|
|
- return -ENOMEM;
|
|
|
|
-
|
|
|
|
switch (MTD_MODE(file)) {
|
|
switch (MTD_MODE(file)) {
|
|
case MTD_MODE_OTP_FACT:
|
|
case MTD_MODE_OTP_FACT:
|
|
ret = mtd->read_fact_prot_reg(mtd, *ppos, len, &retlen, kbuf);
|
|
ret = mtd->read_fact_prot_reg(mtd, *ppos, len, &retlen, kbuf);
|
|
@@ -215,9 +221,9 @@ static ssize_t mtd_read(struct file *file, char __user *buf, size_t count,loff_t
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
- kfree(kbuf);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ kfree(kbuf);
|
|
return total_retlen;
|
|
return total_retlen;
|
|
} /* mtd_read */
|
|
} /* mtd_read */
|
|
|
|
|
|
@@ -241,18 +247,21 @@ static ssize_t mtd_write(struct file *file, const char __user *buf, size_t count
|
|
if (!count)
|
|
if (!count)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
|
|
+ if (count > MAX_KMALLOC_SIZE)
|
|
|
|
+ kbuf=kmalloc(MAX_KMALLOC_SIZE, GFP_KERNEL);
|
|
|
|
+ else
|
|
|
|
+ kbuf=kmalloc(count, GFP_KERNEL);
|
|
|
|
+
|
|
|
|
+ if (!kbuf)
|
|
|
|
+ return -ENOMEM;
|
|
|
|
+
|
|
while (count) {
|
|
while (count) {
|
|
|
|
+
|
|
if (count > MAX_KMALLOC_SIZE)
|
|
if (count > MAX_KMALLOC_SIZE)
|
|
len = MAX_KMALLOC_SIZE;
|
|
len = MAX_KMALLOC_SIZE;
|
|
else
|
|
else
|
|
len = count;
|
|
len = count;
|
|
|
|
|
|
- kbuf=kmalloc(len,GFP_KERNEL);
|
|
|
|
- if (!kbuf) {
|
|
|
|
- printk("kmalloc is null\n");
|
|
|
|
- return -ENOMEM;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
if (copy_from_user(kbuf, buf, len)) {
|
|
if (copy_from_user(kbuf, buf, len)) {
|
|
kfree(kbuf);
|
|
kfree(kbuf);
|
|
return -EFAULT;
|
|
return -EFAULT;
|
|
@@ -282,10 +291,9 @@ static ssize_t mtd_write(struct file *file, const char __user *buf, size_t count
|
|
kfree(kbuf);
|
|
kfree(kbuf);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
-
|
|
|
|
- kfree(kbuf);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ kfree(kbuf);
|
|
return total_retlen;
|
|
return total_retlen;
|
|
} /* mtd_write */
|
|
} /* mtd_write */
|
|
|
|
|