linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Colin Walters" <walters@verbum.org>
To: "Javier Martinez Canillas" <javierm@redhat.com>,
	linux-kernel@vger.kernel.org
Cc: "Peter Jones" <pjones@redhat.com>,
	"Alexander Larsson" <alexl@redhat.com>,
	"Alberto Ruiz" <aruiz@redhat.com>,
	"Christian Kellner" <ckellner@redhat.com>,
	"Lennart Poettering" <lennart@poettering.net>,
	"Chung-Chiang Cheng" <cccheng@synology.com>,
	"OGAWA Hirofumi" <hirofumi@mail.parknet.co.jp>
Subject: Re: [RFC PATCH 2/3] fat: add renameat2 RENAME_EXCHANGE flag support
Date: Mon, 23 May 2022 06:40:30 -0400	[thread overview]
Message-ID: <7963aad6-203c-4da4-ba9f-cf716d350121@www.fastmail.com> (raw)
In-Reply-To: <20220519092343.2776414-3-javierm@redhat.com>

On Thu, May 19, 2022, at 5:23 AM, Javier Martinez Canillas wrote:
> The renameat2 RENAME_EXCHANGE flag allows to atomically exchange two paths
> but is currently not supported by the Linux vfat filesystem driver.
>
> Add a vfat_rename_exchange() helper function that implements this support.
>
> The super block lock is acquired during the operation to ensure atomicity,
> and in the error path actions made are reversed also with the mutex held,
> making the whole operation transactional.

Transactional with respect to the mounted kernel, but AIUI because vfat does not have journaling, the semantics on hard failure are...unspecified?  Is it possible for example we could see no file at all in the destination path?

This relates to https://github.com/ostreedev/ostree/issues/1951

TL;DR I'd been thinking that in order to have things be maximally robust we need to:

1. Write new desired bootloader config
2. fsync it
3. fsync containing directory (I guess for vfat really, syncfs())
4. remove old config, syncfs()

And here the bootloader would know to prefer the "new" file if it exists, and to delete the old one if it's still present on the next boot.

(Now obviously this is a small patch which will surely be generally useful, e.g. for tools that operate on things like mounted USB sticks, being able to do an atomic exchange at least from the running kernel PoV is just as useful as it is on other "regular" (and journaled) mounted filesystems)

So assuming we have this, I guess the flow could be:

1. rename_exchange(old, new)
2. syncfs()

?  But that's assuming that the implementation of this doesn't e.g. have any "holes" where in theory we could flush an intermediate state.



  parent reply	other threads:[~2022-05-23 10:41 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-19  9:23 [RFC PATCH 0/3] fat: add support for the renameat2 RENAME_EXCHANGE flag Javier Martinez Canillas
2022-05-19  9:23 ` [RFC PATCH 1/3] fat: add a vfat_rename2() and make existing .rename callback a helper Javier Martinez Canillas
2022-05-19  9:23 ` [RFC PATCH 2/3] fat: add renameat2 RENAME_EXCHANGE flag support Javier Martinez Canillas
2022-05-22 17:42   ` OGAWA Hirofumi
2022-05-23 15:35     ` Javier Martinez Canillas
2022-05-23 10:40   ` Colin Walters [this message]
2022-05-23 15:34     ` Javier Martinez Canillas
2022-05-23 17:05       ` OGAWA Hirofumi
2022-05-19  9:23 ` [RFC PATCH 3/3] selftests/filesystems: add a vfat RENAME_EXCHANGE test Javier Martinez Canillas
2022-05-21 13:38   ` Muhammad Usama Anjum

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=7963aad6-203c-4da4-ba9f-cf716d350121@www.fastmail.com \
    --to=walters@verbum.org \
    --cc=alexl@redhat.com \
    --cc=aruiz@redhat.com \
    --cc=cccheng@synology.com \
    --cc=ckellner@redhat.com \
    --cc=hirofumi@mail.parknet.co.jp \
    --cc=javierm@redhat.com \
    --cc=lennart@poettering.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pjones@redhat.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).