Pārlūkot izejas kodu

autofs4: keep symlink body in inode->i_private

gets rid of all ->free()/->u.symlink machinery in autofs; we simply
keep symlink bodies in inode->i_private and free them in ->evict_inode().

Acked-by: Ian Kent <raven@themaw.net>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Al Viro 14 gadi atpakaļ
vecāks
revīzija
292c5ee802
4 mainītis faili ar 9 papildinājumiem un 28 dzēšanām
  1. 0 5
      fs/autofs4/autofs_i.h
  2. 7 20
      fs/autofs4/inode.c
  3. 1 1
      fs/autofs4/root.c
  4. 1 2
      fs/autofs4/symlink.c

+ 0 - 5
fs/autofs4/autofs_i.h

@@ -91,11 +91,6 @@ struct autofs_info {
 
 
 	mode_t	mode;
 	mode_t	mode;
 	size_t	size;
 	size_t	size;
-
-	void (*free)(struct autofs_info *);
-	union {
-		const char *symlink;
-	} u;
 };
 };
 
 
 #define AUTOFS_INF_EXPIRING	(1<<0) /* dentry is in the process of expiring */
 #define AUTOFS_INF_EXPIRING	(1<<0) /* dentry is in the process of expiring */

+ 7 - 20
fs/autofs4/inode.c

@@ -22,14 +22,6 @@
 #include "autofs_i.h"
 #include "autofs_i.h"
 #include <linux/module.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_info *autofs4_init_ino(struct autofs_info *ino,
 				     struct autofs_sb_info *sbi, mode_t mode)
 				     struct autofs_sb_info *sbi, mode_t mode)
 {
 {
@@ -60,16 +52,6 @@ struct autofs_info *autofs4_init_ino(struct autofs_info *ino,
 
 
 	ino->sbi = sbi;
 	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;
 	return ino;
 }
 }
 
 
@@ -79,8 +61,6 @@ void autofs4_free_ino(struct autofs_info *ino)
 		ino->dentry->d_fsdata = NULL;
 		ino->dentry->d_fsdata = NULL;
 		ino->dentry = NULL;
 		ino->dentry = NULL;
 	}
 	}
-	if (ino->free)
-		(ino->free)(ino);
 	kfree(ino);
 	kfree(ino);
 }
 }
 
 
@@ -136,9 +116,16 @@ static int autofs4_show_options(struct seq_file *m, struct vfsmount *mnt)
 	return 0;
 	return 0;
 }
 }
 
 
+static void autofs4_evict_inode(struct inode *inode)
+{
+	end_writeback(inode);
+	kfree(inode->i_private);
+}
+
 static const struct super_operations autofs4_sops = {
 static const struct super_operations autofs4_sops = {
 	.statfs		= simple_statfs,
 	.statfs		= simple_statfs,
 	.show_options	= autofs4_show_options,
 	.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,
 enum {Opt_err, Opt_fd, Opt_uid, Opt_gid, Opt_pgrp, Opt_minproto, Opt_maxproto,

+ 1 - 1
fs/autofs4/root.c

@@ -561,6 +561,7 @@ static int autofs4_dir_symlink(struct inode *dir,
 			kfree(ino);
 			kfree(ino);
 		return -ENOMEM;
 		return -ENOMEM;
 	}
 	}
+	inode->i_private = cp;
 	d_add(dentry, inode);
 	d_add(dentry, inode);
 
 
 	dentry->d_fsdata = ino;
 	dentry->d_fsdata = ino;
@@ -570,7 +571,6 @@ static int autofs4_dir_symlink(struct inode *dir,
 	if (p_ino && dentry->d_parent != dentry)
 	if (p_ino && dentry->d_parent != dentry)
 		atomic_inc(&p_ino->count);
 		atomic_inc(&p_ino->count);
 
 
-	ino->u.symlink = cp;
 	dir->i_mtime = CURRENT_TIME;
 	dir->i_mtime = CURRENT_TIME;
 
 
 	return 0;
 	return 0;

+ 1 - 2
fs/autofs4/symlink.c

@@ -14,8 +14,7 @@
 
 
 static void *autofs4_follow_link(struct dentry *dentry, struct nameidata *nd)
 static void *autofs4_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
 {
-	struct autofs_info *ino = autofs4_dentry_ino(dentry);
-	nd_set_link(nd, (char *)ino->u.symlink);
+	nd_set_link(nd, dentry->d_inode->i_private);
 	return NULL;
 	return NULL;
 }
 }