From owner-freebsd-current@FreeBSD.ORG Wed Aug 26 22:37:57 2009 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 132A5106568D for ; Wed, 26 Aug 2009 22:37:57 +0000 (UTC) (envelope-from brampton@gmail.com) Received: from mail-ew0-f209.google.com (mail-ew0-f209.google.com [209.85.219.209]) by mx1.freebsd.org (Postfix) with ESMTP id 90E368FC25 for ; Wed, 26 Aug 2009 22:37:56 +0000 (UTC) Received: by ewy5 with SMTP id 5so690631ewy.36 for ; Wed, 26 Aug 2009 15:37:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:received:date :x-google-sender-auth:message-id:subject:from:to:content-type; bh=KuurXyo++0V983nbwgOzqRspcJiabhDYZf+2dHVzcyU=; b=GVso4UkTY9F3wwxIXJILksfSqkzx45CaF0BzJGxDpXMgF423JYEBnmIInda2SFqJI1 cra7rGYxiVmo1TcADmIVA3Mmk1L6y4BaRoGxFEVd82TrFDLzWrr+3I+ipO5spNIAbqjy 9gZNJ7ihCWTjz1LIHRhePDlT+5L8i0vJEDwZ4= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:date:x-google-sender-auth:message-id:subject :from:to:content-type; b=O3s9NNwvNXiLu20e+tiD7QjkCwnOLZEwrwzs0qGc+jWh43yxiKp/L4SnYLknsakl2E 6sPoAnjRfbIlukjNq0ubmAj5jBgGfxWpFxfFGPqr41TpXTcAWBL2EOioP6sjjiNKwwXx c30o0YUXoow0rKBm1prBlywX97g/pQjd0QSTo= MIME-Version: 1.0 Sender: brampton@gmail.com Received: by 10.216.7.141 with SMTP id 13mr1635859wep.24.1251326275355; Wed, 26 Aug 2009 15:37:55 -0700 (PDT) Date: Wed, 26 Aug 2009 23:37:55 +0100 X-Google-Sender-Auth: 6503dd0a11d29c55 Message-ID: From: Andrew Brampton To: freebsd-current@freebsd.org Content-Type: multipart/mixed; boundary=0016364c7b992403cd0472131ac0 Subject: [patch] rw_try_wlock does not set recursive bit when recursing X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 26 Aug 2009 22:37:57 -0000 --0016364c7b992403cd0472131ac0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Hi, The following sequence of commands fails on line 4 with an assertion that the lock is not currently held: 1: rw_wlock(&rw); 2: if ( rw_try_wlock(&rw) ) 3: rw_wunlock(&rw); 4: rw_wunlock(&rw); This is because after line 3 is executed the rw lock is no longer held. I tracked this bug down to _rw_try_wlock which correctly increments rw_recurse, but does not set the RW_LOCK_RECURSED bit. Without this bit the third line unlocks the lock and leaves it in a unlocked state (when it should still be locked). Adding a line to set this bit makes _rw_try_wlock match the code in _rw_wlock_hard. I have attached a one line patch which fixes this problem on my 7.2 system, and looking over the CURRENT source it should also apply cleanly (but I have not tested it on CURRENT). I have also attached another (slightly longer) patch which fixes the problem as well as adding an a extra assert. It is up to the FreeBSD developer to decide which patch they prefer. thanks Andrew --0016364c7b992403cd0472131ac0 Content-Type: text/plain; charset=US-ASCII; name="rw_try_wlock.simple-assert.diff.txt" Content-Disposition: attachment; filename="rw_try_wlock.simple-assert.diff.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_fyumbnii0 SW5kZXg6IGtlcm5fcndsb2NrLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2Vybl9yd2xvY2suYwkocmV2aXNp b24gMTkxNzY1KQorKysga2Vybl9yd2xvY2suYwkod29ya2luZyBjb3B5KQpAQCAtMjAyLDggKzIw MiwxMiBAQCBfcndfdHJ5X3dsb2NrKHN0cnVjdCByd2xvY2sgKnJ3LCBjb25zdCBjaGFyICpmaWxl LAogCUtBU1NFUlQocnctPnJ3X2xvY2sgIT0gUldfREVTVFJPWUVELAogCSAgICAoInJ3X3RyeV93 bG9jaygpIG9mIGRlc3Ryb3llZCByd2xvY2sgQCAlczolZCIsIGZpbGUsIGxpbmUpKTsKIAotCWlm IChyd193bG9ja2VkKHJ3KSAmJiAocnctPmxvY2tfb2JqZWN0LmxvX2ZsYWdzICYgUldfUkVDVVJT RSkgIT0gMCkgeworCWlmIChyd193bG9ja2VkKHJ3KSkgeworCQlLQVNTRVJUKHJ3LT5sb2NrX29i amVjdC5sb19mbGFncyAmIFJXX1JFQ1VSU0UsCisJCSAgICAoIiVzOiByZWN1cnNpbmcgYnV0IG5v bi1yZWN1cnNpdmUgcncgJXMgQCAlczolZFxuIiwKKwkJICAgIF9fZnVuY19fLCBydy0+bG9ja19v YmplY3QubG9fbmFtZSwgZmlsZSwgbGluZSkpOwogCQlydy0+cndfcmVjdXJzZSsrOworCQlhdG9t aWNfc2V0X3B0cigmcnctPnJ3X2xvY2ssIFJXX0xPQ0tfUkVDVVJTRUQpOwogCQlydmFsID0gMTsK IAl9IGVsc2UKIAkJcnZhbCA9IGF0b21pY19jbXBzZXRfYWNxX3B0cigmcnctPnJ3X2xvY2ssIFJX X1VOTE9DS0VELAo= --0016364c7b992403cd0472131ac0 Content-Type: text/plain; charset=US-ASCII; name="rw_try_wlock.simple.diff.txt" Content-Disposition: attachment; filename="rw_try_wlock.simple.diff.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_fyumbnim1 SW5kZXg6IGtlcm5fcndsb2NrLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2Vybl9yd2xvY2suYwkocmV2aXNp b24gMTkxNzY1KQorKysga2Vybl9yd2xvY2suYwkod29ya2luZyBjb3B5KQpAQCAtMjA0LDYgKzIw NCw3IEBAIF9yd190cnlfd2xvY2soc3RydWN0IHJ3bG9jayAqcncsIGNvbnN0IGNoYXIgKmZpbGUs CiAKIAlpZiAocndfd2xvY2tlZChydykgJiYgKHJ3LT5sb2NrX29iamVjdC5sb19mbGFncyAmIFJX X1JFQ1VSU0UpICE9IDApIHsKIAkJcnctPnJ3X3JlY3Vyc2UrKzsKKwkJYXRvbWljX3NldF9wdHIo JnJ3LT5yd19sb2NrLCBSV19MT0NLX1JFQ1VSU0VEKTsKIAkJcnZhbCA9IDE7CiAJfSBlbHNlCiAJ CXJ2YWwgPSBhdG9taWNfY21wc2V0X2FjcV9wdHIoJnJ3LT5yd19sb2NrLCBSV19VTkxPQ0tFRCwK --0016364c7b992403cd0472131ac0--