diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-08-15 21:03:26 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-09-26 21:08:55 -0400 |
commit | 56007cae94f349387c088e738c7dcb6bc513063b (patch) | |
tree | b501eb1cc30619cb1cc9828a18256808546389de /fs/open.c | |
parent | 1983e781da2f7f77906f4ccc2c3dc279cd61d1ff (diff) |
move put_unused_fd() and fd_install() to fs/file.c
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/open.c')
-rw-r--r-- | fs/open.c | 44 |
1 files changed, 0 insertions, 44 deletions
@@ -803,50 +803,6 @@ struct file *dentry_open(const struct path *path, int flags, | |||
803 | } | 803 | } |
804 | EXPORT_SYMBOL(dentry_open); | 804 | EXPORT_SYMBOL(dentry_open); |
805 | 805 | ||
806 | static void __put_unused_fd(struct files_struct *files, unsigned int fd) | ||
807 | { | ||
808 | struct fdtable *fdt = files_fdtable(files); | ||
809 | __clear_open_fd(fd, fdt); | ||
810 | if (fd < files->next_fd) | ||
811 | files->next_fd = fd; | ||
812 | } | ||
813 | |||
814 | void put_unused_fd(unsigned int fd) | ||
815 | { | ||
816 | struct files_struct *files = current->files; | ||
817 | spin_lock(&files->file_lock); | ||
818 | __put_unused_fd(files, fd); | ||
819 | spin_unlock(&files->file_lock); | ||
820 | } | ||
821 | |||
822 | EXPORT_SYMBOL(put_unused_fd); | ||
823 | |||
824 | /* | ||
825 | * Install a file pointer in the fd array. | ||
826 | * | ||
827 | * The VFS is full of places where we drop the files lock between | ||
828 | * setting the open_fds bitmap and installing the file in the file | ||
829 | * array. At any such point, we are vulnerable to a dup2() race | ||
830 | * installing a file in the array before us. We need to detect this and | ||
831 | * fput() the struct file we are about to overwrite in this case. | ||
832 | * | ||
833 | * It should never happen - if we allow dup2() do it, _really_ bad things | ||
834 | * will follow. | ||
835 | */ | ||
836 | |||
837 | void fd_install(unsigned int fd, struct file *file) | ||
838 | { | ||
839 | struct files_struct *files = current->files; | ||
840 | struct fdtable *fdt; | ||
841 | spin_lock(&files->file_lock); | ||
842 | fdt = files_fdtable(files); | ||
843 | BUG_ON(fdt->fd[fd] != NULL); | ||
844 | rcu_assign_pointer(fdt->fd[fd], file); | ||
845 | spin_unlock(&files->file_lock); | ||
846 | } | ||
847 | |||
848 | EXPORT_SYMBOL(fd_install); | ||
849 | |||
850 | static inline int build_open_flags(int flags, umode_t mode, struct open_flags *op) | 806 | static inline int build_open_flags(int flags, umode_t mode, struct open_flags *op) |
851 | { | 807 | { |
852 | int lookup_flags = 0; | 808 | int lookup_flags = 0; |