diff options
Diffstat (limited to 'fs/open.c')
-rw-r--r-- | fs/open.c | 12 |
1 files changed, 8 insertions, 4 deletions
@@ -890,6 +890,10 @@ EXPORT_SYMBOL(filp_open); | |||
890 | * a fully instantiated struct file to the caller. | 890 | * a fully instantiated struct file to the caller. |
891 | * This function is meant to be called from within a filesystem's | 891 | * This function is meant to be called from within a filesystem's |
892 | * lookup method. | 892 | * lookup method. |
893 | * Beware of calling it for non-regular files! Those ->open methods might block | ||
894 | * (e.g. in fifo_open), leaving you with parent locked (and in case of fifo, | ||
895 | * leading to a deadlock, as nobody can open that fifo anymore, because | ||
896 | * another process to open fifo will block on locked parent when doing lookup). | ||
893 | * Note that in case of error, nd->intent.open.file is destroyed, but the | 897 | * Note that in case of error, nd->intent.open.file is destroyed, but the |
894 | * path information remains valid. | 898 | * path information remains valid. |
895 | * If the open callback is set to NULL, then the standard f_op->open() | 899 | * If the open callback is set to NULL, then the standard f_op->open() |
@@ -973,7 +977,7 @@ repeat: | |||
973 | fdt = files_fdtable(files); | 977 | fdt = files_fdtable(files); |
974 | fd = find_next_zero_bit(fdt->open_fds->fds_bits, | 978 | fd = find_next_zero_bit(fdt->open_fds->fds_bits, |
975 | fdt->max_fdset, | 979 | fdt->max_fdset, |
976 | fdt->next_fd); | 980 | files->next_fd); |
977 | 981 | ||
978 | /* | 982 | /* |
979 | * N.B. For clone tasks sharing a files structure, this test | 983 | * N.B. For clone tasks sharing a files structure, this test |
@@ -998,7 +1002,7 @@ repeat: | |||
998 | 1002 | ||
999 | FD_SET(fd, fdt->open_fds); | 1003 | FD_SET(fd, fdt->open_fds); |
1000 | FD_CLR(fd, fdt->close_on_exec); | 1004 | FD_CLR(fd, fdt->close_on_exec); |
1001 | fdt->next_fd = fd + 1; | 1005 | files->next_fd = fd + 1; |
1002 | #if 1 | 1006 | #if 1 |
1003 | /* Sanity check */ | 1007 | /* Sanity check */ |
1004 | if (fdt->fd[fd] != NULL) { | 1008 | if (fdt->fd[fd] != NULL) { |
@@ -1019,8 +1023,8 @@ static void __put_unused_fd(struct files_struct *files, unsigned int fd) | |||
1019 | { | 1023 | { |
1020 | struct fdtable *fdt = files_fdtable(files); | 1024 | struct fdtable *fdt = files_fdtable(files); |
1021 | __FD_CLR(fd, fdt->open_fds); | 1025 | __FD_CLR(fd, fdt->open_fds); |
1022 | if (fd < fdt->next_fd) | 1026 | if (fd < files->next_fd) |
1023 | fdt->next_fd = fd; | 1027 | files->next_fd = fd; |
1024 | } | 1028 | } |
1025 | 1029 | ||
1026 | void fastcall put_unused_fd(unsigned int fd) | 1030 | void fastcall put_unused_fd(unsigned int fd) |