|
@@ -35,6 +35,8 @@ static long autofs4_root_compat_ioctl(struct file *,unsigned int,unsigned long);
|
|
|
#endif
|
|
|
static int autofs4_dir_open(struct inode *inode, struct file *file);
|
|
|
static struct dentry *autofs4_lookup(struct inode *,struct dentry *, struct nameidata *);
|
|
|
+static struct vfsmount *autofs4_d_automount(struct path *);
|
|
|
+static int autofs4_d_manage(struct dentry *, bool);
|
|
|
|
|
|
const struct file_operations autofs4_root_operations = {
|
|
|
.open = dcache_dir_open,
|
|
@@ -64,6 +66,18 @@ const struct inode_operations autofs4_dir_inode_operations = {
|
|
|
.rmdir = autofs4_dir_rmdir,
|
|
|
};
|
|
|
|
|
|
+/* For dentries that don't initiate mounting */
|
|
|
+const struct dentry_operations autofs4_dentry_operations = {
|
|
|
+ .d_release = autofs4_dentry_release,
|
|
|
+};
|
|
|
+
|
|
|
+/* For dentries that do initiate mounting */
|
|
|
+const struct dentry_operations autofs4_mount_dentry_operations = {
|
|
|
+ .d_automount = autofs4_d_automount,
|
|
|
+ .d_manage = autofs4_d_manage,
|
|
|
+ .d_release = autofs4_dentry_release,
|
|
|
+};
|
|
|
+
|
|
|
static void autofs4_add_active(struct dentry *dentry)
|
|
|
{
|
|
|
struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
|
|
@@ -158,18 +172,6 @@ void autofs4_dentry_release(struct dentry *de)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/* For dentries of directories in the root dir */
|
|
|
-static const struct dentry_operations autofs4_root_dentry_operations = {
|
|
|
- .d_release = autofs4_dentry_release,
|
|
|
-};
|
|
|
-
|
|
|
-/* For other dentries */
|
|
|
-static const struct dentry_operations autofs4_dentry_operations = {
|
|
|
- .d_automount = autofs4_d_automount,
|
|
|
- .d_manage = autofs4_d_manage,
|
|
|
- .d_release = autofs4_dentry_release,
|
|
|
-};
|
|
|
-
|
|
|
static struct dentry *autofs4_lookup_active(struct dentry *dentry)
|
|
|
{
|
|
|
struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
|
|
@@ -337,7 +339,7 @@ static struct dentry *autofs4_mountpoint_changed(struct path *path)
|
|
|
return path->dentry;
|
|
|
}
|
|
|
|
|
|
-struct vfsmount *autofs4_d_automount(struct path *path)
|
|
|
+static struct vfsmount *autofs4_d_automount(struct path *path)
|
|
|
{
|
|
|
struct dentry *dentry = path->dentry;
|
|
|
struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
|
|
@@ -501,7 +503,7 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, s
|
|
|
if (active) {
|
|
|
return active;
|
|
|
} else {
|
|
|
- d_set_d_op(dentry, &autofs4_root_dentry_operations);
|
|
|
+ d_set_d_op(dentry, &autofs4_dentry_operations);
|
|
|
|
|
|
/*
|
|
|
* A dentry that is not within the root can never trigger a
|
|
@@ -514,7 +516,7 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, s
|
|
|
|
|
|
/* Mark entries in the root as mount triggers */
|
|
|
if (autofs_type_indirect(sbi->type) && IS_ROOT(dentry->d_parent)) {
|
|
|
- d_set_d_op(dentry, &autofs4_dentry_operations);
|
|
|
+ d_set_d_op(dentry, &autofs4_mount_dentry_operations);
|
|
|
__managed_dentry_set_managed(dentry);
|
|
|
}
|
|
|
|
|
@@ -573,6 +575,8 @@ static int autofs4_dir_symlink(struct inode *dir,
|
|
|
}
|
|
|
d_add(dentry, inode);
|
|
|
|
|
|
+ d_set_d_op(dentry, &autofs4_dentry_operations);
|
|
|
+
|
|
|
dentry->d_fsdata = ino;
|
|
|
ino->dentry = dget(dentry);
|
|
|
atomic_inc(&ino->count);
|
|
@@ -791,7 +795,7 @@ static inline int autofs4_ask_umount(struct vfsmount *mnt, int __user *p)
|
|
|
int is_autofs4_dentry(struct dentry *dentry)
|
|
|
{
|
|
|
return dentry && dentry->d_inode &&
|
|
|
- (dentry->d_op == &autofs4_root_dentry_operations ||
|
|
|
+ (dentry->d_op == &autofs4_mount_dentry_operations ||
|
|
|
dentry->d_op == &autofs4_dentry_operations) &&
|
|
|
dentry->d_fsdata != NULL;
|
|
|
}
|