Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 8193
b: refs/heads/master
c: ab2af1f
h: refs/heads/master
i:
  8191: 08f97ba
v: v3
  • Loading branch information
Dipankar Sarma authored and Linus Torvalds committed Sep 9, 2005
1 parent 3b61873 commit d559cfd
Show file tree
Hide file tree
Showing 11 changed files with 346 additions and 167 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6e72ad2c581de121cc7e772469e2a8f6b1fd4379
refs/heads/master: ab2af1f5005069321c5d130f09cce577b03f43ef
3 changes: 2 additions & 1 deletion trunk/fs/aio.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include <linux/highmem.h>
#include <linux/workqueue.h>
#include <linux/security.h>
#include <linux/rcuref.h>

#include <asm/kmap_types.h>
#include <asm/uaccess.h>
Expand Down Expand Up @@ -499,7 +500,7 @@ static int __aio_put_req(struct kioctx *ctx, struct kiocb *req)
/* Must be done under the lock to serialise against cancellation.
* Call this aio_fput as it duplicates fput via the fput_work.
*/
if (unlikely(atomic_dec_and_test(&req->ki_filp->f_count))) {
if (unlikely(rcuref_dec_and_test(&req->ki_filp->f_count))) {
get_ioctx(ctx);
spin_lock(&fput_lock);
list_add(&req->ki_list, &fput_head);
Expand Down
13 changes: 10 additions & 3 deletions trunk/fs/fcntl.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include <linux/security.h>
#include <linux/ptrace.h>
#include <linux/signal.h>
#include <linux/rcupdate.h>

#include <asm/poll.h>
#include <asm/siginfo.h>
Expand Down Expand Up @@ -64,8 +65,8 @@ static int locate_fd(struct files_struct *files,
if (orig_start >= current->signal->rlim[RLIMIT_NOFILE].rlim_cur)
goto out;

fdt = files_fdtable(files);
repeat:
fdt = files_fdtable(files);
/*
* Someone might have closed fd's in the range
* orig_start..fdt->next_fd
Expand Down Expand Up @@ -95,9 +96,15 @@ static int locate_fd(struct files_struct *files,
if (error)
goto repeat;

/*
* We reacquired files_lock, so we are safe as long as
* we reacquire the fdtable pointer and use it while holding
* the lock, no one can free it during that time.
*/
fdt = files_fdtable(files);
if (start <= fdt->next_fd)
fdt->next_fd = newfd + 1;

error = newfd;

out:
Expand Down Expand Up @@ -163,7 +170,7 @@ asmlinkage long sys_dup2(unsigned int oldfd, unsigned int newfd)
if (!tofree && FD_ISSET(newfd, fdt->open_fds))
goto out_fput;

fdt->fd[newfd] = file;
rcu_assign_pointer(fdt->fd[newfd], file);
FD_SET(newfd, fdt->open_fds);
FD_CLR(newfd, fdt->close_on_exec);
spin_unlock(&files->file_lock);
Expand Down
Loading

0 comments on commit d559cfd

Please sign in to comment.