[PATCH] autofs4 - avoid panic on bind mount of autofs owned directory (fwd)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



---------- Forwarded message ----------
Date: Sat, 4 Jun 2005 14:02:36 +0800 (WST)
From: [email protected]
To: Andrew Morton <[email protected]>
Cc: [email protected], Steinar H. Gunderson <[email protected]>,
    Michael Blandford <[email protected]>, Jeff Moyer <[email protected]>
Subject: [PATCH] autofs4 - avoid panic on bind mount of autofs owned directory


While this is not a solution to bind and move mounts on autofs owned 
directories it is necessary to fix the trady error handling.

At least it avoids the kernel panic I observed checking out bug #4589.

Signed-off-by: Ian Kent <[email protected]>

diff -Nurp linux-2.6.12-rc5-mm1.orig/fs/autofs4/autofs_i.h linux-2.6.12-rc5-mm1/fs/autofs4/autofs_i.h
--- linux-2.6.12-rc5-mm1.orig/fs/autofs4/autofs_i.h	2005-05-29 14:37:27.000000000 +0800
+++ linux-2.6.12-rc5-mm1/fs/autofs4/autofs_i.h	2005-05-29 14:32:35.000000000 +0800
@@ -185,6 +185,19 @@ int autofs4_wait(struct autofs_sb_info *
 int autofs4_wait_release(struct autofs_sb_info *,autofs_wqt_t,int);
 void autofs4_catatonic_mode(struct autofs_sb_info *);
 
+static inline int autofs4_follow_mount(struct vfsmount **mnt, struct dentry **dentry)
+{
+	int res = 0;
+
+	while (d_mountpoint(*dentry)) {
+		int followed = follow_down(mnt, dentry);
+		if (!followed)
+			break;
+		res = 1;
+	}
+	return res;
+}
+
 static inline int simple_positive(struct dentry *dentry)
 {
 	return dentry->d_inode && !d_unhashed(dentry);
diff -Nurp linux-2.6.12-rc5-mm1.orig/fs/autofs4/expire.c linux-2.6.12-rc5-mm1/fs/autofs4/expire.c
--- linux-2.6.12-rc5-mm1.orig/fs/autofs4/expire.c	2005-05-29 14:37:27.000000000 +0800
+++ linux-2.6.12-rc5-mm1/fs/autofs4/expire.c	2005-05-29 14:32:35.000000000 +0800
@@ -56,12 +56,9 @@ static int autofs4_check_mount(struct vf
 	mntget(mnt);
 	dget(dentry);
 
-	if (!follow_down(&mnt, &dentry))
+	if (!autofs4_follow_mount(&mnt, &dentry))
 		goto done;
 
-	while (d_mountpoint(dentry) && follow_down(&mnt, &dentry))
-		;
-
 	/* This is an autofs submount, we can't expire it */
 	if (is_autofs4_dentry(dentry))
 		goto done;
diff -Nurp linux-2.6.12-rc5-mm1.orig/fs/autofs4/root.c linux-2.6.12-rc5-mm1/fs/autofs4/root.c
--- linux-2.6.12-rc5-mm1.orig/fs/autofs4/root.c	2005-05-29 14:37:27.000000000 +0800
+++ linux-2.6.12-rc5-mm1/fs/autofs4/root.c	2005-05-29 14:32:35.000000000 +0800
@@ -205,7 +205,11 @@ static int autofs4_dir_open(struct inode
 		struct vfsmount *fp_mnt = mntget(mnt);
 		struct dentry *fp_dentry = dget(dentry);
 
-		while (follow_down(&fp_mnt, &fp_dentry) && d_mountpoint(fp_dentry));
+		if (!autofs4_follow_mount(&fp_mnt, &fp_dentry)) {
+			dput(fp_dentry);
+			mntput(fp_mnt);
+			return -ENOENT;
+		}
 
 		fp = dentry_open(fp_dentry, fp_mnt, file->f_flags);
 		status = PTR_ERR(fp);

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux