Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 359153
b: refs/heads/master
c: 1afc99b
h: refs/heads/master
i:
  359151: 014ef23
v: v3
  • Loading branch information
Al Viro committed Feb 23, 2013
1 parent 758b940 commit 3b7a2f8
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 31 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: 496ad9aa8ef448058e36ca7a787c61f2e63f0f54
refs/heads/master: 1afc99beaf0fca3767d9b67789a7ae91c4f7a9c9
27 changes: 13 additions & 14 deletions trunk/fs/file_table.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,8 @@ int proc_nr_files(ctl_table *table, int write,
#endif

/* Find an unused file structure and return a pointer to it.
* Returns NULL, if there are no more free file structures or
* we run out of memory.
* Returns an error pointer if some error happend e.g. we over file
* structures limit, run out of memory or operation is not permitted.
*
* Be very careful using this. You are responsible for
* getting write access to any mount that you might assign
Expand All @@ -107,7 +107,8 @@ struct file *get_empty_filp(void)
{
const struct cred *cred = current_cred();
static long old_max;
struct file * f;
struct file *f;
int error;

/*
* Privileged users can go above max_files
Expand All @@ -122,13 +123,16 @@ struct file *get_empty_filp(void)
}

f = kmem_cache_zalloc(filp_cachep, GFP_KERNEL);
if (f == NULL)
goto fail;
if (unlikely(!f))
return ERR_PTR(-ENOMEM);

percpu_counter_inc(&nr_files);
f->f_cred = get_cred(cred);
if (security_file_alloc(f))
goto fail_sec;
error = security_file_alloc(f);
if (unlikely(error)) {
file_free(f);
return ERR_PTR(error);
}

INIT_LIST_HEAD(&f->f_u.fu_list);
atomic_long_set(&f->f_count, 1);
Expand All @@ -144,12 +148,7 @@ struct file *get_empty_filp(void)
pr_info("VFS: file-max limit %lu reached\n", get_max_files());
old_max = get_nr_files();
}
goto fail;

fail_sec:
file_free(f);
fail:
return NULL;
return ERR_PTR(-ENFILE);
}

/**
Expand All @@ -173,7 +172,7 @@ struct file *alloc_file(struct path *path, fmode_t mode,
struct file *file;

file = get_empty_filp();
if (!file)
if (IS_ERR(file))
return NULL;

file->f_path = *path;
Expand Down
4 changes: 2 additions & 2 deletions trunk/fs/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -2941,8 +2941,8 @@ static struct file *path_openat(int dfd, struct filename *pathname,
int error;

file = get_empty_filp();
if (!file)
return ERR_PTR(-ENFILE);
if (IS_ERR(file))
return file;

file->f_flags = op->open_flag;

Expand Down
27 changes: 13 additions & 14 deletions trunk/fs/open.c
Original file line number Diff line number Diff line change
Expand Up @@ -810,23 +810,22 @@ struct file *dentry_open(const struct path *path, int flags,
/* We must always pass in a valid mount pointer. */
BUG_ON(!path->mnt);

error = -ENFILE;
f = get_empty_filp();
if (f == NULL)
return ERR_PTR(error);

f->f_flags = flags;
f->f_path = *path;
error = do_dentry_open(f, NULL, cred);
if (!error) {
error = open_check_o_direct(f);
if (error) {
fput(f);
if (!IS_ERR(f)) {
f->f_flags = flags;
f->f_path = *path;
error = do_dentry_open(f, NULL, cred);
if (!error) {
/* from now on we need fput() to dispose of f */
error = open_check_o_direct(f);
if (error) {
fput(f);
f = ERR_PTR(error);
}
} else {
put_filp(f);
f = ERR_PTR(error);
}
} else {
put_filp(f);
f = ERR_PTR(error);
}
return f;
}
Expand Down

0 comments on commit 3b7a2f8

Please sign in to comment.