diff options
Diffstat (limited to 'fs/locks.c')
| -rw-r--r-- | fs/locks.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/fs/locks.c b/fs/locks.c index 11956b6179ff..c2c09b4798d6 100644 --- a/fs/locks.c +++ b/fs/locks.c | |||
| @@ -2198,21 +2198,23 @@ void steal_locks(fl_owner_t from) | |||
| 2198 | { | 2198 | { |
| 2199 | struct files_struct *files = current->files; | 2199 | struct files_struct *files = current->files; |
| 2200 | int i, j; | 2200 | int i, j; |
| 2201 | struct fdtable *fdt; | ||
| 2201 | 2202 | ||
| 2202 | if (from == files) | 2203 | if (from == files) |
| 2203 | return; | 2204 | return; |
| 2204 | 2205 | ||
| 2205 | lock_kernel(); | 2206 | lock_kernel(); |
| 2206 | j = 0; | 2207 | j = 0; |
| 2208 | fdt = files_fdtable(files); | ||
| 2207 | for (;;) { | 2209 | for (;;) { |
| 2208 | unsigned long set; | 2210 | unsigned long set; |
| 2209 | i = j * __NFDBITS; | 2211 | i = j * __NFDBITS; |
| 2210 | if (i >= files->max_fdset || i >= files->max_fds) | 2212 | if (i >= fdt->max_fdset || i >= fdt->max_fds) |
| 2211 | break; | 2213 | break; |
| 2212 | set = files->open_fds->fds_bits[j++]; | 2214 | set = fdt->open_fds->fds_bits[j++]; |
| 2213 | while (set) { | 2215 | while (set) { |
| 2214 | if (set & 1) { | 2216 | if (set & 1) { |
| 2215 | struct file *file = files->fd[i]; | 2217 | struct file *file = fdt->fd[i]; |
| 2216 | if (file) | 2218 | if (file) |
| 2217 | __steal_locks(file, from); | 2219 | __steal_locks(file, from); |
| 2218 | } | 2220 | } |
