lkml.org 
[lkml]   [2005]   [Jun]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH] autofs4 - avoid panic on bind mount of autofs owned directory (fwd)
---------- Forwarded message ----------
Date: Sat, 4 Jun 2005 14:02:36 +0800 (WST)
From: raven@themaw.net
To: Andrew Morton <akpm@osdl.org>
Cc: Dan@Merillat.org, Steinar H. Gunderson <sgunderson@bigfoot.com>,
Michael Blandford <michael@kmaclub.com>, Jeff Moyer <jmoyer@redhat.com>
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 <raven@themaw.net>

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 majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-06-04 08:36    [W:0.020 / U:0.856 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site