Message ID | 20220625110115.39956-7-Jason@zx2c4.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | cleanup llseek and splice | expand |
On Sat, Jun 25, 2022 at 01:01:13PM +0200, Jason A. Donenfeld wrote: > Now that all callers of ->llseek are going through vfs_llseek(), we > don't gain anything by keeping no_llseek around. Nothing compares it or > calls it. Shouldn't this and the checks for no_llseek simply be merged into patch 2? > + if ((file->f_mode & FMODE_LSEEK) && file->f_op->llseek) > + return file->f_op->llseek(file, offset, whence); > + return -ESPIPE; No function change, but in general checking for the error condition in the branch tends to be more readable. i.e.: if (!(file->f_mode & FMODE_LSEEK) || !file->f_op->llseek) return -ESPIPE; return file->f_op->llseek(file, offset, whence);
Hi Christoph, On Sat, Jun 25, 2022 at 06:10:02AM -0700, Christoph Hellwig wrote: > On Sat, Jun 25, 2022 at 01:01:13PM +0200, Jason A. Donenfeld wrote: > > Now that all callers of ->llseek are going through vfs_llseek(), we > > don't gain anything by keeping no_llseek around. Nothing compares it or > > calls it. > > Shouldn't this and the checks for no_llseek simply be merged into patch > 2? I'd done that at first, but Al had suggested it be a separate commit in <https://lore.kernel.org/lkml/YrYxOC5dgCKBHwVE@ZenIV/>, when he mentions "next commit would", so I did how he asked. > > > + if ((file->f_mode & FMODE_LSEEK) && file->f_op->llseek) > > + return file->f_op->llseek(file, offset, whence); > > + return -ESPIPE; > > No function change, but in general checking for the error condition > in the branch tends to be more readable. i.e.: > > if (!(file->f_mode & FMODE_LSEEK) || !file->f_op->llseek) > return -ESPIPE; > return file->f_op->llseek(file, offset, whence); > I thought about this kind of reverse: what is the acceptable condition in which one may call ->llseek? Easier to express it that way than in the inverse. But if you really want, I can change it around if there's a v3 with other changes (which at the moment doesn't seem like there's going to be). Jason
diff --git a/fs/read_write.c b/fs/read_write.c index b1b1cdfee9d3..f0ecfd0fb843 100644 --- a/fs/read_write.c +++ b/fs/read_write.c @@ -227,12 +227,6 @@ loff_t noop_llseek(struct file *file, loff_t offset, int whence) } EXPORT_SYMBOL(noop_llseek); -loff_t no_llseek(struct file *file, loff_t offset, int whence) -{ - return -ESPIPE; -} -EXPORT_SYMBOL(no_llseek); - loff_t default_llseek(struct file *file, loff_t offset, int whence) { struct inode *inode = file_inode(file); @@ -290,14 +284,10 @@ EXPORT_SYMBOL(default_llseek); loff_t vfs_llseek(struct file *file, loff_t offset, int whence) { - loff_t (*fn)(struct file *, loff_t, int); + if ((file->f_mode & FMODE_LSEEK) && file->f_op->llseek) + return file->f_op->llseek(file, offset, whence); + return -ESPIPE; - fn = no_llseek; - if (file->f_mode & FMODE_LSEEK) { - if (file->f_op->llseek) - fn = file->f_op->llseek; - } - return fn(file, offset, whence); } EXPORT_SYMBOL(vfs_llseek); diff --git a/include/linux/fs.h b/include/linux/fs.h index 9ad5e3520fae..0cb5a1706e1f 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -3022,7 +3022,6 @@ extern long do_splice_direct(struct file *in, loff_t *ppos, struct file *out, extern void file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping); extern loff_t noop_llseek(struct file *file, loff_t offset, int whence); -extern loff_t no_llseek(struct file *file, loff_t offset, int whence); extern loff_t vfs_setpos(struct file *file, loff_t offset, loff_t maxsize); extern loff_t generic_file_llseek(struct file *file, loff_t offset, int whence); extern loff_t generic_file_llseek_size(struct file *file, loff_t offset,
Now that all callers of ->llseek are going through vfs_llseek(), we don't gain anything by keeping no_llseek around. Nothing compares it or calls it. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> --- fs/read_write.c | 16 +++------------- include/linux/fs.h | 1 - 2 files changed, 3 insertions(+), 14 deletions(-)