On 4/11/08, Robert P. J. Day <[EMAIL PROTECTED]> wrote:
>
>   from <linux/fs.h>:
>
>  struct inode {
>
>         ... snip ...
>
>         struct list_head        i_devices;
>         union {
>                 struct pipe_inode_info  *i_pipe;
>                 struct block_device     *i_bdev;
>                 struct cdev             *i_cdev;
>         };
>         int                     i_cindex;
>         ... snip ...
>  };
>
>   so it's easy to see that an inode can hold at most one pointer to
>  one of a pipe, block dev or char dev structure.  but, under normal
>  circumstances, when is that "i_cdev" field actually set to point to
>  the appropriate "struct cdev"?
>

hi robert,

I am not an expert but this is what i could read out of the kernel source:
So whenever you try to open a file, the underlying filesystem is asked by the
vfs to get the corresponding inode of that file. It is there where the routine
"init_special_inode" (see for example in fs/ext2/inode.c:ext2_iget) is called
which fills in the file_operations i_fop member of struct inode with
"def_chr_fops" (note def_chr_ops.open = chrdev_open). Afterwards vfs calls
the method i_fop.open (which points to chrdev_open, see fs/
open.c:__dentry_open). In chrdev_open (as you already pointed out) then,
if not already set due to some earlier opens, i_cdev is set depending on
the i_rdev field.

hope it is now a little bit clearer to you
arvin

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to [EMAIL PROTECTED]
Please read the FAQ at http://kernelnewbies.org/FAQ

Reply via email to