Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 22 Sep 2013 19:30:01 GMT
From:      dfilter@FreeBSD.ORG (dfilter service)
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: kern/178997: commit references a PR
Message-ID:  <201309221930.r8MJU1RE050639@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/178997; it has been noted by GNATS.

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/178997: commit references a PR
Date: Sun, 22 Sep 2013 19:23:56 +0000 (UTC)

 Author: kib
 Date: Sun Sep 22 19:23:48 2013
 New Revision: 255797
 URL: http://svnweb.freebsd.org/changeset/base/255797
 
 Log:
   Increase the chance of the buffer write from the bufdaemon helper
   context to succeed.  If the locked vnode which owns the buffer to be
   written is shared locked, try the non-blocking upgrade of the lock to
   exclusive.
   
   PR:	kern/178997
   Reported and tested by:	Klaus Weber <fbsd-bugs-2013-1@unix-admin.de>
   Sponsored by:	The FreeBSD Foundation
   MFC after:	1 week
   Approved by:	re (marius)
 
 Modified:
   head/sys/kern/vfs_bio.c
 
 Modified: head/sys/kern/vfs_bio.c
 ==============================================================================
 --- head/sys/kern/vfs_bio.c	Sun Sep 22 19:15:24 2013	(r255796)
 +++ head/sys/kern/vfs_bio.c	Sun Sep 22 19:23:48 2013	(r255797)
 @@ -2624,6 +2624,8 @@ flushbufqueues(struct vnode *lvp, int ta
  	int hasdeps;
  	int flushed;
  	int queue;
 +	int error;
 +	bool unlock;
  
  	flushed = 0;
  	queue = QUEUE_DIRTY;
 @@ -2699,7 +2701,16 @@ flushbufqueues(struct vnode *lvp, int ta
  			BUF_UNLOCK(bp);
  			continue;
  		}
 -		if (vn_lock(vp, LK_EXCLUSIVE | LK_NOWAIT | LK_CANRECURSE) == 0) {
 +		if (lvp == NULL) {
 +			unlock = true;
 +			error = vn_lock(vp, LK_EXCLUSIVE | LK_NOWAIT);
 +		} else {
 +			ASSERT_VOP_LOCKED(vp, "getbuf");
 +			unlock = false;
 +			error = VOP_ISLOCKED(vp) == LK_EXCLUSIVE ? 0 :
 +			    vn_lock(vp, LK_UPGRADE | LK_NOWAIT);
 +		}
 +		if (error == 0) {
  			mtx_unlock(&bqdirty);
  			CTR3(KTR_BUF, "flushbufqueue(%p) vp %p flags %X",
  			    bp, bp->b_vp, bp->b_flags);
 @@ -2711,7 +2722,8 @@ flushbufqueues(struct vnode *lvp, int ta
  				notbufdflushes++;
  			}
  			vn_finished_write(mp);
 -			VOP_UNLOCK(vp, 0);
 +			if (unlock)
 +				VOP_UNLOCK(vp, 0);
  			flushwithdeps += hasdeps;
  			flushed++;
  
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201309221930.r8MJU1RE050639>