mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
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>
This commit is contained in:
parent
c0bcc9d552
commit
292c5ee802
4 changed files with 9 additions and 28 deletions
|
@ -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 */
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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, dentry->d_inode->i_private);
|
||||||
nd_set_link(nd, (char *)ino->u.symlink);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue