|
@@ -1,16 +1,12 @@
|
|
|
-/* -*- c -*- --------------------------------------------------------------- *
|
|
|
- *
|
|
|
- * linux/fs/autofs/root.c
|
|
|
- *
|
|
|
- * Copyright 1997-1998 Transmeta Corporation -- All Rights Reserved
|
|
|
- * Copyright 1999-2000 Jeremy Fitzhardinge <jeremy@goop.org>
|
|
|
- * Copyright 2001-2006 Ian Kent <raven@themaw.net>
|
|
|
+/*
|
|
|
+ * Copyright 1997-1998 Transmeta Corporation -- All Rights Reserved
|
|
|
+ * Copyright 1999-2000 Jeremy Fitzhardinge <jeremy@goop.org>
|
|
|
+ * Copyright 2001-2006 Ian Kent <raven@themaw.net>
|
|
|
*
|
|
|
* This file is part of the Linux kernel and is made available under
|
|
|
* the terms of the GNU General Public License, version 2, or at your
|
|
|
* option, any later version, incorporated herein by reference.
|
|
|
- *
|
|
|
- * ------------------------------------------------------------------------- */
|
|
|
+ */
|
|
|
|
|
|
#include <linux/capability.h>
|
|
|
#include <linux/errno.h>
|
|
@@ -23,16 +19,18 @@
|
|
|
|
|
|
#include "autofs_i.h"
|
|
|
|
|
|
-static int autofs4_dir_symlink(struct inode *,struct dentry *,const char *);
|
|
|
-static int autofs4_dir_unlink(struct inode *,struct dentry *);
|
|
|
-static int autofs4_dir_rmdir(struct inode *,struct dentry *);
|
|
|
-static int autofs4_dir_mkdir(struct inode *,struct dentry *,umode_t);
|
|
|
-static long autofs4_root_ioctl(struct file *,unsigned int,unsigned long);
|
|
|
+static int autofs4_dir_symlink(struct inode *, struct dentry *, const char *);
|
|
|
+static int autofs4_dir_unlink(struct inode *, struct dentry *);
|
|
|
+static int autofs4_dir_rmdir(struct inode *, struct dentry *);
|
|
|
+static int autofs4_dir_mkdir(struct inode *, struct dentry *, umode_t);
|
|
|
+static long autofs4_root_ioctl(struct file *, unsigned int, unsigned long);
|
|
|
#ifdef CONFIG_COMPAT
|
|
|
-static long autofs4_root_compat_ioctl(struct file *,unsigned int,unsigned long);
|
|
|
+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 *, unsigned int);
|
|
|
+static struct dentry *autofs4_lookup(struct inode *,
|
|
|
+ struct dentry *, unsigned int);
|
|
|
static struct vfsmount *autofs4_d_automount(struct path *);
|
|
|
static int autofs4_d_manage(struct dentry *, bool);
|
|
|
static void autofs4_dentry_release(struct dentry *);
|
|
@@ -74,7 +72,9 @@ const struct dentry_operations autofs4_dentry_operations = {
|
|
|
static void autofs4_add_active(struct dentry *dentry)
|
|
|
{
|
|
|
struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
|
|
|
- struct autofs_info *ino = autofs4_dentry_ino(dentry);
|
|
|
+ struct autofs_info *ino;
|
|
|
+
|
|
|
+ ino = autofs4_dentry_ino(dentry);
|
|
|
if (ino) {
|
|
|
spin_lock(&sbi->lookup_lock);
|
|
|
if (!ino->active_count) {
|
|
@@ -84,13 +84,14 @@ static void autofs4_add_active(struct dentry *dentry)
|
|
|
ino->active_count++;
|
|
|
spin_unlock(&sbi->lookup_lock);
|
|
|
}
|
|
|
- return;
|
|
|
}
|
|
|
|
|
|
static void autofs4_del_active(struct dentry *dentry)
|
|
|
{
|
|
|
struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
|
|
|
- struct autofs_info *ino = autofs4_dentry_ino(dentry);
|
|
|
+ struct autofs_info *ino;
|
|
|
+
|
|
|
+ ino = autofs4_dentry_ino(dentry);
|
|
|
if (ino) {
|
|
|
spin_lock(&sbi->lookup_lock);
|
|
|
ino->active_count--;
|
|
@@ -100,7 +101,6 @@ static void autofs4_del_active(struct dentry *dentry)
|
|
|
}
|
|
|
spin_unlock(&sbi->lookup_lock);
|
|
|
}
|
|
|
- return;
|
|
|
}
|
|
|
|
|
|
static int autofs4_dir_open(struct inode *inode, struct file *file)
|
|
@@ -320,7 +320,9 @@ static struct dentry *autofs4_mountpoint_changed(struct path *path)
|
|
|
if (autofs_type_indirect(sbi->type) && d_unhashed(dentry)) {
|
|
|
struct dentry *parent = dentry->d_parent;
|
|
|
struct autofs_info *ino;
|
|
|
- struct dentry *new = d_lookup(parent, &dentry->d_name);
|
|
|
+ struct dentry *new;
|
|
|
+
|
|
|
+ new = d_lookup(parent, &dentry->d_name);
|
|
|
if (!new)
|
|
|
return NULL;
|
|
|
ino = autofs4_dentry_ino(new);
|
|
@@ -455,6 +457,7 @@ static int autofs4_d_manage(struct dentry *dentry, bool rcu_walk)
|
|
|
* a mount-trap.
|
|
|
*/
|
|
|
struct inode *inode;
|
|
|
+
|
|
|
if (ino->flags & (AUTOFS_INF_EXPIRING | AUTOFS_INF_NO_RCU))
|
|
|
return 0;
|
|
|
if (d_mountpoint(dentry))
|
|
@@ -494,7 +497,8 @@ static int autofs4_d_manage(struct dentry *dentry, bool rcu_walk)
|
|
|
}
|
|
|
|
|
|
/* Lookups in the root directory */
|
|
|
-static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
|
|
|
+static struct dentry *autofs4_lookup(struct inode *dir,
|
|
|
+ struct dentry *dentry, unsigned int flags)
|
|
|
{
|
|
|
struct autofs_sb_info *sbi;
|
|
|
struct autofs_info *ino;
|
|
@@ -513,9 +517,9 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, u
|
|
|
autofs4_oz_mode(sbi));
|
|
|
|
|
|
active = autofs4_lookup_active(dentry);
|
|
|
- if (active) {
|
|
|
+ if (active)
|
|
|
return active;
|
|
|
- } else {
|
|
|
+ else {
|
|
|
/*
|
|
|
* A dentry that is not within the root can never trigger a
|
|
|
* mount operation, unless the directory already exists, so we
|
|
@@ -526,7 +530,8 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, u
|
|
|
return ERR_PTR(-ENOENT);
|
|
|
|
|
|
/* Mark entries in the root as mount triggers */
|
|
|
- if (autofs_type_indirect(sbi->type) && IS_ROOT(dentry->d_parent))
|
|
|
+ if (IS_ROOT(dentry->d_parent) &&
|
|
|
+ autofs_type_indirect(sbi->type))
|
|
|
__managed_dentry_set_managed(dentry);
|
|
|
|
|
|
ino = autofs4_new_ino(sbi);
|
|
@@ -664,7 +669,6 @@ static void autofs_set_leaf_automount_flags(struct dentry *dentry)
|
|
|
if (IS_ROOT(parent->d_parent))
|
|
|
return;
|
|
|
managed_dentry_clear_managed(parent);
|
|
|
- return;
|
|
|
}
|
|
|
|
|
|
static void autofs_clear_leaf_automount_flags(struct dentry *dentry)
|
|
@@ -687,7 +691,6 @@ static void autofs_clear_leaf_automount_flags(struct dentry *dentry)
|
|
|
if (d_child->next == &parent->d_subdirs &&
|
|
|
d_child->prev == &parent->d_subdirs)
|
|
|
managed_dentry_set_managed(parent);
|
|
|
- return;
|
|
|
}
|
|
|
|
|
|
static int autofs4_dir_rmdir(struct inode *dir, struct dentry *dentry)
|
|
@@ -728,7 +731,8 @@ static int autofs4_dir_rmdir(struct inode *dir, struct dentry *dentry)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int autofs4_dir_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
|
|
|
+static int autofs4_dir_mkdir(struct inode *dir,
|
|
|
+ struct dentry *dentry, umode_t mode)
|
|
|
{
|
|
|
struct autofs_sb_info *sbi = autofs4_sbi(dir->i_sb);
|
|
|
struct autofs_info *ino = autofs4_dentry_ino(dentry);
|
|
@@ -768,7 +772,7 @@ static int autofs4_dir_mkdir(struct inode *dir, struct dentry *dentry, umode_t m
|
|
|
/* Get/set timeout ioctl() operation */
|
|
|
#ifdef CONFIG_COMPAT
|
|
|
static inline int autofs4_compat_get_set_timeout(struct autofs_sb_info *sbi,
|
|
|
- compat_ulong_t __user *p)
|
|
|
+ compat_ulong_t __user *p)
|
|
|
{
|
|
|
int rv;
|
|
|
unsigned long ntimeout;
|
|
@@ -787,7 +791,7 @@ static inline int autofs4_compat_get_set_timeout(struct autofs_sb_info *sbi,
|
|
|
#endif
|
|
|
|
|
|
static inline int autofs4_get_set_timeout(struct autofs_sb_info *sbi,
|
|
|
- unsigned long __user *p)
|
|
|
+ unsigned long __user *p)
|
|
|
{
|
|
|
int rv;
|
|
|
unsigned long ntimeout;
|
|
@@ -805,13 +809,15 @@ static inline int autofs4_get_set_timeout(struct autofs_sb_info *sbi,
|
|
|
}
|
|
|
|
|
|
/* Return protocol version */
|
|
|
-static inline int autofs4_get_protover(struct autofs_sb_info *sbi, int __user *p)
|
|
|
+static inline int autofs4_get_protover(struct autofs_sb_info *sbi,
|
|
|
+ int __user *p)
|
|
|
{
|
|
|
return put_user(sbi->version, p);
|
|
|
}
|
|
|
|
|
|
/* Return protocol sub version */
|
|
|
-static inline int autofs4_get_protosubver(struct autofs_sb_info *sbi, int __user *p)
|
|
|
+static inline int autofs4_get_protosubver(struct autofs_sb_info *sbi,
|
|
|
+ int __user *p)
|
|
|
{
|
|
|
return put_user(sbi->sub_version, p);
|
|
|
}
|
|
@@ -834,9 +840,9 @@ static inline int autofs4_ask_umount(struct vfsmount *mnt, int __user *p)
|
|
|
}
|
|
|
|
|
|
/* Identify autofs4_dentries - this is so we can tell if there's
|
|
|
- an extra dentry refcount or not. We only hold a refcount on the
|
|
|
- dentry if its non-negative (ie, d_inode != NULL)
|
|
|
-*/
|
|
|
+ * an extra dentry refcount or not. We only hold a refcount on the
|
|
|
+ * dentry if its non-negative (ie, d_inode != NULL)
|
|
|
+ */
|
|
|
int is_autofs4_dentry(struct dentry *dentry)
|
|
|
{
|
|
|
return dentry && d_really_is_positive(dentry) &&
|
|
@@ -855,7 +861,7 @@ static int autofs4_root_ioctl_unlocked(struct inode *inode, struct file *filp,
|
|
|
void __user *p = (void __user *)arg;
|
|
|
|
|
|
DPRINTK("cmd = 0x%08x, arg = 0x%08lx, sbi = %p, pgrp = %u",
|
|
|
- cmd,arg,sbi,task_pgrp_nr(current));
|
|
|
+ cmd, arg, sbi, task_pgrp_nr(current));
|
|
|
|
|
|
if (_IOC_TYPE(cmd) != _IOC_TYPE(AUTOFS_IOC_FIRST) ||
|
|
|
_IOC_NR(cmd) - _IOC_NR(AUTOFS_IOC_FIRST) >= AUTOFS_IOC_COUNT)
|
|
@@ -864,11 +870,11 @@ static int autofs4_root_ioctl_unlocked(struct inode *inode, struct file *filp,
|
|
|
if (!autofs4_oz_mode(sbi) && !capable(CAP_SYS_ADMIN))
|
|
|
return -EPERM;
|
|
|
|
|
|
- switch(cmd) {
|
|
|
+ switch (cmd) {
|
|
|
case AUTOFS_IOC_READY: /* Wait queue: go ahead and retry */
|
|
|
- return autofs4_wait_release(sbi,(autofs_wqt_t)arg,0);
|
|
|
+ return autofs4_wait_release(sbi, (autofs_wqt_t) arg, 0);
|
|
|
case AUTOFS_IOC_FAIL: /* Wait queue: fail with ENOENT */
|
|
|
- return autofs4_wait_release(sbi,(autofs_wqt_t)arg,-ENOENT);
|
|
|
+ return autofs4_wait_release(sbi, (autofs_wqt_t) arg, -ENOENT);
|
|
|
case AUTOFS_IOC_CATATONIC: /* Enter catatonic mode (daemon shutdown) */
|
|
|
autofs4_catatonic_mode(sbi);
|
|
|
return 0;
|
|
@@ -888,10 +894,12 @@ static int autofs4_root_ioctl_unlocked(struct inode *inode, struct file *filp,
|
|
|
|
|
|
/* return a single thing to expire */
|
|
|
case AUTOFS_IOC_EXPIRE:
|
|
|
- return autofs4_expire_run(inode->i_sb,filp->f_path.mnt,sbi, p);
|
|
|
+ return autofs4_expire_run(inode->i_sb,
|
|
|
+ filp->f_path.mnt, sbi, p);
|
|
|
/* same as above, but can send multiple expires through pipe */
|
|
|
case AUTOFS_IOC_EXPIRE_MULTI:
|
|
|
- return autofs4_expire_multi(inode->i_sb,filp->f_path.mnt,sbi, p);
|
|
|
+ return autofs4_expire_multi(inode->i_sb,
|
|
|
+ filp->f_path.mnt, sbi, p);
|
|
|
|
|
|
default:
|
|
|
return -ENOSYS;
|
|
@@ -902,12 +910,13 @@ static long autofs4_root_ioctl(struct file *filp,
|
|
|
unsigned int cmd, unsigned long arg)
|
|
|
{
|
|
|
struct inode *inode = file_inode(filp);
|
|
|
+
|
|
|
return autofs4_root_ioctl_unlocked(inode, filp, cmd, arg);
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_COMPAT
|
|
|
static long autofs4_root_compat_ioctl(struct file *filp,
|
|
|
- unsigned int cmd, unsigned long arg)
|
|
|
+ unsigned int cmd, unsigned long arg)
|
|
|
{
|
|
|
struct inode *inode = file_inode(filp);
|
|
|
int ret;
|
|
@@ -916,7 +925,7 @@ static long autofs4_root_compat_ioctl(struct file *filp,
|
|
|
ret = autofs4_root_ioctl_unlocked(inode, filp, cmd, arg);
|
|
|
else
|
|
|
ret = autofs4_root_ioctl_unlocked(inode, filp, cmd,
|
|
|
- (unsigned long)compat_ptr(arg));
|
|
|
+ (unsigned long) compat_ptr(arg));
|
|
|
|
|
|
return ret;
|
|
|
}
|