From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Howells Subject: Re: [PATCH] fix race in mark_mounts_for_expiry() Date: Wed, 18 May 2005 11:46:15 +0100 Message-ID: <7230.1116413175@redhat.com> References: <1116005355.6248.372.camel@localhost> <1116012287.6248.410.camel@localhost> <1116013840.6248.429.camel@localhost> <1116256279.4154.41.camel@localhost> <20050516111408.GA21145@mail.shareable.org> <1116301843.4154.88.camel@localhost> <20050517012854.GC32226@mail.shareable.org> <1116360352.24560.85.camel@localhost> <1116399887.24560.116.camel@localhost> <1116400118.24560.119.camel@localhost> <6865.1116412354@redhat.com> Cc: linuxram@us.ibm.com, jamie@shareable.org, viro@parcelfarce.linux.theplanet.co.uk, akpm@osdl.org, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org Return-path: Received: from mx1.redhat.com ([66.187.233.31]:48797 "EHLO mx1.redhat.com") by vger.kernel.org with ESMTP id S262102AbVERKqc (ORCPT ); Wed, 18 May 2005 06:46:32 -0400 In-Reply-To: To: Miklos Szeredi Sender: linux-fsdevel-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org Miklos Szeredi wrote: > > How about using cmpxchg? > > How? If the count is nonzero, an incremented count must be stored. > You can't do that atomically with cmpxchg. Yes you can. cmpxchg() is atomic. Several archs implement atomic_inc() and co with cmpxchg() or similar. Something like: static inline struct namespace *grab_namespace(struct namespace *n) { int old = atomic_read(&n->count); while (old > 0) { /* attempt to increment the counter */ old = cmpxchg(&n->count, old, old + 1); } return old > 0 ? n : NULL; } David