why does proc_create_data() test for "S_ISDIR(mode)"?

Robert P. J. Day rpjday at crashcourse.ca
Mon Aug 20 23:15:56 EDT 2012


  poking around proc file headers and sources for purposes of
documentation and noticed something that seems odd.  the standard way
to create a proc file is:

  proc_create(char* name, umode_t mode, ... *parent, etc);

again, that's for creating *files* -- directories under /proc are
typically created with something like proc_mkdir().  so far, so good.
what this means so far is that the "mode" parameter to proc_create()
should represent simple file permissions -- there should be no bit
setting indicating a directory.

  in proc_fs.h, we see the wrapper:

static inline struct proc_dir_entry *proc_create(const char *name, umode_t mode,
        struct proc_dir_entry *parent, const struct file_operations *proc_fops)
{
        return proc_create_data(name, mode, parent, proc_fops, NULL);
}

so proc_create() turns around and calls proc_create_data(), again with
a "mode" value that should represent the mode for only a file, not a
directory.

  and yet, when we get to proc_create_data() in fs/proc/generic.c, we
read:

struct proc_dir_entry *proc_create_data(const char *name, umode_t mode,
                                        struct proc_dir_entry *parent,
                                        const struct file_operations *proc_fops,
                                        void *data)
{
        struct proc_dir_entry *pde;
        nlink_t nlink;

        if (S_ISDIR(mode)) {    <----- ????????

  if proc_create() and, subsequently, proc_create_data() are called
for *only* files, when will that test ever succeed?  it's not hurting
anything, but it seems completely redundant.

  eventually, that routine calls the internal routine __proc_create(),
and it's *that* routine that appears to be the central point for all
proc file creation, files and directories both.  but the directory
test in proc_create_data() seems to be some sort of historical
holdover.

  just for fun, i went looking for any call to proc_create_data() that
somehow specified a directory, and this is what i got:

$ grep -r "proc_create_data.*DIR" *
$

  in other words, nothing.  admittedly, i haven't searched as
thoroughly as i might have, but ... thoughts?  is that S_ISDIR test as
redundant as i think it is?

rday

-- 

========================================================================
Robert P. J. Day                                 Ottawa, Ontario, CANADA
                        http://crashcourse.ca

Twitter:                                       http://twitter.com/rpjday
LinkedIn:                               http://ca.linkedin.com/in/rpjday
========================================================================



More information about the Kernelnewbies mailing list