Le Tue, 24 Feb 2009 09:11:53 +0800,
Peter Teoh <htmldevelo...@gmail.com> a écrit :

> But then it also puzzled me, because ioctl() in user space required a
> open file descriptor as the first parameter, which is derived from
> open() (as specified from "man ioctl").   so then how is the open()
> from userspace passed down to kernel?

When userspace uses the open() system call, the kernel function
sys_open() gets called. This kernel function does all the job, and
calls the ->open() operation of the device driver if it exists.
Otherwise, it just doesn't call it, and it works perfectly fine. The
sys_open() function does all what's needed, the ->open() operation is
only here *if* your device driver needs to do something when the device
is opened. This operation is optional.

 sys_open()
 http://lxr.free-electrons.com/source/fs/open.c#L1032

 calls

 do_sys_open()
 http://lxr.free-electrons.com/source/fs/open.c#L1010

 which calls

 do_filp_open()
 http://lxr.free-electrons.com/source/fs/namei.c#L1637

 which calls

 nameidata_to_filp()
 http://lxr.free-electrons.com/source/fs/open.c#L918

 which calls

 __dentry_open()
 http://lxr.free-electrons.com/source/fs/open.c#L793

 which does

823         if (!open && f->f_op)
824                 open = f->f_op->open;
825         if (open) {
826                 error = open(inode, f);
827                 if (error)
828                         goto cleanup_all;
829         }

(ouf)

Sincerly,

Thomas
-- 
Thomas Petazzoni, Free Electrons
Kernel, drivers and embedded Linux development,
consulting, training and support.
http://free-electrons.com

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecar...@nl.linux.org
Please read the FAQ at http://kernelnewbies.org/FAQ

Reply via email to