Lines Matching refs:fd
105 kvfree(fdt->fd); in __free_fdtable()
149 memcpy(nfdt->fd, ofdt->fd, cpy); in copy_fdtable()
150 memset((char *)nfdt->fd + cpy, 0, set); in copy_fdtable()
222 fdt->fd = data; in alloc_fdtable()
238 kvfree(fdt->fd); in alloc_fdtable()
322 static inline void __set_close_on_exec(unsigned int fd, struct fdtable *fdt, in __set_close_on_exec() argument
326 __set_bit(fd, fdt->close_on_exec); in __set_close_on_exec()
328 if (test_bit(fd, fdt->close_on_exec)) in __set_close_on_exec()
329 __clear_bit(fd, fdt->close_on_exec); in __set_close_on_exec()
333 static inline void __set_open_fd(unsigned int fd, struct fdtable *fdt, bool set) in __set_open_fd() argument
335 __set_bit(fd, fdt->open_fds); in __set_open_fd()
336 __set_close_on_exec(fd, fdt, set); in __set_open_fd()
337 fd /= BITS_PER_LONG; in __set_open_fd()
338 if (!~fdt->open_fds[fd]) in __set_open_fd()
339 __set_bit(fd, fdt->full_fds_bits); in __set_open_fd()
342 static inline void __clear_open_fd(unsigned int fd, struct fdtable *fdt) in __clear_open_fd() argument
344 __clear_bit(fd, fdt->open_fds); in __clear_open_fd()
345 fd /= BITS_PER_LONG; in __clear_open_fd()
346 if (test_bit(fd, fdt->full_fds_bits)) in __clear_open_fd()
347 __clear_bit(fd, fdt->full_fds_bits); in __clear_open_fd()
350 static inline bool fd_is_open(unsigned int fd, const struct fdtable *fdt) in fd_is_open() argument
352 return test_bit(fd, fdt->open_fds); in fd_is_open()
405 new_fdt->fd = &newf->fd_array[0]; in dup_fd()
438 old_fds = old_fdt->fd; in dup_fd()
439 new_fds = new_fdt->fd; in dup_fd()
492 struct file *file = fdt->fd[i]; in close_files()
535 .fd = &init_files.fd_array[0],
573 unsigned int fd; in alloc_fd() local
580 fd = start; in alloc_fd()
581 if (fd < files->next_fd) in alloc_fd()
582 fd = files->next_fd; in alloc_fd()
584 if (likely(fd < fdt->max_fds)) in alloc_fd()
585 fd = find_next_fd(fdt, fd); in alloc_fd()
592 if (unlikely(fd >= end)) in alloc_fd()
595 if (unlikely(fd >= fdt->max_fds)) { in alloc_fd()
596 error = expand_files(files, fd); in alloc_fd()
604 files->next_fd = fd + 1; in alloc_fd()
606 __set_open_fd(fd, fdt, flags & O_CLOEXEC); in alloc_fd()
607 error = fd; in alloc_fd()
608 VFS_BUG_ON(rcu_access_pointer(fdt->fd[fd]) != NULL); in alloc_fd()
626 static void __put_unused_fd(struct files_struct *files, unsigned int fd) in __put_unused_fd() argument
629 __clear_open_fd(fd, fdt); in __put_unused_fd()
630 if (fd < files->next_fd) in __put_unused_fd()
631 files->next_fd = fd; in __put_unused_fd()
634 void put_unused_fd(unsigned int fd) in put_unused_fd() argument
638 __put_unused_fd(files, fd); in put_unused_fd()
660 static void noinline fd_install_slowpath(unsigned int fd, struct file *file) in fd_install_slowpath() argument
667 VFS_BUG_ON(rcu_access_pointer(fdt->fd[fd]) != NULL); in fd_install_slowpath()
668 rcu_assign_pointer(fdt->fd[fd], file); in fd_install_slowpath()
680 void fd_install(unsigned int fd, struct file *file) in fd_install() argument
691 fd_install_slowpath(fd, file); in fd_install()
697 VFS_BUG_ON(rcu_access_pointer(fdt->fd[fd]) != NULL); in fd_install()
698 rcu_assign_pointer(fdt->fd[fd], file); in fd_install()
715 struct file *file_close_fd_locked(struct files_struct *files, unsigned fd) in file_close_fd_locked() argument
722 if (fd >= fdt->max_fds) in file_close_fd_locked()
725 fd = array_index_nospec(fd, fdt->max_fds); in file_close_fd_locked()
726 file = rcu_dereference_raw(fdt->fd[fd]); in file_close_fd_locked()
728 rcu_assign_pointer(fdt->fd[fd], NULL); in file_close_fd_locked()
729 __put_unused_fd(files, fd); in file_close_fd_locked()
734 int close_fd(unsigned fd) in close_fd() argument
740 file = file_close_fd_locked(files, fd); in close_fd()
763 unsigned int fd, unsigned int max_fd) in __range_cloexec() argument
771 if (fd <= max_fd) in __range_cloexec()
772 bitmap_set(fdt->close_on_exec, fd, max_fd - fd + 1); in __range_cloexec()
776 static inline void __range_close(struct files_struct *files, unsigned int fd, in __range_close() argument
788 for (fd = find_next_bit(fdt->open_fds, max_fd + 1, fd); in __range_close()
789 fd <= max_fd; in __range_close()
790 fd = find_next_bit(fdt->open_fds, max_fd + 1, fd + 1)) { in __range_close()
791 file = file_close_fd_locked(files, fd); in __range_close()
819 SYSCALL_DEFINE3(close_range, unsigned int, fd, unsigned int, max_fd, in SYSCALL_DEFINE3() argument
828 if (fd > max_fd) in SYSCALL_DEFINE3()
832 struct fd_range range = {fd, max_fd}, *punch_hole = ⦥ in SYSCALL_DEFINE3()
853 __range_cloexec(cur_fds, fd, max_fd); in SYSCALL_DEFINE3()
855 __range_close(cur_fds, fd, max_fd); in SYSCALL_DEFINE3()
879 struct file *file_close_fd(unsigned int fd) in file_close_fd() argument
885 file = file_close_fd_locked(files, fd); in file_close_fd()
900 unsigned fd = i * BITS_PER_LONG; in do_close_on_exec() local
902 if (fd >= fdt->max_fds) in do_close_on_exec()
908 for ( ; set ; fd++, set >>= 1) { in do_close_on_exec()
912 file = fdt->fd[fd]; in do_close_on_exec()
915 rcu_assign_pointer(fdt->fd[fd], NULL); in do_close_on_exec()
916 __put_unused_fd(files, fd); in do_close_on_exec()
1019 unsigned int fd, fmode_t mask) in __fget_files_rcu() argument
1028 nospec_mask = array_index_mask_nospec(fd, fdt->max_fds); in __fget_files_rcu()
1035 fdentry = fdt->fd + (fd & nospec_mask); in __fget_files_rcu()
1094 static struct file *__fget_files(struct files_struct *files, unsigned int fd, in __fget_files() argument
1100 file = __fget_files_rcu(files, fd, mask); in __fget_files()
1106 static inline struct file *__fget(unsigned int fd, fmode_t mask) in __fget() argument
1108 return __fget_files(current->files, fd, mask); in __fget()
1111 struct file *fget(unsigned int fd) in fget() argument
1113 return __fget(fd, FMODE_PATH); in fget()
1117 struct file *fget_raw(unsigned int fd) in fget_raw() argument
1119 return __fget(fd, 0); in fget_raw()
1123 struct file *fget_task(struct task_struct *task, unsigned int fd) in fget_task() argument
1129 file = __fget_files(task->files, fd, 0); in fget_task()
1139 unsigned int fd = *ret_fd; in fget_task_next() local
1146 for (; fd < files_fdtable(files)->max_fds; fd++) { in fget_task_next()
1147 file = __fget_files_rcu(files, fd, 0); in fget_task_next()
1154 *ret_fd = fd; in fget_task_next()
1182 static inline struct fd __fget_light(unsigned int fd, fmode_t mask) in __fget_light() argument
1197 file = files_lookup_fd_raw(files, fd); in __fget_light()
1202 file = __fget_files(files, fd, mask); in __fget_light()
1208 struct fd fdget(unsigned int fd) in fdget() argument
1210 return __fget_light(fd, FMODE_PATH); in fdget()
1214 struct fd fdget_raw(unsigned int fd) in fdget_raw() argument
1216 return __fget_light(fd, 0); in fdget_raw()
1254 struct fd fdget_pos(unsigned int fd) in fdget_pos() argument
1256 struct fd f = fdget(fd); in fdget_pos()
1277 void set_close_on_exec(unsigned int fd, int flag) in set_close_on_exec() argument
1281 __set_close_on_exec(fd, files_fdtable(files), flag); in set_close_on_exec()
1285 bool get_close_on_exec(unsigned int fd) in get_close_on_exec() argument
1289 res = close_on_exec(fd, current->files); in get_close_on_exec()
1295 struct file *file, unsigned fd, unsigned flags) in do_dup2() argument
1328 fd = array_index_nospec(fd, fdt->max_fds); in do_dup2()
1329 tofree = rcu_dereference_raw(fdt->fd[fd]); in do_dup2()
1330 if (!tofree && fd_is_open(fd, fdt)) in do_dup2()
1333 rcu_assign_pointer(fdt->fd[fd], file); in do_dup2()
1334 __set_open_fd(fd, fdt, flags & O_CLOEXEC); in do_dup2()
1340 return fd; in do_dup2()
1347 int replace_fd(unsigned fd, struct file *file, unsigned flags) in replace_fd() argument
1353 return close_fd(fd); in replace_fd()
1355 if (fd >= rlimit(RLIMIT_NOFILE)) in replace_fd()
1359 err = expand_files(files, fd); in replace_fd()
1362 err = do_dup2(files, file, fd, flags); in replace_fd()
1523 file = rcu_dereference_check_fdtable(files, fdt->fd[n]); in iterate_fd()