Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.24 /fs/file_table.c

Filename:/fs/file_table.c
Lines Added:64
Lines Deleted:6
Also changed in: (Previous) 2.6.24-rc8  2.6.24-rc7  2.6.24-rc6  2.6.24-rc5  2.6.24-rc4  2.6.24-rc3 
(Following) 2.6.24-git19  2.6.24-git20  2.6.24-git21  2.6.24-git22  2.6.25-rc1  2.6.25-rc2 

Location
[  2.6.24
  [  fs
     o  file_table.c

Patch

diff --git a/fs/file_table.c b/fs/file_table.c
index d17fd69..664e3f2 100644
--- a/fs/file_table.c
+++ b/fs/file_table.c
@@ -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,6 +137,66 @@ fail:
 
 EXPORT_SYMBOL(get_empty_filp);
 
+/**
+ * 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 fastcall fput(struct file *file)
 {
    if (atomic_dec_and_test(&file->f_count))
@@ -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? */


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.