Use idr_tag_get() in fd_is_open() to know whether a given fd is allocated. Also move fd_is_open() to file.c and make it static as it is only called from one place. Signed-off-by: Sandhya Bankar <bankarsandhya512@xxxxxxxxx> Signed-off-by: Matthew Wilcox <mawilcox@xxxxxxxxxxxxx> --- fs/file.c | 7 ++++++- include/linux/fdtable.h | 5 ----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/fs/file.c b/fs/file.c index e8c6ada..8d67968 100644 --- a/fs/file.c +++ b/fs/file.c @@ -222,6 +222,11 @@ static int expand_files(struct files_struct *files, unsigned int nr) return expanded; } +static inline bool fd_is_open(unsigned int fd, struct files_struct *files) +{ + return !idr_tag_get(&files->fd_idr, fd, IDR_FREE); +} + static inline void __set_close_on_exec(unsigned int fd, struct fdtable *fdt) { __set_bit(fd, fdt->close_on_exec); @@ -778,7 +783,7 @@ static int do_dup2(struct files_struct *files, */ fdt = files_fdtable(files); tofree = idr_find(&files->fd_idr, fd); - if (!tofree && fd_is_open(fd, fdt)) + if (!tofree && fd_is_open(fd, files)) goto Ebusy; get_file(file); if (tofree) { diff --git a/include/linux/fdtable.h b/include/linux/fdtable.h index 6bece35..67259f4 100644 --- a/include/linux/fdtable.h +++ b/include/linux/fdtable.h @@ -34,11 +34,6 @@ static inline bool close_on_exec(unsigned int fd, const struct fdtable *fdt) return test_bit(fd, fdt->close_on_exec); } -static inline bool fd_is_open(unsigned int fd, const struct fdtable *fdt) -{ - return test_bit(fd, fdt->open_fds); -} - /* * Open file table structure */ -- 1.8.3.1