From owner-freebsd-fs@FreeBSD.ORG Wed Aug 26 13:57:05 2009 Return-Path: Delivered-To: freebsd-fs@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D568110656A8 for ; Wed, 26 Aug 2009 13:57:05 +0000 (UTC) (envelope-from mi+thun@aldan.algebra.com) Received: from aldan.algebra.com (aldan.algebra.com [216.254.65.224]) by mx1.freebsd.org (Postfix) with ESMTP id 8D1CC8FC22 for ; Wed, 26 Aug 2009 13:57:05 +0000 (UTC) Received: from aldan.algebra.com (localhost [127.0.0.1]) by aldan.algebra.com (8.14.3/8.14.3) with ESMTP id n7QDv4Z8082354; Wed, 26 Aug 2009 09:57:04 -0400 (EDT) (envelope-from mi+thun@aldan.algebra.com) Message-ID: <4A953F30.8030202@aldan.algebra.com> Date: Wed, 26 Aug 2009 09:57:04 -0400 From: "Mikhail T." User-Agent: Thunderbird 2.0.0.22 (X11/20090711) MIME-Version: 1.0 To: Kostik Belousov References: <4A94B829.3090202@aldan.algebra.com> <20090826090947.GS9623@deviant.kiev.zoral.com.ua> In-Reply-To: <20090826090947.GS9623@deviant.kiev.zoral.com.ua> Content-Type: text/plain; charset=KOI8-R Content-Transfer-Encoding: 8bit Cc: freebsd-fs@freebsd.org Subject: Re: semantics of fcntl() with l_len being 0 X-BeenThere: freebsd-fs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Filesystems List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 26 Aug 2009 13:57:05 -0000 Kostik Belousov ΞΑΠΙΣΑΧ(ΜΑ): > On Wed, Aug 26, 2009 at 12:20:57AM -0400, Mikhail T. wrote: > >> Hello! >> >> I'm curious, whether a file, that's locked (via fcntl) with l_start and >> l_len being 0 is supposed to be appendable... >> >> I would think so, but I notice, that when spamprobe (see mail/spamprobe) >> chews on my spam mailbox, I can not append a new piece of spam to the >> file -- my imap-server is waiting for spamprobe to finish. >> >> The fcntl(2) says: ``len = 0 means until end of file''. Is that ``until >> the end of file AT THE TIME OF LOCKING'' or simply ``no other lock until >> we are done''? Thanks. Yours, >> > > SUSv3 is definitive on the subject: > A lock shall be set to extend to the largest possible value of the file > offset for that file by setting l_len to 0. If such a lock also has > l_start set to 0 and l_whence is set to SEEK_SET, the whole file shall > be locked. > I would not say, this is definitive -- if one attempts to grow a locked file, "the whole file" (as existed at the lock-time) will remain non-violated... The code is more explicit, of course: > From sys/kern/kern_lockf.c, line 464: > } else if (fl->l_len == 0) { > end = OFF_MAX; > So, how can one properly lock only the area, that exists at the time of locking? Perform a stat() first? Thanks! -mi