On Wed, Apr 28, 2010 at 8:35 AM, rahul patil <[email protected]>
 wrote:
>
> i want to call open,write system calls from kernel space.
>

[oops, didn't hit reply-to-all at first, sorry rahul!]

Not sure about open, but for read/write system calls, provided you already
have file opened and have the file descriptor, the following code snippets
should work:

For reads:
        struct file *file = fget(fd)
        if (file) {
                loff_t pos = file_pos_read(file);
                ret = vfs_read(file, buf, count, &pos);
                file_pos_write(file, pos);
                fput(file);
        }

For writes:
        struct file *file = fget(fd)
        if (file) {
                loff_t pos = file_pos_read(file);
                ret = vfs_write(file, buf, count, &pos);
                file_pos_write(file, pos);
                fput(file);
        }

No magic there, this is essentially the same code that gets executed when
you make read/write system calls defined in fs/read_write.c except that you
don't have to export sys_read and sys_write

Its a better idea to call file->f_op->read and file->f_op->write directly
instead of vfs_write in the above code, skips a lot of checks and stuff. See
how loop driver does this in drivers/block/loop.c in function
 __do_lo_send_write.
You could even call write_begin and write_end directly if your backs fs
supports address space ops. Again good examples in loop driver.

HTH,
-Joel

Reply via email to