Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 93487
b: refs/heads/master
c: f8f9570
h: refs/heads/master
i:
  93485: 09c02a9
  93483: 8a916c6
  93479: 957fb0f
  93471: 1e87f01
v: v3
  • Loading branch information
Al Viro committed Apr 25, 2008
1 parent 0fdbfd4 commit 6222452
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 27 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: 3b1253880b7a9e6db54b943b2d40bcf2202f58ab
refs/heads/master: f8f95702f0c4529b0f59488f4509608f0c160e77
40 changes: 14 additions & 26 deletions trunk/fs/fcntl.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,14 +55,16 @@ static int get_close_on_exec(unsigned int fd)
* file_lock held for write.
*/

static int locate_fd(struct files_struct *files,
struct file *file, unsigned int orig_start)
static int locate_fd(unsigned int orig_start, int cloexec)
{
struct files_struct *files = current->files;
unsigned int newfd;
unsigned int start;
int error;
struct fdtable *fdt;

spin_lock(&files->file_lock);

error = -EINVAL;
if (orig_start >= current->signal->rlim[RLIMIT_NOFILE].rlim_cur)
goto out;
Expand Down Expand Up @@ -97,42 +99,28 @@ 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.
*/
if (start <= files->next_fd)
files->next_fd = newfd + 1;

FD_SET(newfd, fdt->open_fds);
if (cloexec)
FD_SET(newfd, fdt->close_on_exec);
else
FD_CLR(newfd, fdt->close_on_exec);
error = newfd;

out:
spin_unlock(&files->file_lock);
return error;
}

static int dupfd(struct file *file, unsigned int start, int cloexec)
{
struct files_struct * files = current->files;
struct fdtable *fdt;
int fd;

spin_lock(&files->file_lock);
fd = locate_fd(files, file, start);
if (fd >= 0) {
/* locate_fd() may have expanded fdtable, load the ptr */
fdt = files_fdtable(files);
FD_SET(fd, fdt->open_fds);
if (cloexec)
FD_SET(fd, fdt->close_on_exec);
else
FD_CLR(fd, fdt->close_on_exec);
spin_unlock(&files->file_lock);
int fd = locate_fd(start, cloexec);
if (fd >= 0)
fd_install(fd, file);
} else {
spin_unlock(&files->file_lock);
else
fput(file);
}

return fd;
}
Expand Down

0 comments on commit 6222452

Please sign in to comment.