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> --- 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