Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 26 Aug 2009 09:57:04 -0400
From:      "Mikhail T." <mi+thun@aldan.algebra.com>
To:        Kostik Belousov <kostikbel@gmail.com>
Cc:        freebsd-fs@freebsd.org
Subject:   Re: semantics of fcntl() with l_len being 0
Message-ID:  <4A953F30.8030202@aldan.algebra.com>
In-Reply-To: <20090826090947.GS9623@deviant.kiev.zoral.com.ua>
References:  <4A94B829.3090202@aldan.algebra.com> <20090826090947.GS9623@deviant.kiev.zoral.com.ua>

next in thread | previous in thread | raw e-mail | index | archive | help
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




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