Messages in this thread | | | Date | Thu, 7 Sep 2006 11:06:59 -0700 | From | Andrew Morton <> | Subject | Re: [PATCH 3/5] proc: Remove the hard coded inode numbers. |
| |
On Thu, 07 Sep 2006 11:55:59 -0600 ebiederm@xmission.com (Eric W. Biederman) wrote:
> Andrew Morton <akpm@osdl.org> writes: > > > On Wed, 06 Sep 2006 10:27:13 -0600 > > ebiederm@xmission.com (Eric W. Biederman) wrote: > > > >> +static int proc_fill_cache(struct file *filp, void *dirent, filldir_t > > filldir, > >> + char *name, int len, > >> + instantiate_t instantiate, struct task_struct *task, void *ptr) > >> +{ > >> + struct dentry *child, *dir = filp->f_dentry; > >> + struct inode *inode; > >> + struct qstr qname; > >> + ino_t ino = 0; > >> + unsigned type = DT_UNKNOWN; > >> + > >> + qname.name = name; > >> + qname.len = len; > >> + qname.hash = full_name_hash(name, len); > >> + > >> + child = d_lookup(dir, &qname); > >> + if (!child) { > >> + struct dentry *new; > >> + new = d_alloc(dir, &qname); > >> + if (new) { > >> + child = instantiate(dir->d_inode, new, task, ptr); > >> + if (child) > >> + dput(new); > >> + else > >> + child = new; > >> + } > >> + } > >> + if (!child || IS_ERR(child) || !child->d_inode) > >> + goto end_instantiate; > >> + inode = child->d_inode; > >> + if (inode) { > >> + ino = inode->i_ino; > >> + type = inode->i_mode >> 12; > >> + } > >> + dput(child); > >> +end_instantiate: > >> + if (!ino) > >> + ino = find_inode_number(dir, &qname); > >> + if (!ino) > >> + ino = 1; > >> + return filldir(dirent, name, len, filp->f_pos, ino, type); > >> +} > > > > The error handling in here looks rather absent. > > Hey, thanks for the review. > > I don't think so but a comment or two might be in order. > > Calling filldir with the filename is the important part, > and the only real error is if filldir fails. > > The rest of the logic is about populating and querying the > dcache so we can find our real inode number, if every reasonable > attempt to perform a dcache lookup fails I simply set the inode > number to 1 and use that in filldir. It's wrong but at least > I report the file is there. > > If I can find the dentry I lookup the inode and the inode > number and file type, and the dput the dentry. > > If I can't lookup the dentry I attempt to create it. > instantiate will return a dentry or NULL if the dentry I preallocate > for it is good enough.
I suspected it was something like that.
> Is there something specific you are not seeing?
Code comments explaining this stuff ;) - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |