Subject: bug#56391: `cp --reflink=always` creates empty file on failure

From: Pádraig Brady <[email-masked]>
Date: Thu, 7 Jul 2022 16:39:44 +0100

forcemerge 56391 56392
close 56391
stop

On 06/07/2022 20:48, Paul Eggert wrote:
> On 7/6/22 06:17, Pádraig Brady wrote:
>> This will usually work, but there are cases where this may lose data,
>> as previously discussed at:
>>
>> https://bugzilla.redhat.com/show_bug.cgi?id=921708
>> http://lists.gnu.org/archive/html/coreutils/2013-03/msg00056.html
>>
>> I'm not sure cp can robustly clean up in this situation?
> 
> Thanks for pointing me to those old discussions. As I understand it, the
> worry is that FICLONE will only partly succeed, causing the destination
> file to contain some (but not all) the input data, and then if we remove
> the output file we'll lose the newly-made partial clone. I don't know
> whether FICLONE can do that, but it sounds like a reasonable worry.
> 
> If that understanding is correct, then the attached further patch should
> suffice, so I boldly installed it.

Yes that's better thanks.
The code looks good, and should cater for any issues
within a single cp instance.

As for overlapping processes accessing a file, this may introduce
new edge cases for where a file will be deleted. But I don't see
a specific issue with that, given there are existing truncation
races etc. with overlapping access to a file.  I haven't thought
through all scenarios TBH.

marking this as done.

thanks!
Pádraig