From: Krzysztof PƂocharz Date: Mon, 27 Jan 2025 16:20:47 +0000 (+0100) Subject: Fix --open-noatime option not working on files X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=992e10efaf42d9ec3dd43431350accf1becc1d00;p=thirdparty%2Frsync.git Fix --open-noatime option not working on files atime of source files could sometimes be overwritten even though --open-noatime option was used. To fix that, optional O_NOATIME flag was added to do_open_nofollow which is also used to open regular files since fix: "fixed symlink race condition in sender" Previously optional O_NOATIME flag was only in do_open. --- diff --git a/syscall.c b/syscall.c index 34a9bba0..2287e16e 100644 --- a/syscall.c +++ b/syscall.c @@ -683,6 +683,11 @@ int do_open_nofollow(const char *pathname, int flags) #endif } +#ifdef O_NOATIME + if (open_noatime) + flags |= O_NOATIME; +#endif + #ifdef O_NOFOLLOW fd = open(pathname, flags|O_NOFOLLOW); #else diff --git a/testsuite/open-noatime.test b/testsuite/open-noatime.test new file mode 100644 index 00000000..9cc4b22d --- /dev/null +++ b/testsuite/open-noatime.test @@ -0,0 +1,26 @@ +#!/bin/sh + +# Test rsync --open-noatime option keeps source atimes intact + +. "$suitedir/rsync.fns" + +$RSYNC -VV | grep '"atimes": true' >/dev/null || test_skipped "Rsync is configured without atimes support" + +mkdir "$fromdir" + +# --open-noatime did not work properly on files with size > 0 +echo content > "$fromdir/foo" +touch -a -t 200102031717.42 "$fromdir/foo" + +TLS_ARGS=--atimes + +"$TOOLDIR/tls" $TLS_ARGS "$fromdir/foo" > "$tmpdir/atime-from-before" + +# Do not use checkit because it uses "diff" which breaks atimes +$RSYNC --open-noatime --archive --recursive --times --atimes -vvv "$fromdir/" "$todir/" + +"$TOOLDIR/tls" $TLS_ARGS "$fromdir/foo" > "$tmpdir/atime-from-after" +diff "$tmpdir/atime-from-before" "$tmpdir/atime-from-after" + +# The script would have aborted on error, so getting here means we've won. +exit 0