Current-Users archive

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

Re: possible fix for PR 39307 (mfs sometimes crashing on unmount)



On Thu, Sep 25, 2008 at 09:54:09PM +0930, Brett Lymn wrote:

> I have been puzzling over the symptoms of PR # 39307 for a while, mfs
> sometimes causes a panic in VFS_START.  Looking at it, mfs is a
> strange beast.  The start routine (mfs_start) does not exit until the
> mount is going away and then mfs_start() actually calls dounmount()
> directly to unmount itself - once this is done, the race is on, can
> mfs_start() exit and VFS_START() do it's final bit before the memory
> that was the struct mount * is reused.  Hence the crash.

Wow, I completely ignored that call to dounmount().

> following fixes the symptom but I don't know if it is the "right" way
> to fix the bug:
> 
> Index: mfs_vfsops.c
> ===================================================================
> RCS file: /cvsroot/src/sys/ufs/mfs/mfs_vfsops.c,v
> retrieving revision 1.98
> diff -u -r1.98 mfs_vfsops.c
> --- mfs_vfsops.c      28 Jun 2008 01:34:05 -0000      1.98
> +++ mfs_vfsops.c      25 Sep 2008 12:23:29 -0000
> @@ -403,7 +403,7 @@
>       mutex_enter(&mfs_lock);
>       mfsp->mfs_refcnt++;
>       mutex_exit(&mfs_lock);
> -     vfs_unbusy(mp, false, NULL);
> +     vfs_unbusy(mp, true, NULL);
>  
>       base = mfsp->mfs_baseoff;
>       mutex_enter(&mfs_lock);

That would leak a reference to the mountpoint in some cases. Since a
reference is held for us across VFS_START(), and dounmount() always
consumes a reference, we can simply add one before calling dounmount().
I will check in fix.

Andrew


Home | Main Index | Thread Index | Old Index