diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/file.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/fs/file.c b/fs/file.c index 6448523ca29e..23b888a4acbe 100644 --- a/fs/file.c +++ b/fs/file.c @@ -880,6 +880,27 @@ struct file *task_lookup_fd_rcu(struct task_struct *task, unsigned int fd) return file; } +struct file *task_lookup_next_fd_rcu(struct task_struct *task, unsigned int *ret_fd) +{ + /* Must be called with rcu_read_lock held */ + struct files_struct *files; + unsigned int fd = *ret_fd; + struct file *file = NULL; + + task_lock(task); + files = task->files; + if (files) { + for (; fd < files_fdtable(files)->max_fds; fd++) { + file = files_lookup_fd_rcu(files, fd); + if (file) + break; + } + } + task_unlock(task); + *ret_fd = fd; + return file; +} + /* * Lightweight file lookup - no refcnt increment if fd table isn't shared. * |