driver core: fix up Kconfig text for CONFIG_SYSFS_DEPRECATED
[sfrench/cifs-2.6.git] / fs / file_table.c
index d17fd691b8325c8dab7c4ab086bfb1900687b1e0..6d27befe2d48ff5fbb13a45c5cd86618777bbbd9 100644 (file)
@@ -98,16 +98,15 @@ struct file *get_empty_filp(void)
                 * percpu_counters are inaccurate.  Do an expensive check before
                 * we go and fail.
                 */
-               if (percpu_counter_sum(&nr_files) >= files_stat.max_files)
+               if (percpu_counter_sum_positive(&nr_files) >= files_stat.max_files)
                        goto over;
        }
 
-       f = kmem_cache_alloc(filp_cachep, GFP_KERNEL);
+       f = kmem_cache_zalloc(filp_cachep, GFP_KERNEL);
        if (f == NULL)
                goto fail;
 
        percpu_counter_inc(&nr_files);
-       memset(f, 0, sizeof(*f));
        if (security_file_alloc(f))
                goto fail_sec;
 
@@ -138,7 +137,67 @@ fail:
 
 EXPORT_SYMBOL(get_empty_filp);
 
-void fastcall fput(struct file *file)
+/**
+ * alloc_file - allocate and initialize a 'struct file'
+ * @mnt: the vfsmount on which the file will reside
+ * @dentry: the dentry representing the new file
+ * @mode: the mode with which the new file will be opened
+ * @fop: the 'struct file_operations' for the new file
+ *
+ * Use this instead of get_empty_filp() to get a new
+ * 'struct file'.  Do so because of the same initialization
+ * pitfalls reasons listed for init_file().  This is a
+ * preferred interface to using init_file().
+ *
+ * If all the callers of init_file() are eliminated, its
+ * code should be moved into this function.
+ */
+struct file *alloc_file(struct vfsmount *mnt, struct dentry *dentry,
+               mode_t mode, const struct file_operations *fop)
+{
+       struct file *file;
+       struct path;
+
+       file = get_empty_filp();
+       if (!file)
+               return NULL;
+
+       init_file(file, mnt, dentry, mode, fop);
+       return file;
+}
+EXPORT_SYMBOL(alloc_file);
+
+/**
+ * init_file - initialize a 'struct file'
+ * @file: the already allocated 'struct file' to initialized
+ * @mnt: the vfsmount on which the file resides
+ * @dentry: the dentry representing this file
+ * @mode: the mode the file is opened with
+ * @fop: the 'struct file_operations' for this file
+ *
+ * Use this instead of setting the members directly.  Doing so
+ * avoids making mistakes like forgetting the mntget() or
+ * forgetting to take a write on the mnt.
+ *
+ * Note: This is a crappy interface.  It is here to make
+ * merging with the existing users of get_empty_filp()
+ * who have complex failure logic easier.  All users
+ * of this should be moving to alloc_file().
+ */
+int init_file(struct file *file, struct vfsmount *mnt, struct dentry *dentry,
+          mode_t mode, const struct file_operations *fop)
+{
+       int error = 0;
+       file->f_path.dentry = dentry;
+       file->f_path.mnt = mntget(mnt);
+       file->f_mapping = dentry->d_inode->i_mapping;
+       file->f_mode = mode;
+       file->f_op = fop;
+       return error;
+}
+EXPORT_SYMBOL(init_file);
+
+void fput(struct file *file)
 {
        if (atomic_dec_and_test(&file->f_count))
                __fput(file);
@@ -149,7 +208,7 @@ EXPORT_SYMBOL(fput);
 /* __fput is called from task context when aio completion releases the last
  * last use of a struct file *.  Do not use otherwise.
  */
-void fastcall __fput(struct file *file)
+void __fput(struct file *file)
 {
        struct dentry *dentry = file->f_path.dentry;
        struct vfsmount *mnt = file->f_path.mnt;
@@ -182,7 +241,7 @@ void fastcall __fput(struct file *file)
        mntput(mnt);
 }
 
-struct file fastcall *fget(unsigned int fd)
+struct file *fget(unsigned int fd)
 {
        struct file *file;
        struct files_struct *files = current->files;
@@ -210,7 +269,7 @@ EXPORT_SYMBOL(fget);
  * and a flag is returned to be passed to the corresponding fput_light().
  * There must not be a cloning between an fget_light/fput_light pair.
  */
-struct file fastcall *fget_light(unsigned int fd, int *fput_needed)
+struct file *fget_light(unsigned int fd, int *fput_needed)
 {
        struct file *file;
        struct files_struct *files = current->files;
@@ -264,12 +323,11 @@ void file_kill(struct file *file)
 
 int fs_may_remount_ro(struct super_block *sb)
 {
-       struct list_head *p;
+       struct file *file;
 
        /* Check that no files are currently opened for writing. */
        file_list_lock();
-       list_for_each(p, &sb->s_files) {
-               struct file *file = list_entry(p, struct file, f_u.fu_list);
+       list_for_each_entry(file, &sb->s_files, f_u.fu_list) {
                struct inode *inode = file->f_path.dentry->d_inode;
 
                /* File with pending delete? */