NetBSD-Bugs archive

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

PR/47040 CVS commit: src/sys/kern



The following reply was made to PR kern/47040; it has been noted by GNATS.

From: "David A. Holland" <dholland%netbsd.org@localhost>
To: gnats-bugs%gnats.NetBSD.org@localhost
Cc: 
Subject: PR/47040 CVS commit: src/sys/kern
Date: Tue, 12 Apr 2016 04:02:55 +0000

 Module Name:	src
 Committed By:	dholland
 Date:		Tue Apr 12 04:02:55 UTC 2016
 
 Modified Files:
 	src/sys/kern: vfs_lookup.c
 
 Log Message:
 Fix (finally) the rest of PR 47040.
 
 Revert the supporting logic in -r1.190 of vfs_lookup.c, and fix the
 important change to set searchdir = NULL instead of searchdir =
 foundobj. Then supply the necessary new supporting logic to cope with
 some new cases where searchdir can be null.
 
 This is at the point when lookup_once crosses a mountpoint going down;
 the idea was to avoid coupling locks across filesystems as that has a
 number of potentially negative consequences. At this stage of namei,
 though, it's important to set searchdir to null as this is what is
 used later on to handle other cases arising from crossing mount
 points. If you set it to be the same as foundobj, that instead creates
 the impression that you looked up "/." on the new volume, and that
 causes odd things to happen in corner cases such as the one appearing
 in PR 47040.
 
 This fix ought to be pulled up to -6 and -7, and it probably could be
 safely, but given the delicacy of this code and the fact that it's
 taken me more than three years to find the combination of time and
 intestinal fortitude to do it, as well as the minor nature of the
 resulting wrong behavior observed so far, I think we'll let that part
 go.
 
 This change also exposes an annoying corner case: if you cross a mount
 point and the root directory vnode of the new volume is not a
 directory but a symlink, we now have no searchdir to follow the
 symlink relative to. In principle one could hang onto the searchdir
 from before calling lookup_once and use that, or complexify the
 interface of lookup_once to hang onto it as desired for this case.
 Alternatively one could add the necessary null checks to namei_follow
 and allow only absolute symlinks in this case, as for an absolute
 symlink one doesn't need the old searchdir. However, given that only
 broken filesystems have symlinks as their root vnodes, I'm not going
 to bother. Instead if this happens we'll just fail with ENOTDIR.
 
 
 To generate a diff of this commit:
 cvs rdiff -u -r1.203 -r1.204 src/sys/kern/vfs_lookup.c
 
 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.
 


Home | Main Index | Thread Index | Old Index