[PATCH] staging/msm: clearup read syscalls in kernel space
Xiaochen Wang
wangxiaochen0 at gmail.com
Fri Mar 18 09:37:52 UTC 2011
Description:
1. use filp_open/vfs_read/filp_close instead of system calls
2. fix double calling of sys_close when first sys_lseek fails
3. reset segment fs when reading file into kernel space buffer
Signed-off-by: Xiaochen Wang <wangxiaochen0 at gmail.com>
---
drivers/staging/msm/logo.c | 28 ++++++++++++++++++----------
1 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/drivers/staging/msm/logo.c b/drivers/staging/msm/logo.c
index 7272765..fe16e9f 100644
--- a/drivers/staging/msm/logo.c
+++ b/drivers/staging/msm/logo.c
@@ -19,7 +19,7 @@
#include <linux/fb.h>
#include <linux/vt_kern.h>
#include <linux/unistd.h>
-#include <linux/syscalls.h>
+#include <linux/uaccess.h>
#include <linux/irq.h>
#include <asm/system.h>
@@ -40,9 +40,15 @@ static void memset16(void *_ptr, unsigned short val, unsigned count)
int load_565rle_image(char *filename)
{
struct fb_info *info;
- int fd, err = 0;
+ struct file *filp;
+ int err = 0;
unsigned count, max;
unsigned short *data, *bits, *ptr;
+ mm_segment_t fs;
+ loff_t pos;
+
+ fs = get_fs();
+ set_fs(get_ds());
info = registered_fb[0];
if (!info) {
@@ -51,26 +57,26 @@ int load_565rle_image(char *filename)
return -ENODEV;
}
- fd = sys_open(filename, O_RDONLY, 0);
- if (fd < 0) {
+ filp = filp_open(filename, O_RDONLY, 0);
+ if (IS_ERR(filp)) {
printk(KERN_WARNING "%s: Can not open %s\n",
__func__, filename);
- return -ENOENT;
+ err = PTR_ERR(filp);
+ goto err_logo_set_fs;
}
- count = (unsigned)sys_lseek(fd, (off_t)0, 2);
+ count = (unsigned)i_size_read(filp->f_path.dentry->d_inode);
if (count == 0) {
- sys_close(fd);
err = -EIO;
goto err_logo_close_file;
}
- sys_lseek(fd, (off_t)0, 0);
data = kmalloc(count, GFP_KERNEL);
if (!data) {
printk(KERN_WARNING "%s: Can not alloc data\n", __func__);
err = -ENOMEM;
goto err_logo_close_file;
}
- if ((unsigned)sys_read(fd, (char *)data, count) != count) {
+ pos = 0;
+ if (vfs_read(filp, (char __user *)data, count, &pos) != count) {
err = -EIO;
goto err_logo_free_data;
}
@@ -92,7 +98,9 @@ int load_565rle_image(char *filename)
err_logo_free_data:
kfree(data);
err_logo_close_file:
- sys_close(fd);
+ filp_close(filp, current->files);
+err_logo_set_fs:
+ set_fs(fs);
return err;
}
EXPORT_SYMBOL(load_565rle_image);
--
1.7.2.3
More information about the devel
mailing list