From: "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
To: git@vger.kernel.org
Cc: tytso@mit.edu, "Junio C Hamano" <gitster@pobox.com>,
"Christoph Hellwig" <hch@lst.de>,
"Linus Torvalds" <torvalds@linux-foundation.org>,
linux-fsdevel <linux-fsdevel@vger.kernel.org>,
"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
Subject: [RFC PATCH 1/2] sha1-file: fsync() loose dir entry when core.fsyncObjectFiles
Date: Thu, 17 Sep 2020 13:28:29 +0200 [thread overview]
Message-ID: <20200917112830.26606-2-avarab@gmail.com> (raw)
In-Reply-To: <87sgbghdbp.fsf@evledraar.gmail.com>
Change the behavior of core.fsyncObjectFiles to also sync the
directory entry. I don't have a case where this broke, just going by
paranoia and the fsync(2) manual page's guarantees about its behavior.
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---
sha1-file.c | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/sha1-file.c b/sha1-file.c
index dd65bd5c68..d286346921 100644
--- a/sha1-file.c
+++ b/sha1-file.c
@@ -1784,10 +1784,14 @@ int hash_object_file(const struct git_hash_algo *algo, const void *buf,
}
/* Finalize a file on disk, and close it. */
-static void close_loose_object(int fd)
+static void close_loose_object(int fd, const struct strbuf *dirname)
{
- if (fsync_object_files)
+ int dirfd;
+ if (fsync_object_files) {
fsync_or_die(fd, "loose object file");
+ dirfd = xopen(dirname->buf, O_RDONLY);
+ fsync_or_die(dirfd, "loose object directory");
+ }
if (close(fd) != 0)
die_errno(_("error when closing loose object file"));
}
@@ -1808,12 +1812,15 @@ static inline int directory_size(const char *filename)
* We want to avoid cross-directory filename renames, because those
* can have problems on various filesystems (FAT, NFS, Coda).
*/
-static int create_tmpfile(struct strbuf *tmp, const char *filename)
+static int create_tmpfile(struct strbuf *tmp,
+ const char *filename,
+ struct strbuf *dirname)
{
int fd, dirlen = directory_size(filename);
strbuf_reset(tmp);
strbuf_add(tmp, filename, dirlen);
+ strbuf_add(dirname, filename, dirlen);
strbuf_addstr(tmp, "tmp_obj_XXXXXX");
fd = git_mkstemp_mode(tmp->buf, 0444);
if (fd < 0 && dirlen && errno == ENOENT) {
@@ -1848,10 +1855,11 @@ static int write_loose_object(const struct object_id *oid, char *hdr,
struct object_id parano_oid;
static struct strbuf tmp_file = STRBUF_INIT;
static struct strbuf filename = STRBUF_INIT;
+ static struct strbuf dirname = STRBUF_INIT;
loose_object_path(the_repository, &filename, oid);
- fd = create_tmpfile(&tmp_file, filename.buf);
+ fd = create_tmpfile(&tmp_file, filename.buf, &dirname);
if (fd < 0) {
if (errno == EACCES)
return error(_("insufficient permission for adding an object to repository database %s"), get_object_directory());
@@ -1897,7 +1905,8 @@ static int write_loose_object(const struct object_id *oid, char *hdr,
die(_("confused by unstable object source data for %s"),
oid_to_hex(oid));
- close_loose_object(fd);
+ close_loose_object(fd, &dirname);
+ strbuf_release(&dirname);
if (mtime) {
struct utimbuf utb;
--
2.28.0.297.g1956fa8f8d
next prev parent reply other threads:[~2020-09-17 11:35 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-17 18:48 [PATCH] enable core.fsyncObjectFiles by default Christoph Hellwig
2018-01-17 19:04 ` Junio C Hamano
2018-01-17 19:35 ` Christoph Hellwig
2018-01-17 19:35 ` Christoph Hellwig
2018-01-17 20:05 ` Andreas Schwab
2018-01-17 19:37 ` Matthew Wilcox
2018-01-17 19:42 ` Christoph Hellwig
2018-01-17 21:44 ` Ævar Arnfjörð Bjarmason
2018-01-17 22:07 ` Linus Torvalds
2018-01-17 22:25 ` Linus Torvalds
2018-01-17 23:16 ` Ævar Arnfjörð Bjarmason
2018-01-17 23:42 ` Linus Torvalds
2018-01-17 23:52 ` Theodore Ts'o
2018-01-17 23:57 ` Linus Torvalds
2018-01-18 16:27 ` Christoph Hellwig
2018-01-19 19:08 ` Junio C Hamano
2018-01-20 22:14 ` Theodore Ts'o
2018-01-20 22:27 ` Junio C Hamano
2018-01-22 15:09 ` Ævar Arnfjörð Bjarmason
2018-01-22 18:09 ` Theodore Ts'o
2018-01-22 18:09 ` Theodore Ts'o
2018-01-23 0:47 ` Jeff King
2018-01-23 5:45 ` Theodore Ts'o
2018-01-23 5:45 ` Theodore Ts'o
2018-01-23 16:17 ` Jeff King
2018-01-23 0:25 ` Jeff King
2018-01-21 21:32 ` Chris Mason
2020-09-17 11:06 ` Ævar Arnfjörð Bjarmason
2020-09-17 11:28 ` [RFC PATCH 0/2] should core.fsyncObjectFiles fsync the dir entry + docs Ævar Arnfjörð Bjarmason
2020-09-17 11:28 ` Ævar Arnfjörð Bjarmason [this message]
2020-09-17 13:16 ` [RFC PATCH 1/2] sha1-file: fsync() loose dir entry when core.fsyncObjectFiles Jeff King
2020-09-17 15:09 ` Christoph Hellwig
2020-09-17 14:09 ` Christoph Hellwig
2020-09-17 14:55 ` Jeff King
2020-09-17 14:56 ` Christoph Hellwig
2020-09-17 15:37 ` Junio C Hamano
2020-09-17 17:12 ` Jeff King
2020-09-17 20:37 ` Taylor Blau
2020-09-22 10:42 ` Ævar Arnfjörð Bjarmason
2020-09-17 20:21 ` Johannes Sixt
2020-09-22 8:24 ` Ævar Arnfjörð Bjarmason
2020-11-19 11:38 ` Johannes Schindelin
2020-09-17 11:28 ` [RFC PATCH 2/2] core.fsyncObjectFiles: make the docs less flippant Ævar Arnfjörð Bjarmason
2020-09-17 14:12 ` Christoph Hellwig
2020-09-17 15:43 ` Junio C Hamano
2020-09-17 20:15 ` Johannes Sixt
2020-10-08 8:13 ` Johannes Schindelin
2020-10-08 15:57 ` Ævar Arnfjörð Bjarmason
2020-10-08 18:53 ` Junio C Hamano
2020-10-09 10:44 ` Johannes Schindelin
2020-09-17 19:21 ` Marc Branchaud
2020-09-17 14:14 ` [PATCH] enable core.fsyncObjectFiles by default Christoph Hellwig
2020-09-17 15:30 ` Junio C Hamano
2018-01-17 20:55 ` Jeff King
2018-01-17 21:10 ` Christoph Hellwig
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=20200917112830.26606-2-avarab@gmail.com \
--to=avarab@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=hch@lst.de \
--cc=linux-fsdevel@vger.kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=tytso@mit.edu \
/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.