On Wed 04-12-24 17:23:25, I Hsin Cheng wrote: > As the implementation of "f->f_pos_lock" may change in the future, > wrapping the actual implementation of locking and unlocking of it can > provide better decoupling semantics. > > "__f_unlock_pos()" already exist and does that, adding "__f_lock_pos()" > can provide full decoupling. > > Signed-off-by: I Hsin Cheng <richard120310@xxxxxxxxx> I guess this would make sense for consistence. But Al, what was the motivation of introducing __f_unlock_pos() in the first place? It has one caller and was silently introduced in 63b6df14134d ("give readdir(2)/getdents(2)/etc. uniform exclusion with lseek()") about 8 years ago. Honza > --- > fs/file.c | 7 ++++++- > include/linux/file.h | 1 + > 2 files changed, 7 insertions(+), 1 deletion(-) > > diff --git a/fs/file.c b/fs/file.c > index fb1011cf6b4a..b93ac67d276d 100644 > --- a/fs/file.c > +++ b/fs/file.c > @@ -1181,6 +1181,11 @@ static inline bool file_needs_f_pos_lock(struct file *file) > (file_count(file) > 1 || file->f_op->iterate_shared); > } > > +void __f_lock_pos(struct file *f) > +{ > + mutex_lock(&f->f_pos_lock); > +} > + > struct fd fdget_pos(unsigned int fd) > { > struct fd f = fdget(fd); > @@ -1188,7 +1193,7 @@ struct fd fdget_pos(unsigned int fd) > > if (file && file_needs_f_pos_lock(file)) { > f.word |= FDPUT_POS_UNLOCK; > - mutex_lock(&file->f_pos_lock); > + __f_lock_pos(file); > } > return f; > } > diff --git a/include/linux/file.h b/include/linux/file.h > index 302f11355b10..16292bd95499 100644 > --- a/include/linux/file.h > +++ b/include/linux/file.h > @@ -67,6 +67,7 @@ extern struct file *fget(unsigned int fd); > extern struct file *fget_raw(unsigned int fd); > extern struct file *fget_task(struct task_struct *task, unsigned int fd); > extern struct file *fget_task_next(struct task_struct *task, unsigned int *fd); > +extern void __f_lock_pos(struct file *file); > extern void __f_unlock_pos(struct file *); > > struct fd fdget(unsigned int fd); > -- > 2.43.0 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR