]> git.karo-electronics.de Git - linux-beck.git/blobdiff - fs/autofs4/inode.c
autofs4: pass mode to autofs4_get_inode() explicitly
[linux-beck.git] / fs / autofs4 / inode.c
index 9e1a9dad23e16663fc69937ebc47dd7f286529f2..6b6f43f00c468976b9f68d35141370705e03c548 100644 (file)
 #include "autofs_i.h"
 #include <linux/module.h>
 
-static void ino_lnkfree(struct autofs_info *ino)
-{
-       if (ino->u.symlink) {
-               kfree(ino->u.symlink);
-               ino->u.symlink = NULL;
-       }
-}
-
 struct autofs_info *autofs4_init_ino(struct autofs_info *ino,
-                                    struct autofs_sb_info *sbi, mode_t mode)
+                                    struct autofs_sb_info *sbi)
 {
        int reinit = 1;
 
@@ -55,21 +47,10 @@ struct autofs_info *autofs4_init_ino(struct autofs_info *ino,
 
        ino->uid = 0;
        ino->gid = 0;
-       ino->mode = mode;
        ino->last_used = jiffies;
 
        ino->sbi = sbi;
 
-       if (reinit && ino->free)
-               (ino->free)(ino);
-
-       memset(&ino->u, 0, sizeof(ino->u));
-
-       ino->free = NULL;
-
-       if (S_ISLNK(mode))
-               ino->free = ino_lnkfree;
-
        return ino;
 }
 
@@ -79,8 +60,6 @@ void autofs4_free_ino(struct autofs_info *ino)
                ino->dentry->d_fsdata = NULL;
                ino->dentry = NULL;
        }
-       if (ino->free)
-               (ino->free)(ino);
        kfree(ino);
 }
 
@@ -136,9 +115,16 @@ static int autofs4_show_options(struct seq_file *m, struct vfsmount *mnt)
        return 0;
 }
 
+static void autofs4_evict_inode(struct inode *inode)
+{
+       end_writeback(inode);
+       kfree(inode->i_private);
+}
+
 static const struct super_operations autofs4_sops = {
        .statfs         = simple_statfs,
        .show_options   = autofs4_show_options,
+       .evict_inode    = autofs4_evict_inode,
 };
 
 enum {Opt_err, Opt_fd, Opt_uid, Opt_gid, Opt_pgrp, Opt_minproto, Opt_maxproto,
@@ -228,17 +214,6 @@ static int parse_options(char *options, int *pipefd, uid_t *uid, gid_t *gid,
        return (*pipefd < 0);
 }
 
-static struct autofs_info *autofs4_mkroot(struct autofs_sb_info *sbi)
-{
-       struct autofs_info *ino;
-
-       ino = autofs4_init_ino(NULL, sbi, S_IFDIR | 0755);
-       if (!ino)
-               return NULL;
-
-       return ino;
-}
-
 int autofs4_fill_super(struct super_block *s, void *data, int silent)
 {
        struct inode * root_inode;
@@ -282,10 +257,10 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent)
        /*
         * Get the root inode and dentry, but defer checking for errors.
         */
-       ino = autofs4_mkroot(sbi);
+       ino = autofs4_init_ino(NULL, sbi);
        if (!ino)
                goto fail_free;
-       root_inode = autofs4_get_inode(s, ino);
+       root_inode = autofs4_get_inode(s, ino, S_IFDIR | 0755);
        if (!root_inode)
                goto fail_ino;
 
@@ -369,14 +344,15 @@ fail_unlock:
 }
 
 struct inode *autofs4_get_inode(struct super_block *sb,
-                               struct autofs_info *inf)
+                               struct autofs_info *inf,
+                               mode_t mode)
 {
        struct inode *inode = new_inode(sb);
 
        if (inode == NULL)
                return NULL;
 
-       inode->i_mode = inf->mode;
+       inode->i_mode = mode;
        if (sb->s_root) {
                inode->i_uid = sb->s_root->d_inode->i_uid;
                inode->i_gid = sb->s_root->d_inode->i_gid;
@@ -384,11 +360,11 @@ struct inode *autofs4_get_inode(struct super_block *sb,
        inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
        inode->i_ino = get_next_ino();
 
-       if (S_ISDIR(inf->mode)) {
+       if (S_ISDIR(mode)) {
                inode->i_nlink = 2;
                inode->i_op = &autofs4_dir_inode_operations;
                inode->i_fop = &autofs4_dir_operations;
-       } else if (S_ISLNK(inf->mode)) {
+       } else if (S_ISLNK(mode)) {
                inode->i_size = inf->size;
                inode->i_op = &autofs4_symlink_inode_operations;
        }