Blame patches/autofs4-2.6.28-v5-update-20090903.patch

Packit Service a4b2a9
--- linux-2.6.28.orig/fs/autofs4/autofs_i.h
Packit Service a4b2a9
+++ linux-2.6.28/fs/autofs4/autofs_i.h
Packit Service a4b2a9
@@ -25,8 +25,6 @@
Packit Service a4b2a9
 #define AUTOFS_DEV_IOCTL_IOC_FIRST	(AUTOFS_DEV_IOCTL_VERSION)
Packit Service a4b2a9
 #define AUTOFS_DEV_IOCTL_IOC_COUNT	(AUTOFS_IOC_COUNT - 11)
Packit Service a4b2a9
 
Packit Service a4b2a9
-#define AUTOFS_TYPE_TRIGGER	(AUTOFS_TYPE_DIRECT|AUTOFS_TYPE_OFFSET)
Packit Service a4b2a9
-
Packit Service a4b2a9
 #include <linux/kernel.h>
Packit Service a4b2a9
 #include <linux/slab.h>
Packit Service a4b2a9
 #include <linux/time.h>
Packit Service a4b2a9
@@ -188,6 +186,8 @@ int autofs4_expire_wait(struct dentry *d
Packit Service a4b2a9
 int autofs4_expire_run(struct super_block *, struct vfsmount *,
Packit Service a4b2a9
 			struct autofs_sb_info *,
Packit Service a4b2a9
 			struct autofs_packet_expire __user *);
Packit Service a4b2a9
+int autofs4_do_expire_multi(struct super_block *sb, struct vfsmount *mnt,
Packit Service a4b2a9
+			    struct autofs_sb_info *sbi, int when);
Packit Service a4b2a9
 int autofs4_expire_multi(struct super_block *, struct vfsmount *,
Packit Service a4b2a9
 			struct autofs_sb_info *, int __user *);
Packit Service a4b2a9
 struct dentry *autofs4_expire_direct(struct super_block *sb,
Packit Service a4b2a9
--- linux-2.6.28.orig/fs/autofs4/dev-ioctl.c
Packit Service a4b2a9
+++ linux-2.6.28/fs/autofs4/dev-ioctl.c
Packit Service a4b2a9
@@ -124,7 +124,7 @@ static inline void free_dev_ioctl(struct
Packit Service a4b2a9
 
Packit Service a4b2a9
 /*
Packit Service a4b2a9
  * Check sanity of parameter control fields and if a path is present
Packit Service a4b2a9
- * check that it has a "/" and is terminated.
Packit Service a4b2a9
+ * check that it is terminated and contains at least one "/".
Packit Service a4b2a9
  */
Packit Service a4b2a9
 static int validate_dev_ioctl(int cmd, struct autofs_dev_ioctl *param)
Packit Service a4b2a9
 {
Packit Service a4b2a9
@@ -138,15 +138,16 @@ static int validate_dev_ioctl(int cmd, s
Packit Service a4b2a9
 	}
Packit Service a4b2a9
 
Packit Service a4b2a9
 	if (param->size > sizeof(*param)) {
Packit Service a4b2a9
-		err = check_name(param->path);
Packit Service a4b2a9
+		err = invalid_str(param->path,
Packit Service a4b2a9
+				 (void *) ((size_t) param + param->size));
Packit Service a4b2a9
 		if (err) {
Packit Service a4b2a9
-			AUTOFS_WARN("invalid path supplied for cmd(0x%08x)",
Packit Service a4b2a9
-				    cmd);
Packit Service a4b2a9
+			AUTOFS_WARN(
Packit Service a4b2a9
+			  "path string terminator missing for cmd(0x%08x)",
Packit Service a4b2a9
+			  cmd);
Packit Service a4b2a9
 			goto out;
Packit Service a4b2a9
 		}
Packit Service a4b2a9
 
Packit Service a4b2a9
-		err = invalid_str(param->path,
Packit Service a4b2a9
-				 (void *) ((size_t) param + param->size));
Packit Service a4b2a9
+		err = check_name(param->path);
Packit Service a4b2a9
 		if (err) {
Packit Service a4b2a9
 			AUTOFS_WARN("invalid path supplied for cmd(0x%08x)",
Packit Service a4b2a9
 				    cmd);
Packit Service a4b2a9
@@ -180,7 +181,7 @@ static int autofs_dev_ioctl_protover(str
Packit Service a4b2a9
 				     struct autofs_sb_info *sbi,
Packit Service a4b2a9
 				     struct autofs_dev_ioctl *param)
Packit Service a4b2a9
 {
Packit Service a4b2a9
-	param->arg1 = sbi->version;
Packit Service a4b2a9
+	param->protover.version = sbi->version;
Packit Service a4b2a9
 	return 0;
Packit Service a4b2a9
 }
Packit Service a4b2a9
 
Packit Service a4b2a9
@@ -189,7 +190,7 @@ static int autofs_dev_ioctl_protosubver(
Packit Service a4b2a9
 					struct autofs_sb_info *sbi,
Packit Service a4b2a9
 					struct autofs_dev_ioctl *param)
Packit Service a4b2a9
 {
Packit Service a4b2a9
-	param->arg1 = sbi->sub_version;
Packit Service a4b2a9
+	param->protosubver.sub_version = sbi->sub_version;
Packit Service a4b2a9
 	return 0;
Packit Service a4b2a9
 }
Packit Service a4b2a9
 
Packit Service a4b2a9
@@ -334,13 +335,13 @@ static int autofs_dev_ioctl_openmount(st
Packit Service a4b2a9
 	int err, fd;
Packit Service a4b2a9
 
Packit Service a4b2a9
 	/* param->path has already been checked */
Packit Service a4b2a9
-	if (!param->arg1)
Packit Service a4b2a9
+	if (!param->openmount.devid)
Packit Service a4b2a9
 		return -EINVAL;
Packit Service a4b2a9
 
Packit Service a4b2a9
 	param->ioctlfd = -1;
Packit Service a4b2a9
 
Packit Service a4b2a9
 	path = param->path;
Packit Service a4b2a9
-	devid = param->arg1;
Packit Service a4b2a9
+	devid = param->openmount.devid;
Packit Service a4b2a9
 
Packit Service a4b2a9
 	err = 0;
Packit Service a4b2a9
 	fd = autofs_dev_ioctl_open_mountpoint(path, devid);
Packit Service a4b2a9
@@ -372,7 +373,7 @@ static int autofs_dev_ioctl_ready(struct
Packit Service a4b2a9
 {
Packit Service a4b2a9
 	autofs_wqt_t token;
Packit Service a4b2a9
 
Packit Service a4b2a9
-	token = (autofs_wqt_t) param->arg1;
Packit Service a4b2a9
+	token = (autofs_wqt_t) param->ready.token;
Packit Service a4b2a9
 	return autofs4_wait_release(sbi, token, 0);
Packit Service a4b2a9
 }
Packit Service a4b2a9
 
Packit Service a4b2a9
@@ -387,8 +388,8 @@ static int autofs_dev_ioctl_fail(struct 
Packit Service a4b2a9
 	autofs_wqt_t token;
Packit Service a4b2a9
 	int status;
Packit Service a4b2a9
 
Packit Service a4b2a9
-	token = (autofs_wqt_t) param->arg1;
Packit Service a4b2a9
-	status = param->arg2 ? param->arg2 : -ENOENT;
Packit Service a4b2a9
+	token = (autofs_wqt_t) param->fail.token;
Packit Service a4b2a9
+	status = param->fail.status ? param->fail.status : -ENOENT;
Packit Service a4b2a9
 	return autofs4_wait_release(sbi, token, status);
Packit Service a4b2a9
 }
Packit Service a4b2a9
 
Packit Service a4b2a9
@@ -411,10 +412,10 @@ static int autofs_dev_ioctl_setpipefd(st
Packit Service a4b2a9
 	int pipefd;
Packit Service a4b2a9
 	int err = 0;
Packit Service a4b2a9
 
Packit Service a4b2a9
-	if (param->arg1 == -1)
Packit Service a4b2a9
+	if (param->setpipefd.pipefd == -1)
Packit Service a4b2a9
 		return -EINVAL;
Packit Service a4b2a9
 
Packit Service a4b2a9
-	pipefd = param->arg1;
Packit Service a4b2a9
+	pipefd = param->setpipefd.pipefd;
Packit Service a4b2a9
 
Packit Service a4b2a9
 	mutex_lock(&sbi->wq_mutex);
Packit Service a4b2a9
 	if (!sbi->catatonic) {
Packit Service a4b2a9
@@ -456,8 +457,8 @@ static int autofs_dev_ioctl_timeout(stru
Packit Service a4b2a9
 {
Packit Service a4b2a9
 	unsigned long timeout;
Packit Service a4b2a9
 
Packit Service a4b2a9
-	timeout = param->arg1;
Packit Service a4b2a9
-	param->arg1 = sbi->exp_timeout / HZ;
Packit Service a4b2a9
+	timeout = param->timeout.timeout;
Packit Service a4b2a9
+	param->timeout.timeout = sbi->exp_timeout / HZ;
Packit Service a4b2a9
 	sbi->exp_timeout = timeout * HZ;
Packit Service a4b2a9
 	return 0;
Packit Service a4b2a9
 }
Packit Service a4b2a9
@@ -488,7 +489,7 @@ static int autofs_dev_ioctl_requester(st
Packit Service a4b2a9
 	path = param->path;
Packit Service a4b2a9
 	devid = sbi->sb->s_dev;
Packit Service a4b2a9
 
Packit Service a4b2a9
-	param->arg1 = param->arg2 = -1;
Packit Service a4b2a9
+	param->requester.uid = param->requester.gid = -1;
Packit Service a4b2a9
 
Packit Service a4b2a9
 	/* Get nameidata of the parent directory */
Packit Service a4b2a9
 	err = path_lookup(path, LOOKUP_PARENT, &nd);
Packit Service a4b2a9
@@ -504,8 +505,8 @@ static int autofs_dev_ioctl_requester(st
Packit Service a4b2a9
 		err = 0;
Packit Service a4b2a9
 		autofs4_expire_wait(nd.path.dentry);
Packit Service a4b2a9
 		spin_lock(&sbi->fs_lock);
Packit Service a4b2a9
-		param->arg1 = ino->uid;
Packit Service a4b2a9
-		param->arg2 = ino->gid;
Packit Service a4b2a9
+		param->requester.uid = ino->uid;
Packit Service a4b2a9
+		param->requester.gid = ino->gid;
Packit Service a4b2a9
 		spin_unlock(&sbi->fs_lock);
Packit Service a4b2a9
 	}
Packit Service a4b2a9
 
Packit Service a4b2a9
@@ -523,40 +524,13 @@ static int autofs_dev_ioctl_expire(struc
Packit Service a4b2a9
 				   struct autofs_sb_info *sbi,
Packit Service a4b2a9
 				   struct autofs_dev_ioctl *param)
Packit Service a4b2a9
 {
Packit Service a4b2a9
-	struct dentry *dentry;
Packit Service a4b2a9
 	struct vfsmount *mnt;
Packit Service a4b2a9
-	int err = -EAGAIN;
Packit Service a4b2a9
 	int how;
Packit Service a4b2a9
 
Packit Service a4b2a9
-	how = param->arg1;
Packit Service a4b2a9
+	how = param->expire.how;
Packit Service a4b2a9
 	mnt = fp->f_path.mnt;
Packit Service a4b2a9
 
Packit Service a4b2a9
-	if (sbi->type & AUTOFS_TYPE_TRIGGER)
Packit Service a4b2a9
-		dentry = autofs4_expire_direct(sbi->sb, mnt, sbi, how);
Packit Service a4b2a9
-	else
Packit Service a4b2a9
-		dentry = autofs4_expire_indirect(sbi->sb, mnt, sbi, how);
Packit Service a4b2a9
-
Packit Service a4b2a9
-	if (dentry) {
Packit Service a4b2a9
-		struct autofs_info *ino = autofs4_dentry_ino(dentry);
Packit Service a4b2a9
-
Packit Service a4b2a9
-		/*
Packit Service a4b2a9
-		 * This is synchronous because it makes the daemon a
Packit Service a4b2a9
-		 * little easier
Packit Service a4b2a9
-		*/
Packit Service a4b2a9
-		err = autofs4_wait(sbi, dentry, NFY_EXPIRE);
Packit Service a4b2a9
-
Packit Service a4b2a9
-		spin_lock(&sbi->fs_lock);
Packit Service a4b2a9
-		if (ino->flags & AUTOFS_INF_MOUNTPOINT) {
Packit Service a4b2a9
-			ino->flags &= ~AUTOFS_INF_MOUNTPOINT;
Packit Service a4b2a9
-			sbi->sb->s_root->d_mounted++;
Packit Service a4b2a9
-		}
Packit Service a4b2a9
-		ino->flags &= ~AUTOFS_INF_EXPIRING;
Packit Service a4b2a9
-		complete_all(&ino->expire_complete);
Packit Service a4b2a9
-		spin_unlock(&sbi->fs_lock);
Packit Service a4b2a9
-		dput(dentry);
Packit Service a4b2a9
-	}
Packit Service a4b2a9
-
Packit Service a4b2a9
-	return err;
Packit Service a4b2a9
+	return autofs4_do_expire_multi(sbi->sb, mnt, sbi, how);
Packit Service a4b2a9
 }
Packit Service a4b2a9
 
Packit Service a4b2a9
 /* Check if autofs mount point is in use */
Packit Service a4b2a9
@@ -564,9 +538,9 @@ static int autofs_dev_ioctl_askumount(st
Packit Service a4b2a9
 				      struct autofs_sb_info *sbi,
Packit Service a4b2a9
 				      struct autofs_dev_ioctl *param)
Packit Service a4b2a9
 {
Packit Service a4b2a9
-	param->arg1 = 0;
Packit Service a4b2a9
+	param->askumount.may_umount = 0;
Packit Service a4b2a9
 	if (may_umount(fp->f_path.mnt))
Packit Service a4b2a9
-		param->arg1 = 1;
Packit Service a4b2a9
+		param->askumount.may_umount = 1;
Packit Service a4b2a9
 	return 0;
Packit Service a4b2a9
 }
Packit Service a4b2a9
 
Packit Service a4b2a9
@@ -599,6 +573,7 @@ static int autofs_dev_ioctl_ismountpoint
Packit Service a4b2a9
 	struct nameidata nd;
Packit Service a4b2a9
 	const char *path;
Packit Service a4b2a9
 	unsigned int type;
Packit Service a4b2a9
+	unsigned int devid, magic;
Packit Service a4b2a9
 	int err = -ENOENT;
Packit Service a4b2a9
 
Packit Service a4b2a9
 	if (param->size <= sizeof(*param)) {
Packit Service a4b2a9
@@ -607,13 +582,13 @@ static int autofs_dev_ioctl_ismountpoint
Packit Service a4b2a9
 	}
Packit Service a4b2a9
 
Packit Service a4b2a9
 	path = param->path;
Packit Service a4b2a9
-	type = param->arg1;
Packit Service a4b2a9
+	type = param->ismountpoint.in.type;
Packit Service a4b2a9
 
Packit Service a4b2a9
-	param->arg1 = 0;
Packit Service a4b2a9
-	param->arg2 = 0;
Packit Service a4b2a9
+	param->ismountpoint.out.devid = devid = 0;
Packit Service a4b2a9
+	param->ismountpoint.out.magic = magic = 0;
Packit Service a4b2a9
 
Packit Service a4b2a9
 	if (!fp || param->ioctlfd == -1) {
Packit Service a4b2a9
-		if (type == AUTOFS_TYPE_ANY) {
Packit Service a4b2a9
+		if (autofs_type_any(type)) {
Packit Service a4b2a9
 			struct super_block *sb;
Packit Service a4b2a9
 
Packit Service a4b2a9
 			err = path_lookup(path, LOOKUP_FOLLOW, &nd);
Packit Service a4b2a9
@@ -621,7 +596,7 @@ static int autofs_dev_ioctl_ismountpoint
Packit Service a4b2a9
 				goto out;
Packit Service a4b2a9
 
Packit Service a4b2a9
 			sb = nd.path.dentry->d_sb;
Packit Service a4b2a9
-			param->arg1 = new_encode_dev(sb->s_dev);
Packit Service a4b2a9
+			devid = new_encode_dev(sb->s_dev);
Packit Service a4b2a9
 		} else {
Packit Service a4b2a9
 			struct autofs_info *ino;
Packit Service a4b2a9
 
Packit Service a4b2a9
@@ -634,38 +609,41 @@ static int autofs_dev_ioctl_ismountpoint
Packit Service a4b2a9
 				goto out_release;
Packit Service a4b2a9
 
Packit Service a4b2a9
 			ino = autofs4_dentry_ino(nd.path.dentry);
Packit Service a4b2a9
-			param->arg1 = autofs4_get_dev(ino->sbi);
Packit Service a4b2a9
+			devid = autofs4_get_dev(ino->sbi);
Packit Service a4b2a9
 		}
Packit Service a4b2a9
 
Packit Service a4b2a9
 		err = 0;
Packit Service a4b2a9
 		if (nd.path.dentry->d_inode &&
Packit Service a4b2a9
 		    nd.path.mnt->mnt_root == nd.path.dentry) {
Packit Service a4b2a9
 			err = 1;
Packit Service a4b2a9
-			param->arg2 = nd.path.dentry->d_inode->i_sb->s_magic;
Packit Service a4b2a9
+			magic = nd.path.dentry->d_inode->i_sb->s_magic;
Packit Service a4b2a9
 		}
Packit Service a4b2a9
 	} else {
Packit Service a4b2a9
-		dev_t devid = new_encode_dev(sbi->sb->s_dev);
Packit Service a4b2a9
+		dev_t dev = autofs4_get_dev(sbi);
Packit Service a4b2a9
 
Packit Service a4b2a9
 		err = path_lookup(path, LOOKUP_PARENT, &nd);
Packit Service a4b2a9
 		if (err)
Packit Service a4b2a9
 			goto out;
Packit Service a4b2a9
 
Packit Service a4b2a9
-		err = autofs_dev_ioctl_find_super(&nd, devid);
Packit Service a4b2a9
+		err = autofs_dev_ioctl_find_super(&nd, dev);
Packit Service a4b2a9
 		if (err)
Packit Service a4b2a9
 			goto out_release;
Packit Service a4b2a9
 
Packit Service a4b2a9
-		param->arg1 = autofs4_get_dev(sbi);
Packit Service a4b2a9
+		devid = dev;
Packit Service a4b2a9
 
Packit Service a4b2a9
 		err = have_submounts(nd.path.dentry);
Packit Service a4b2a9
 
Packit Service a4b2a9
 		if (nd.path.mnt->mnt_mountpoint != nd.path.mnt->mnt_root) {
Packit Service a4b2a9
 			if (follow_down(&nd.path.mnt, &nd.path.dentry)) {
Packit Service a4b2a9
 				struct inode *inode = nd.path.dentry->d_inode;
Packit Service a4b2a9
-				param->arg2 = inode->i_sb->s_magic;
Packit Service a4b2a9
+				magic = inode->i_sb->s_magic;
Packit Service a4b2a9
 			}
Packit Service a4b2a9
 		}
Packit Service a4b2a9
 	}
Packit Service a4b2a9
 
Packit Service a4b2a9
+	param->ismountpoint.out.devid = devid;
Packit Service a4b2a9
+	param->ismountpoint.out.magic = magic;
Packit Service a4b2a9
+
Packit Service a4b2a9
 out_release:
Packit Service a4b2a9
 	path_put(&nd.path);
Packit Service a4b2a9
 out:
Packit Service a4b2a9
--- linux-2.6.28.orig/fs/autofs4/expire.c
Packit Service a4b2a9
+++ linux-2.6.28/fs/autofs4/expire.c
Packit Service a4b2a9
@@ -63,15 +63,17 @@ static int autofs4_mount_busy(struct vfs
Packit Service a4b2a9
 		struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
Packit Service a4b2a9
 
Packit Service a4b2a9
 		/* This is an autofs submount, we can't expire it */
Packit Service a4b2a9
-		if (sbi->type == AUTOFS_TYPE_INDIRECT)
Packit Service a4b2a9
+		if (autofs_type_indirect(sbi->type))
Packit Service a4b2a9
 			goto done;
Packit Service a4b2a9
 
Packit Service a4b2a9
 		/*
Packit Service a4b2a9
 		 * Otherwise it's an offset mount and we need to check
Packit Service a4b2a9
 		 * if we can umount its mount, if there is one.
Packit Service a4b2a9
 		 */
Packit Service a4b2a9
-		if (!d_mountpoint(dentry))
Packit Service a4b2a9
+		if (!d_mountpoint(dentry)) {
Packit Service a4b2a9
+			status = 0;
Packit Service a4b2a9
 			goto done;
Packit Service a4b2a9
+		}
Packit Service a4b2a9
 	}
Packit Service a4b2a9
 
Packit Service a4b2a9
 	/* Update the expiry counter if fs is busy */
Packit Service a4b2a9
@@ -478,22 +480,16 @@ int autofs4_expire_run(struct super_bloc
Packit Service a4b2a9
 	return ret;
Packit Service a4b2a9
 }
Packit Service a4b2a9
 
Packit Service a4b2a9
-/* Call repeatedly until it returns -EAGAIN, meaning there's nothing
Packit Service a4b2a9
-   more to be done */
Packit Service a4b2a9
-int autofs4_expire_multi(struct super_block *sb, struct vfsmount *mnt,
Packit Service a4b2a9
-			struct autofs_sb_info *sbi, int __user *arg)
Packit Service a4b2a9
+int autofs4_do_expire_multi(struct super_block *sb, struct vfsmount *mnt,
Packit Service a4b2a9
+			    struct autofs_sb_info *sbi, int when)
Packit Service a4b2a9
 {
Packit Service a4b2a9
 	struct dentry *dentry;
Packit Service a4b2a9
 	int ret = -EAGAIN;
Packit Service a4b2a9
-	int do_now = 0;
Packit Service a4b2a9
 
Packit Service a4b2a9
-	if (arg && get_user(do_now, arg))
Packit Service a4b2a9
-		return -EFAULT;
Packit Service a4b2a9
-
Packit Service a4b2a9
-	if (sbi->type & AUTOFS_TYPE_TRIGGER)
Packit Service a4b2a9
-		dentry = autofs4_expire_direct(sb, mnt, sbi, do_now);
Packit Service a4b2a9
+	if (autofs_type_trigger(sbi->type))
Packit Service a4b2a9
+		dentry = autofs4_expire_direct(sb, mnt, sbi, when);
Packit Service a4b2a9
 	else
Packit Service a4b2a9
-		dentry = autofs4_expire_indirect(sb, mnt, sbi, do_now);
Packit Service a4b2a9
+		dentry = autofs4_expire_indirect(sb, mnt, sbi, when);
Packit Service a4b2a9
 
Packit Service a4b2a9
 	if (dentry) {
Packit Service a4b2a9
 		struct autofs_info *ino = autofs4_dentry_ino(dentry);
Packit Service a4b2a9
@@ -516,3 +512,16 @@ int autofs4_expire_multi(struct super_bl
Packit Service a4b2a9
 	return ret;
Packit Service a4b2a9
 }
Packit Service a4b2a9
 
Packit Service a4b2a9
+/* Call repeatedly until it returns -EAGAIN, meaning there's nothing
Packit Service a4b2a9
+   more to be done */
Packit Service a4b2a9
+int autofs4_expire_multi(struct super_block *sb, struct vfsmount *mnt,
Packit Service a4b2a9
+			struct autofs_sb_info *sbi, int __user *arg)
Packit Service a4b2a9
+{
Packit Service a4b2a9
+	int do_now = 0;
Packit Service a4b2a9
+
Packit Service a4b2a9
+	if (arg && get_user(do_now, arg))
Packit Service a4b2a9
+		return -EFAULT;
Packit Service a4b2a9
+
Packit Service a4b2a9
+	return autofs4_do_expire_multi(sb, mnt, sbi, do_now);
Packit Service a4b2a9
+}
Packit Service a4b2a9
+
Packit Service a4b2a9
--- linux-2.6.28.orig/fs/autofs4/inode.c
Packit Service a4b2a9
+++ linux-2.6.28/fs/autofs4/inode.c
Packit Service a4b2a9
@@ -197,9 +197,9 @@ static int autofs4_show_options(struct s
Packit Service a4b2a9
 	seq_printf(m, ",minproto=%d", sbi->min_proto);
Packit Service a4b2a9
 	seq_printf(m, ",maxproto=%d", sbi->max_proto);
Packit Service a4b2a9
 
Packit Service a4b2a9
-	if (sbi->type & AUTOFS_TYPE_OFFSET)
Packit Service a4b2a9
+	if (autofs_type_offset(sbi->type))
Packit Service a4b2a9
 		seq_printf(m, ",offset");
Packit Service a4b2a9
-	else if (sbi->type & AUTOFS_TYPE_DIRECT)
Packit Service a4b2a9
+	else if (autofs_type_direct(sbi->type))
Packit Service a4b2a9
 		seq_printf(m, ",direct");
Packit Service a4b2a9
 	else
Packit Service a4b2a9
 		seq_printf(m, ",indirect");
Packit Service a4b2a9
@@ -284,13 +284,13 @@ static int parse_options(char *options, 
Packit Service a4b2a9
 			*maxproto = option;
Packit Service a4b2a9
 			break;
Packit Service a4b2a9
 		case Opt_indirect:
Packit Service a4b2a9
-			*type = AUTOFS_TYPE_INDIRECT;
Packit Service a4b2a9
+			set_autofs_type_indirect(type);
Packit Service a4b2a9
 			break;
Packit Service a4b2a9
 		case Opt_direct:
Packit Service a4b2a9
-			*type = AUTOFS_TYPE_DIRECT;
Packit Service a4b2a9
+			set_autofs_type_direct(type);
Packit Service a4b2a9
 			break;
Packit Service a4b2a9
 		case Opt_offset:
Packit Service a4b2a9
-			*type = AUTOFS_TYPE_OFFSET;
Packit Service a4b2a9
+			set_autofs_type_offset(type);
Packit Service a4b2a9
 			break;
Packit Service a4b2a9
 		default:
Packit Service a4b2a9
 			return 1;
Packit Service a4b2a9
@@ -338,7 +338,7 @@ int autofs4_fill_super(struct super_bloc
Packit Service a4b2a9
 	sbi->sb = s;
Packit Service a4b2a9
 	sbi->version = 0;
Packit Service a4b2a9
 	sbi->sub_version = 0;
Packit Service a4b2a9
-	sbi->type = AUTOFS_TYPE_INDIRECT;
Packit Service a4b2a9
+	set_autofs_type_indirect(&sbi->type);
Packit Service a4b2a9
 	sbi->min_proto = 0;
Packit Service a4b2a9
 	sbi->max_proto = 0;
Packit Service a4b2a9
 	mutex_init(&sbi->wq_mutex);
Packit Service a4b2a9
@@ -380,7 +380,7 @@ int autofs4_fill_super(struct super_bloc
Packit Service a4b2a9
 	}
Packit Service a4b2a9
 
Packit Service a4b2a9
 	root_inode->i_fop = &autofs4_root_operations;
Packit Service a4b2a9
-	root_inode->i_op = sbi->type & AUTOFS_TYPE_TRIGGER ?
Packit Service a4b2a9
+	root_inode->i_op = autofs_type_trigger(sbi->type) ?
Packit Service a4b2a9
 			&autofs4_direct_root_inode_operations :
Packit Service a4b2a9
 			&autofs4_indirect_root_inode_operations;
Packit Service a4b2a9
 
Packit Service a4b2a9
--- linux-2.6.28.orig/fs/autofs4/waitq.c
Packit Service a4b2a9
+++ linux-2.6.28/fs/autofs4/waitq.c
Packit Service a4b2a9
@@ -297,20 +297,14 @@ static int validate_request(struct autof
Packit Service a4b2a9
 	 */
Packit Service a4b2a9
 	if (notify == NFY_MOUNT) {
Packit Service a4b2a9
 		/*
Packit Service a4b2a9
-		 * If the dentry isn't hashed just go ahead and try the
Packit Service a4b2a9
-		 * mount again with a new wait (not much else we can do).
Packit Service a4b2a9
-		*/
Packit Service a4b2a9
-		if (!d_unhashed(dentry)) {
Packit Service a4b2a9
-			/*
Packit Service a4b2a9
-			 * But if the dentry is hashed, that means that we
Packit Service a4b2a9
-			 * got here through the revalidate path.  Thus, we
Packit Service a4b2a9
-			 * need to check if the dentry has been mounted
Packit Service a4b2a9
-			 * while we waited on the wq_mutex. If it has,
Packit Service a4b2a9
-			 * simply return success.
Packit Service a4b2a9
-			 */
Packit Service a4b2a9
-			if (d_mountpoint(dentry))
Packit Service a4b2a9
-				return 0;
Packit Service a4b2a9
-		}
Packit Service a4b2a9
+		 * If the dentry was successfully mounted while we slept
Packit Service a4b2a9
+		 * on the wait queue mutex we can return success. If it
Packit Service a4b2a9
+		 * isn't mounted (doesn't have submounts for the case of
Packit Service a4b2a9
+		 * a multi-mount with no mount at it's base) we can
Packit Service a4b2a9
+		 * continue on and create a new request.
Packit Service a4b2a9
+		 */
Packit Service a4b2a9
+		if (have_submounts(dentry))
Packit Service a4b2a9
+			return 0;
Packit Service a4b2a9
 	}
Packit Service a4b2a9
 
Packit Service a4b2a9
 	return 1;
Packit Service a4b2a9
@@ -337,7 +331,7 @@ int autofs4_wait(struct autofs_sb_info *
Packit Service a4b2a9
 		 * is very similar for indirect mounts except only dentrys
Packit Service a4b2a9
 		 * in the root of the autofs file system may be negative.
Packit Service a4b2a9
 		 */
Packit Service a4b2a9
-		if (sbi->type & AUTOFS_TYPE_TRIGGER)
Packit Service a4b2a9
+		if (autofs_type_trigger(sbi->type))
Packit Service a4b2a9
 			return -ENOENT;
Packit Service a4b2a9
 		else if (!IS_ROOT(dentry->d_parent))
Packit Service a4b2a9
 			return -ENOENT;
Packit Service a4b2a9
@@ -348,7 +342,7 @@ int autofs4_wait(struct autofs_sb_info *
Packit Service a4b2a9
 		return -ENOMEM;
Packit Service a4b2a9
 
Packit Service a4b2a9
 	/* If this is a direct mount request create a dummy name */
Packit Service a4b2a9
-	if (IS_ROOT(dentry) && sbi->type & AUTOFS_TYPE_TRIGGER)
Packit Service a4b2a9
+	if (IS_ROOT(dentry) && autofs_type_trigger(sbi->type))
Packit Service a4b2a9
 		qstr.len = sprintf(name, "%p", dentry);
Packit Service a4b2a9
 	else {
Packit Service a4b2a9
 		qstr.len = autofs4_getpath(sbi, dentry, &name);
Packit Service a4b2a9
@@ -406,11 +400,11 @@ int autofs4_wait(struct autofs_sb_info *
Packit Service a4b2a9
 				type = autofs_ptype_expire_multi;
Packit Service a4b2a9
 		} else {
Packit Service a4b2a9
 			if (notify == NFY_MOUNT)
Packit Service a4b2a9
-				type = (sbi->type & AUTOFS_TYPE_TRIGGER) ?
Packit Service a4b2a9
+				type = autofs_type_trigger(sbi->type) ?
Packit Service a4b2a9
 					autofs_ptype_missing_direct :
Packit Service a4b2a9
 					 autofs_ptype_missing_indirect;
Packit Service a4b2a9
 			else
Packit Service a4b2a9
-				type = (sbi->type & AUTOFS_TYPE_TRIGGER) ?
Packit Service a4b2a9
+				type = autofs_type_trigger(sbi->type) ?
Packit Service a4b2a9
 					autofs_ptype_expire_direct :
Packit Service a4b2a9
 					autofs_ptype_expire_indirect;
Packit Service a4b2a9
 		}
Packit Service a4b2a9
--- linux-2.6.28.orig/include/linux/auto_fs4.h
Packit Service a4b2a9
+++ linux-2.6.28/include/linux/auto_fs4.h
Packit Service a4b2a9
@@ -29,10 +29,64 @@
Packit Service a4b2a9
 #define AUTOFS_EXP_IMMEDIATE		1
Packit Service a4b2a9
 #define AUTOFS_EXP_LEAVES		2
Packit Service a4b2a9
 
Packit Service a4b2a9
-#define AUTOFS_TYPE_ANY			0x0000
Packit Service a4b2a9
-#define AUTOFS_TYPE_INDIRECT		0x0001
Packit Service a4b2a9
-#define AUTOFS_TYPE_DIRECT		0x0002
Packit Service a4b2a9
-#define AUTOFS_TYPE_OFFSET		0x0004
Packit Service a4b2a9
+#define AUTOFS_TYPE_ANY			0U
Packit Service a4b2a9
+#define AUTOFS_TYPE_INDIRECT		1U
Packit Service a4b2a9
+#define AUTOFS_TYPE_DIRECT		2U
Packit Service a4b2a9
+#define AUTOFS_TYPE_OFFSET		4U
Packit Service a4b2a9
+
Packit Service a4b2a9
+static inline void set_autofs_type_indirect(unsigned int *type)
Packit Service a4b2a9
+{
Packit Service a4b2a9
+	*type = AUTOFS_TYPE_INDIRECT;
Packit Service a4b2a9
+	return;
Packit Service a4b2a9
+}
Packit Service a4b2a9
+
Packit Service a4b2a9
+static inline unsigned int autofs_type_indirect(unsigned int type)
Packit Service a4b2a9
+{
Packit Service a4b2a9
+	return (type == AUTOFS_TYPE_INDIRECT);
Packit Service a4b2a9
+}
Packit Service a4b2a9
+
Packit Service a4b2a9
+static inline void set_autofs_type_direct(unsigned int *type)
Packit Service a4b2a9
+{
Packit Service a4b2a9
+	*type = AUTOFS_TYPE_DIRECT;
Packit Service a4b2a9
+	return;
Packit Service a4b2a9
+}
Packit Service a4b2a9
+
Packit Service a4b2a9
+static inline unsigned int autofs_type_direct(unsigned int type)
Packit Service a4b2a9
+{
Packit Service a4b2a9
+	return (type == AUTOFS_TYPE_DIRECT);
Packit Service a4b2a9
+}
Packit Service a4b2a9
+
Packit Service a4b2a9
+static inline void set_autofs_type_offset(unsigned int *type)
Packit Service a4b2a9
+{
Packit Service a4b2a9
+	*type = AUTOFS_TYPE_OFFSET;
Packit Service a4b2a9
+	return;
Packit Service a4b2a9
+}
Packit Service a4b2a9
+
Packit Service a4b2a9
+static inline unsigned int autofs_type_offset(unsigned int type)
Packit Service a4b2a9
+{
Packit Service a4b2a9
+	return (type == AUTOFS_TYPE_OFFSET);
Packit Service a4b2a9
+}
Packit Service a4b2a9
+
Packit Service a4b2a9
+static inline unsigned int autofs_type_trigger(unsigned int type)
Packit Service a4b2a9
+{
Packit Service a4b2a9
+	return (type == AUTOFS_TYPE_DIRECT || type == AUTOFS_TYPE_OFFSET);
Packit Service a4b2a9
+}
Packit Service a4b2a9
+
Packit Service a4b2a9
+/*
Packit Service a4b2a9
+ * This isn't really a type as we use it to say "no type set" to
Packit Service a4b2a9
+ * indicate we want to search for "any" mount in the
Packit Service a4b2a9
+ * autofs_dev_ioctl_ismountpoint() device ioctl function.
Packit Service a4b2a9
+ */
Packit Service a4b2a9
+static inline void set_autofs_type_any(unsigned int *type)
Packit Service a4b2a9
+{
Packit Service a4b2a9
+	*type = AUTOFS_TYPE_ANY;
Packit Service a4b2a9
+	return;
Packit Service a4b2a9
+}
Packit Service a4b2a9
+
Packit Service a4b2a9
+static inline unsigned int autofs_type_any(unsigned int type)
Packit Service a4b2a9
+{
Packit Service a4b2a9
+	return (type == AUTOFS_TYPE_ANY);
Packit Service a4b2a9
+}
Packit Service a4b2a9
 
Packit Service a4b2a9
 /* Daemon notification packet types */
Packit Service a4b2a9
 enum autofs_notify {
Packit Service a4b2a9
--- linux-2.6.28.orig/Documentation/filesystems/autofs4-mount-control.txt
Packit Service a4b2a9
+++ linux-2.6.28/Documentation/filesystems/autofs4-mount-control.txt
Packit Service a4b2a9
@@ -179,8 +179,21 @@ struct autofs_dev_ioctl {
Packit Service a4b2a9
 				 * including this struct */
Packit Service a4b2a9
 	__s32 ioctlfd;          /* automount command fd */
Packit Service a4b2a9
 
Packit Service a4b2a9
-	__u32 arg1;             /* Command parameters */
Packit Service a4b2a9
-	__u32 arg2;
Packit Service a4b2a9
+	/* Command parameters */
Packit Service a4b2a9
+
Packit Service a4b2a9
+	union {
Packit Service a4b2a9
+		struct args_protover            protover;
Packit Service a4b2a9
+		struct args_protosubver         protosubver;
Packit Service a4b2a9
+		struct args_openmount           openmount;
Packit Service a4b2a9
+		struct args_ready               ready;
Packit Service a4b2a9
+		struct args_fail                fail;
Packit Service a4b2a9
+		struct args_setpipefd           setpipefd;
Packit Service a4b2a9
+		struct args_timeout             timeout;
Packit Service a4b2a9
+		struct args_requester           requester;
Packit Service a4b2a9
+		struct args_expire              expire;
Packit Service a4b2a9
+		struct args_askumount           askumount;
Packit Service a4b2a9
+		struct args_ismountpoint        ismountpoint;
Packit Service a4b2a9
+	};
Packit Service a4b2a9
 
Packit Service a4b2a9
 	char path[0];
Packit Service a4b2a9
 };
Packit Service a4b2a9
@@ -192,8 +205,8 @@ optionally be used to check a specific m
Packit Service a4b2a9
 mount point file descriptor, and when requesting the uid and gid of the
Packit Service a4b2a9
 last successful mount on a directory within the autofs file system.
Packit Service a4b2a9
 
Packit Service a4b2a9
-The fields arg1 and arg2 are used to communicate parameters and results of
Packit Service a4b2a9
-calls made as described below.
Packit Service a4b2a9
+The anonymous union is used to communicate parameters and results of calls
Packit Service a4b2a9
+made as described below.
Packit Service a4b2a9
 
Packit Service a4b2a9
 The path field is used to pass a path where it is needed and the size field
Packit Service a4b2a9
 is used account for the increased structure length when translating the
Packit Service a4b2a9
@@ -245,25 +258,27 @@ AUTOFS_DEV_IOCTL_PROTOVER_CMD and AUTOFS
Packit Service a4b2a9
 Get the major and minor version of the autofs4 protocol version understood
Packit Service a4b2a9
 by loaded module. This call requires an initialized struct autofs_dev_ioctl
Packit Service a4b2a9
 with the ioctlfd field set to a valid autofs mount point descriptor
Packit Service a4b2a9
-and sets the requested version number in structure field arg1. These
Packit Service a4b2a9
-commands return 0 on success or one of the negative error codes if
Packit Service a4b2a9
-validation fails.
Packit Service a4b2a9
+and sets the requested version number in structure field protover.version
Packit Service a4b2a9
+and ptotosubver.sub_version respectively. These commands return 0 on
Packit Service a4b2a9
+success or one of the negative error codes if validation fails.
Packit Service a4b2a9
 
Packit Service a4b2a9
 
Packit Service a4b2a9
-AUTOFS_DEV_IOCTL_OPENMOUNT and AUTOFS_DEV_IOCTL_CLOSEMOUNT
Packit Service a4b2a9
-----------------------------------------------------------
Packit Service a4b2a9
+AUTOFS_DEV_IOCTL_OPENMOUNT_CMD and AUTOFS_DEV_IOCTL_CLOSEMOUNT_CMD
Packit Service a4b2a9
+------------------------------------------------------------------
Packit Service a4b2a9
 
Packit Service a4b2a9
 Obtain and release a file descriptor for an autofs managed mount point
Packit Service a4b2a9
 path. The open call requires an initialized struct autofs_dev_ioctl with
Packit Service a4b2a9
 the the path field set and the size field adjusted appropriately as well
Packit Service a4b2a9
-as the arg1 field set to the device number of the autofs mount. The
Packit Service a4b2a9
-device number can be obtained from the mount options shown in
Packit Service a4b2a9
-/proc/mounts. The close call requires an initialized struct
Packit Service a4b2a9
-autofs_dev_ioct with the ioctlfd field set to the descriptor obtained
Packit Service a4b2a9
-from the open call. The release of the file descriptor can also be done
Packit Service a4b2a9
-with close(2) so any open descriptors will also be closed at process exit.
Packit Service a4b2a9
-The close call is included in the implemented operations largely for
Packit Service a4b2a9
-completeness and to provide for a consistent user space implementation.
Packit Service a4b2a9
+as the openmount.devid field set to the device number of the autofs mount.
Packit Service a4b2a9
+The device number of an autofs mounted filesystem can be obtained by using
Packit Service a4b2a9
+the AUTOFS_DEV_IOCTL_ISMOUNTPOINT ioctl function by providing the path
Packit Service a4b2a9
+and autofs mount type, as described below. The close call requires an
Packit Service a4b2a9
+initialized struct autofs_dev_ioct with the ioctlfd field set to the
Packit Service a4b2a9
+descriptor obtained from the open call. The release of the file descriptor
Packit Service a4b2a9
+can also be done with close(2) so any open descriptors will also be
Packit Service a4b2a9
+closed at process exit. The close call is included in the implemented
Packit Service a4b2a9
+operations largely for completeness and to provide for a consistent
Packit Service a4b2a9
+user space implementation.
Packit Service a4b2a9
 
Packit Service a4b2a9
 
Packit Service a4b2a9
 AUTOFS_DEV_IOCTL_READY_CMD and AUTOFS_DEV_IOCTL_FAIL_CMD
Packit Service a4b2a9
@@ -272,10 +287,10 @@ AUTOFS_DEV_IOCTL_READY_CMD and AUTOFS_DE
Packit Service a4b2a9
 Return mount and expire result status from user space to the kernel.
Packit Service a4b2a9
 Both of these calls require an initialized struct autofs_dev_ioctl
Packit Service a4b2a9
 with the ioctlfd field set to the descriptor obtained from the open
Packit Service a4b2a9
-call and the arg1 field set to the wait queue token number, received
Packit Service a4b2a9
-by user space in the foregoing mount or expire request. The arg2 field
Packit Service a4b2a9
-is set to the status to be returned. For the ready call this is always
Packit Service a4b2a9
-0 and for the fail call it is set to the errno of the operation.
Packit Service a4b2a9
+call and the ready.token or fail.token field set to the wait queue
Packit Service a4b2a9
+token number, received by user space in the foregoing mount or expire
Packit Service a4b2a9
+request. The fail.status field is set to the status to be returned when
Packit Service a4b2a9
+sending a failure notification with AUTOFS_DEV_IOCTL_FAIL_CMD.
Packit Service a4b2a9
 
Packit Service a4b2a9
 
Packit Service a4b2a9
 AUTOFS_DEV_IOCTL_SETPIPEFD_CMD
Packit Service a4b2a9
@@ -290,9 +305,10 @@ mount be catatonic (see next call).
Packit Service a4b2a9
 
Packit Service a4b2a9
 The call requires an initialized struct autofs_dev_ioctl with the
Packit Service a4b2a9
 ioctlfd field set to the descriptor obtained from the open call and
Packit Service a4b2a9
-the arg1 field set to descriptor of the pipe. On success the call
Packit Service a4b2a9
-also sets the process group id used to identify the controlling process
Packit Service a4b2a9
-(eg. the owning automount(8) daemon) to the process group of the caller.
Packit Service a4b2a9
+the setpipefd.pipefd field set to descriptor of the pipe. On success
Packit Service a4b2a9
+the call also sets the process group id used to identify the controlling
Packit Service a4b2a9
+process (eg. the owning automount(8) daemon) to the process group of
Packit Service a4b2a9
+the caller.
Packit Service a4b2a9
 
Packit Service a4b2a9
 
Packit Service a4b2a9
 AUTOFS_DEV_IOCTL_CATATONIC_CMD
Packit Service a4b2a9
@@ -313,6 +329,9 @@ Set the expire timeout for mounts within
Packit Service a4b2a9
 
Packit Service a4b2a9
 The call requires an initialized struct autofs_dev_ioctl with the
Packit Service a4b2a9
 ioctlfd field set to the descriptor obtained from the open call.
Packit Service a4b2a9
+The timeout.timeout field is set to the desired timeout and this
Packit Service a4b2a9
+field is set to the value of the value of the current timeout of
Packit Service a4b2a9
+the mount upon successful completion.
Packit Service a4b2a9
 
Packit Service a4b2a9
 
Packit Service a4b2a9
 AUTOFS_DEV_IOCTL_REQUESTER_CMD
Packit Service a4b2a9
@@ -323,9 +342,9 @@ mount on the given path dentry.
Packit Service a4b2a9
 
Packit Service a4b2a9
 The call requires an initialized struct autofs_dev_ioctl with the path
Packit Service a4b2a9
 field set to the mount point in question and the size field adjusted
Packit Service a4b2a9
-appropriately as well as the arg1 field set to the device number of the
Packit Service a4b2a9
-containing autofs mount. Upon return the struct field arg1 contains the
Packit Service a4b2a9
-uid and arg2 the gid.
Packit Service a4b2a9
+appropriately as well as the ioctlfd field set to the descriptor obtained
Packit Service a4b2a9
+from the open call. Upon return the struct fields requester.uid and
Packit Service a4b2a9
+requester.gid contain the uid and gid respectively.
Packit Service a4b2a9
 
Packit Service a4b2a9
 When reconstructing an autofs mount tree with active mounts we need to
Packit Service a4b2a9
 re-connect to mounts that may have used the original process uid and
Packit Service a4b2a9
@@ -343,8 +362,8 @@ this ioctl is called until no further ex
Packit Service a4b2a9
 The call requires an initialized struct autofs_dev_ioctl with the
Packit Service a4b2a9
 ioctlfd field set to the descriptor obtained from the open call. In
Packit Service a4b2a9
 addition an immediate expire, independent of the mount timeout, can be
Packit Service a4b2a9
-requested by setting the arg1 field to 1. If no expire candidates can
Packit Service a4b2a9
-be found the ioctl returns -1 with errno set to EAGAIN.
Packit Service a4b2a9
+requested by setting the expire.how field to 1. If no expire candidates
Packit Service a4b2a9
+can be found the ioctl returns -1 with errno set to EAGAIN.
Packit Service a4b2a9
 
Packit Service a4b2a9
 This call causes the kernel module to check the mount corresponding
Packit Service a4b2a9
 to the given ioctlfd for mounts that can be expired, issues an expire
Packit Service a4b2a9
@@ -357,7 +376,8 @@ Checks if an autofs mount point is in us
Packit Service a4b2a9
 
Packit Service a4b2a9
 The call requires an initialized struct autofs_dev_ioctl with the
Packit Service a4b2a9
 ioctlfd field set to the descriptor obtained from the open call and
Packit Service a4b2a9
-it returns the result in the arg1 field, 1 for busy and 0 otherwise.
Packit Service a4b2a9
+it returns the result in the askumount.may_umount field, 1 for busy
Packit Service a4b2a9
+and 0 otherwise.
Packit Service a4b2a9
 
Packit Service a4b2a9
 
Packit Service a4b2a9
 AUTOFS_DEV_IOCTL_ISMOUNTPOINT_CMD
Packit Service a4b2a9
@@ -367,14 +387,15 @@ Check if the given path is a mountpoint.
Packit Service a4b2a9
 
Packit Service a4b2a9
 The call requires an initialized struct autofs_dev_ioctl. There are two
Packit Service a4b2a9
 possible variations. Both use the path field set to the path of the mount
Packit Service a4b2a9
-point to check and the size field adjusted appropriately. One uses the
Packit Service a4b2a9
-ioctlfd field to identify a specific mount point to check while the other
Packit Service a4b2a9
-variation uses the path and optionaly arg1 set to an autofs mount type.
Packit Service a4b2a9
-The call returns 1 if this is a mount point and sets arg1 to the device
Packit Service a4b2a9
-number of the mount and field arg2 to the relevant super block magic
Packit Service a4b2a9
-number (described below) or 0 if it isn't a mountpoint. In both cases
Packit Service a4b2a9
-the the device number (as returned by new_encode_dev()) is returned
Packit Service a4b2a9
-in field arg1.
Packit Service a4b2a9
+point to check and the size field must be adjusted appropriately. One uses
Packit Service a4b2a9
+the ioctlfd field to identify a specific mount point to check while the
Packit Service a4b2a9
+other variation uses the path and optionaly the ismountpoint.in.type 
Packit Service a4b2a9
+field set to an autofs mount type. The call returns 1 if this is a mount
Packit Service a4b2a9
+point and sets the ismountpoint.out.devid field to the device number of
Packit Service a4b2a9
+the mount and the ismountpoint.out.magic field to the relevant super
Packit Service a4b2a9
+block magic number (described below) or 0 if it isn't a mountpoint. In
Packit Service a4b2a9
+both cases the the device number (as returned by new_encode_dev()) is
Packit Service a4b2a9
+returned in the ismountpoint.out.devid field.
Packit Service a4b2a9
 
Packit Service a4b2a9
 If supplied with a file descriptor we're looking for a specific mount,
Packit Service a4b2a9
 not necessarily at the top of the mounted stack. In this case the path
Packit Service a4b2a9
--- linux-2.6.28.orig/include/linux/auto_dev-ioctl.h
Packit Service a4b2a9
+++ linux-2.6.28/include/linux/auto_dev-ioctl.h
Packit Service a4b2a9
@@ -10,7 +10,13 @@
Packit Service a4b2a9
 #ifndef _LINUX_AUTO_DEV_IOCTL_H
Packit Service a4b2a9
 #define _LINUX_AUTO_DEV_IOCTL_H
Packit Service a4b2a9
 
Packit Service a4b2a9
-#include <linux/types.h>
Packit Service a4b2a9
+#include <linux/auto_fs.h>
Packit Service a4b2a9
+
Packit Service a4b2a9
+#ifdef __KERNEL__
Packit Service a4b2a9
+#include <linux/string.h>
Packit Service a4b2a9
+#else
Packit Service a4b2a9
+#include <string.h>
Packit Service a4b2a9
+#endif /* __KERNEL__ */
Packit Service a4b2a9
 
Packit Service a4b2a9
 #define AUTOFS_DEVICE_NAME		"autofs"
Packit Service a4b2a9
 
Packit Service a4b2a9
@@ -25,6 +31,60 @@
Packit Service a4b2a9
  * An ioctl interface for autofs mount point control.
Packit Service a4b2a9
  */
Packit Service a4b2a9
 
Packit Service a4b2a9
+struct args_protover {
Packit Service a4b2a9
+	__u32	version;
Packit Service a4b2a9
+};
Packit Service a4b2a9
+
Packit Service a4b2a9
+struct args_protosubver {
Packit Service a4b2a9
+	__u32	sub_version;
Packit Service a4b2a9
+};
Packit Service a4b2a9
+
Packit Service a4b2a9
+struct args_openmount {
Packit Service a4b2a9
+	__u32	devid;
Packit Service a4b2a9
+};
Packit Service a4b2a9
+
Packit Service a4b2a9
+struct args_ready {
Packit Service a4b2a9
+	__u32	token;
Packit Service a4b2a9
+};
Packit Service a4b2a9
+
Packit Service a4b2a9
+struct args_fail {
Packit Service a4b2a9
+	__u32	token;
Packit Service a4b2a9
+	__s32	status;
Packit Service a4b2a9
+};
Packit Service a4b2a9
+
Packit Service a4b2a9
+struct args_setpipefd {
Packit Service a4b2a9
+	__s32	pipefd;
Packit Service a4b2a9
+};
Packit Service a4b2a9
+
Packit Service a4b2a9
+struct args_timeout {
Packit Service a4b2a9
+	__u64	timeout;
Packit Service a4b2a9
+};
Packit Service a4b2a9
+
Packit Service a4b2a9
+struct args_requester {
Packit Service a4b2a9
+	__u32	uid;
Packit Service a4b2a9
+	__u32	gid;
Packit Service a4b2a9
+};
Packit Service a4b2a9
+
Packit Service a4b2a9
+struct args_expire {
Packit Service a4b2a9
+	__u32	how;
Packit Service a4b2a9
+};
Packit Service a4b2a9
+
Packit Service a4b2a9
+struct args_askumount {
Packit Service a4b2a9
+	__u32	may_umount;
Packit Service a4b2a9
+};
Packit Service a4b2a9
+
Packit Service a4b2a9
+struct args_ismountpoint {
Packit Service a4b2a9
+	union {
Packit Service a4b2a9
+		struct args_in {
Packit Service a4b2a9
+			__u32	type;
Packit Service a4b2a9
+		} in;
Packit Service a4b2a9
+		struct args_out {
Packit Service a4b2a9
+			__u32	devid;
Packit Service a4b2a9
+			__u32	magic;
Packit Service a4b2a9
+		} out;
Packit Service a4b2a9
+	};
Packit Service a4b2a9
+};
Packit Service a4b2a9
+
Packit Service a4b2a9
 /*
Packit Service a4b2a9
  * All the ioctls use this structure.
Packit Service a4b2a9
  * When sending a path size must account for the total length
Packit Service a4b2a9
@@ -39,20 +99,32 @@ struct autofs_dev_ioctl {
Packit Service a4b2a9
 				 * including this struct */
Packit Service a4b2a9
 	__s32 ioctlfd;		/* automount command fd */
Packit Service a4b2a9
 
Packit Service a4b2a9
-	__u32 arg1;		/* Command parameters */
Packit Service a4b2a9
-	__u32 arg2;
Packit Service a4b2a9
+	/* Command parameters */
Packit Service a4b2a9
+
Packit Service a4b2a9
+	union {
Packit Service a4b2a9
+		struct args_protover		protover;
Packit Service a4b2a9
+		struct args_protosubver		protosubver;
Packit Service a4b2a9
+		struct args_openmount		openmount;
Packit Service a4b2a9
+		struct args_ready		ready;
Packit Service a4b2a9
+		struct args_fail		fail;
Packit Service a4b2a9
+		struct args_setpipefd		setpipefd;
Packit Service a4b2a9
+		struct args_timeout		timeout;
Packit Service a4b2a9
+		struct args_requester		requester;
Packit Service a4b2a9
+		struct args_expire		expire;
Packit Service a4b2a9
+		struct args_askumount		askumount;
Packit Service a4b2a9
+		struct args_ismountpoint	ismountpoint;
Packit Service a4b2a9
+	};
Packit Service a4b2a9
 
Packit Service a4b2a9
 	char path[0];
Packit Service a4b2a9
 };
Packit Service a4b2a9
 
Packit Service a4b2a9
 static inline void init_autofs_dev_ioctl(struct autofs_dev_ioctl *in)
Packit Service a4b2a9
 {
Packit Service a4b2a9
+	memset(in, 0, sizeof(struct autofs_dev_ioctl));
Packit Service a4b2a9
 	in->ver_major = AUTOFS_DEV_IOCTL_VERSION_MAJOR;
Packit Service a4b2a9
 	in->ver_minor = AUTOFS_DEV_IOCTL_VERSION_MINOR;
Packit Service a4b2a9
 	in->size = sizeof(struct autofs_dev_ioctl);
Packit Service a4b2a9
 	in->ioctlfd = -1;
Packit Service a4b2a9
-	in->arg1 = 0;
Packit Service a4b2a9
-	in->arg2 = 0;
Packit Service a4b2a9
 	return;
Packit Service a4b2a9
 }
Packit Service a4b2a9
 
Packit Service a4b2a9
--- linux-2.6.28.orig/fs/autofs4/root.c
Packit Service a4b2a9
+++ linux-2.6.28/fs/autofs4/root.c
Packit Service a4b2a9
@@ -485,22 +485,6 @@ static struct dentry *autofs4_lookup(str
Packit Service a4b2a9
 	DPRINTK("pid = %u, pgrp = %u, catatonic = %d, oz_mode = %d",
Packit Service a4b2a9
 		 current->pid, task_pgrp_nr(current), sbi->catatonic, oz_mode);
Packit Service a4b2a9
 
Packit Service a4b2a9
-	expiring = autofs4_lookup_expiring(sbi, dentry->d_parent, &dentry->d_name);
Packit Service a4b2a9
-	if (expiring) {
Packit Service a4b2a9
-		/*
Packit Service a4b2a9
-		 * If we are racing with expire the request might not
Packit Service a4b2a9
-		 * be quite complete but the directory has been removed
Packit Service a4b2a9
-		 * so it must have been successful, so just wait for it.
Packit Service a4b2a9
-		 */
Packit Service a4b2a9
-		ino = autofs4_dentry_ino(expiring);
Packit Service a4b2a9
-		autofs4_expire_wait(expiring);
Packit Service a4b2a9
-		spin_lock(&sbi->lookup_lock);
Packit Service a4b2a9
-		if (!list_empty(&ino->expiring))
Packit Service a4b2a9
-			list_del_init(&ino->expiring);
Packit Service a4b2a9
-		spin_unlock(&sbi->lookup_lock);
Packit Service a4b2a9
-		dput(expiring);
Packit Service a4b2a9
-	}
Packit Service a4b2a9
-
Packit Service a4b2a9
 	unhashed = autofs4_lookup_active(sbi, dentry->d_parent, &dentry->d_name);
Packit Service a4b2a9
 	if (unhashed)
Packit Service a4b2a9
 		dentry = unhashed;
Packit Service a4b2a9
@@ -538,14 +522,31 @@ static struct dentry *autofs4_lookup(str
Packit Service a4b2a9
 	}
Packit Service a4b2a9
 
Packit Service a4b2a9
 	if (!oz_mode) {
Packit Service a4b2a9
+		mutex_unlock(&dir->i_mutex);
Packit Service a4b2a9
+		expiring = autofs4_lookup_expiring(sbi,
Packit Service a4b2a9
+						   dentry->d_parent,
Packit Service a4b2a9
+						   &dentry->d_name);
Packit Service a4b2a9
+		if (expiring) {
Packit Service a4b2a9
+			/*
Packit Service a4b2a9
+			 * If we are racing with expire the request might not
Packit Service a4b2a9
+			 * be quite complete but the directory has been removed
Packit Service a4b2a9
+			 * so it must have been successful, so just wait for it.
Packit Service a4b2a9
+			 */
Packit Service a4b2a9
+			ino = autofs4_dentry_ino(expiring);
Packit Service a4b2a9
+			autofs4_expire_wait(expiring);
Packit Service a4b2a9
+			spin_lock(&sbi->lookup_lock);
Packit Service a4b2a9
+			if (!list_empty(&ino->expiring))
Packit Service a4b2a9
+				list_del_init(&ino->expiring);
Packit Service a4b2a9
+			spin_unlock(&sbi->lookup_lock);
Packit Service a4b2a9
+			dput(expiring);
Packit Service a4b2a9
+		}
Packit Service a4b2a9
+
Packit Service a4b2a9
 		spin_lock(&dentry->d_lock);
Packit Service a4b2a9
 		dentry->d_flags |= DCACHE_AUTOFS_PENDING;
Packit Service a4b2a9
 		spin_unlock(&dentry->d_lock);
Packit Service a4b2a9
-		if (dentry->d_op && dentry->d_op->d_revalidate) {
Packit Service a4b2a9
-			mutex_unlock(&dir->i_mutex);
Packit Service a4b2a9
+		if (dentry->d_op && dentry->d_op->d_revalidate)
Packit Service a4b2a9
 			(dentry->d_op->d_revalidate)(dentry, nd);
Packit Service a4b2a9
-			mutex_lock(&dir->i_mutex);
Packit Service a4b2a9
-		}
Packit Service a4b2a9
+		mutex_lock(&dir->i_mutex);
Packit Service a4b2a9
 	}
Packit Service a4b2a9
 
Packit Service a4b2a9
 	/*
Packit Service a4b2a9
--- linux-2.6.28.orig/include/linux/auto_fs.h
Packit Service a4b2a9
+++ linux-2.6.28/include/linux/auto_fs.h
Packit Service a4b2a9
@@ -17,11 +17,13 @@
Packit Service a4b2a9
 #ifdef __KERNEL__
Packit Service a4b2a9
 #include <linux/fs.h>
Packit Service a4b2a9
 #include <linux/limits.h>
Packit Service a4b2a9
+#include <linux/types.h>
Packit Service a4b2a9
+#include <linux/ioctl.h>
Packit Service a4b2a9
+#else
Packit Service a4b2a9
 #include <asm/types.h>
Packit Service a4b2a9
+#include <sys/ioctl.h>
Packit Service a4b2a9
 #endif /* __KERNEL__ */
Packit Service a4b2a9
 
Packit Service a4b2a9
-#include <linux/ioctl.h>
Packit Service a4b2a9
-
Packit Service a4b2a9
 /* This file describes autofs v3 */
Packit Service a4b2a9
 #define AUTOFS_PROTO_VERSION	3
Packit Service a4b2a9