All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dave Chinner <david@fromorbit.com>
To: Juliusz Chroboczek <jch@pps.jussieu.fr>
Cc: linux-kernel@vger.kernel.org
Subject: Re: Write is not atomic?
Date: Tue, 16 Oct 2012 10:13:02 +1100	[thread overview]
Message-ID: <20121015231302.GF2739@dastard> (raw)
In-Reply-To: <7i391fto34.fsf@lanthane.pps.jussieu.fr>

On Mon, Oct 15, 2012 at 11:36:15PM +0200, Juliusz Chroboczek wrote:
> Hi,
> 
> The Linux manual page for write(2) says:
> 
>     The adjustment of the file offset and the write operation are
>     performed as an atomic step.

That's wrong. The file offset update is not synchronised at all with
the write, and for a shared fd the update will race.


> This is apparently an extension to POSIX, which says
> 
>     This volume of IEEE Std 1003.1-2001 does not specify behavior of
>     concurrent writes to a file from multiple processes. Applications
>     should use some form of concurrency control.

This is how Linux behaves.

> The following fragment of code
> 
>     int fd;
>     fd = open("exemple", O_CREAT | O_WRONLY | O_TRUNC, 0666);
>     fork();
>     write(fd, "Ouille", 6);
>     close(fd);
> 
> produces "OuilleOuille", as expected, on ext4 on two machines running
> Linux 3.2 AMD64.  However, over XFS on an old Pentium III at 500 MHz
> running 2.6.32, it produces just "Ouille" roughly once in three times.

ext4, on 3.6:

$ for i in `seq 0 10000`; do ./a.out ; cat /mnt/scratch/foo ; echo ; done | sort |uniq -c
     39 Ouille
   9962 OuilleOuille
$

XFS, on the same kernel, hardware and block device:

$ for i in `seq 0 10000`; do ./a.out ; cat /mnt/scratch/foo ; echo ; done | sort |uniq -c
     40 Ouille
   9961 OuilleOuille
$

So both filesystems behave according to the POSIX definition of
concurrent writes....

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

  parent reply	other threads:[~2012-10-15 23:13 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-15 21:36 Write is not atomic? Juliusz Chroboczek
2012-10-15 22:21 ` Max Filippov
2012-10-15 23:36   ` Juliusz Chroboczek
2012-10-15 23:13 ` Dave Chinner [this message]
2012-10-15 23:24   ` Philippe Troin
2012-10-15 23:42     ` Max Filippov
2012-10-15 23:40 ` Jochen Striepe
2012-10-16  6:21   ` Juliusz Chroboczek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20121015231302.GF2739@dastard \
    --to=david@fromorbit.com \
    --cc=jch@pps.jussieu.fr \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.