On Wed, Aug 15, 2012 at 10:16:28PM +0100, Al Viro wrote: > On Wed, Aug 15, 2012 at 01:21:19PM +0400, Cyrill Gorcunov wrote: > > -static int fdinfo_open_helper(struct inode *inode, int *f_flags, struct path *path) > > +static int fdinfo_open_helper(struct inode *inode, int *f_flags, struct file **f_file, struct path *path) > > Bloody bad taste, that... This kind of optional arguments is almost always > a bad sign - tends to happen when you have two barely related functions > crammed into one. And yes, proc_fd_info() suffers the same braindamage. > Trying to avoid code duplication is generally a good thing, but it's not > always worth doing - less obfuscated code wins. Sure I'll update. Thanks. > > static int seq_show(struct seq_file *m, void *v) > > { > > struct proc_fdinfo *fdinfo = m->private; > > - seq_printf(m, "pos:\t%lli\nflags:\t0%o\n", > > - (long long)fdinfo->f_pos, > > - fdinfo->f_flags); > > - return 0; > > + int ret; > > + > > + ret = seq_printf(m, "pos:\t%lli\nflags:\t0%o\n", > > + (long long)fdinfo->f_file->f_pos, > > + fdinfo->f_flags); > > Realistically, that one is not going to overflow; you are almost certainly > wasting more cycles on that check of !ret just below than you'll save on > not going into ->show_fdinfo() in case of full buffer. Yes, this is redundant, thanks. Will fix. > > > + if (!ret && fdinfo->f_file->f_op->show_fdinfo) > > + ret = fdinfo->f_file->f_op->show_fdinfo(m, fdinfo->f_file); > > + > > + return ret; > > } > > > + ret = single_open(file, seq_show, fdinfo); > > + if (ret) { > > + put_filp(fdinfo->f_file); > > Excuse me? We should *never* do put_filp() on anything that has already > been opened. Think what happens if you race with close(); close() would > rip the reference from descriptor table and do fput(), leaving you with > the last reference to that struct file. You really don't want to just > go and free it. IOW, that one should be fput(). > > > + put_filp(fdinfo->f_file); > Ditto. It seems I indeed missed this scenario, thanks Al, will update! Cyrill -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html