Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 292c5ee8 authored by Al Viro's avatar Al Viro
Browse files

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: default avatarIan Kent <raven@themaw.net>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent c0bcc9d5
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -91,11 +91,6 @@ struct autofs_info {

	mode_t	mode;
	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 */
+7 −20
Original line number Diff line number Diff line
@@ -22,14 +22,6 @@
#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)
{
@@ -60,16 +52,6 @@ struct autofs_info *autofs4_init_ino(struct autofs_info *ino,

	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 +61,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 +116,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,
+1 −1
Original line number Diff line number Diff line
@@ -561,6 +561,7 @@ static int autofs4_dir_symlink(struct inode *dir,
			kfree(ino);
		return -ENOMEM;
	}
	inode->i_private = cp;
	d_add(dentry, inode);

	dentry->d_fsdata = ino;
@@ -570,7 +571,6 @@ static int autofs4_dir_symlink(struct inode *dir,
	if (p_ino && dentry->d_parent != dentry)
		atomic_inc(&p_ino->count);

	ino->u.symlink = cp;
	dir->i_mtime = CURRENT_TIME;

	return 0;
+1 −2
Original line number Diff line number Diff line
@@ -14,8 +14,7 @@

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;
}