From owner-svn-src-all@FreeBSD.ORG Tue Jul 8 08:10:16 2014 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 4FBCC52C; Tue, 8 Jul 2014 08:10:16 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 3E3602766; Tue, 8 Jul 2014 08:10:16 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.8/8.14.8) with ESMTP id s688AGn7016433; Tue, 8 Jul 2014 08:10:16 GMT (envelope-from kib@svn.freebsd.org) Received: (from kib@localhost) by svn.freebsd.org (8.14.8/8.14.8/Submit) id s688AGsJ016432; Tue, 8 Jul 2014 08:10:16 GMT (envelope-from kib@svn.freebsd.org) Message-Id: <201407080810.s688AGsJ016432@svn.freebsd.org> From: Konstantin Belousov Date: Tue, 8 Jul 2014 08:10:16 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r268384 - head/sys/kern X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 08 Jul 2014 08:10:16 -0000 Author: kib Date: Tue Jul 8 08:10:15 2014 New Revision: 268384 URL: http://svnweb.freebsd.org/changeset/base/268384 Log: Correct the problem reported by test16 from tools/regression/file/flock/flock.c, which completes the fix in r192685. When the lock was stolen from us, retry the whole lock sequence in kernel, instead of returning EINTR to usermode and hoping that application would handle it correctly by restarting the lock acquire. Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 2 weeks Modified: head/sys/kern/kern_lockf.c Modified: head/sys/kern/kern_lockf.c ============================================================================== --- head/sys/kern/kern_lockf.c Tue Jul 8 08:05:42 2014 (r268383) +++ head/sys/kern/kern_lockf.c Tue Jul 8 08:10:15 2014 (r268384) @@ -469,6 +469,9 @@ lf_advlockasync(struct vop_advlockasync_ return (EOVERFLOW); end = start + oadd; } + +retry_setlock: + /* * Avoid the common case of unlocking when inode has no locks. */ @@ -744,6 +747,11 @@ lf_advlockasync(struct vop_advlockasync_ sx_destroy(&freestate->ls_lock); free(freestate, M_LOCKF); } + + if (error == EDOOFUS) { + KASSERT(ap->a_op == F_SETLK, ("EDOOFUS")); + goto retry_setlock; + } return (error); } @@ -1459,7 +1467,7 @@ lf_setlock(struct lockf *state, struct l lock->lf_refs++; error = sx_sleep(lock, &state->ls_lock, priority, lockstr, 0); if (lf_free_lock(lock)) { - error = EINTR; + error = EDOOFUS; goto out; }