bug-coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#62404: --reflink=auto not falling back appropriately on older kernel


From: Paul Eggert
Subject: bug#62404: --reflink=auto not falling back appropriately on older kernels
Date: Thu, 23 Mar 2023 15:57:16 -0700
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.9.0

Thanks for looking into this.

On 3/23/23 07:55, Pádraig Brady wrote:

Perhaps we should use the above __ANDROID__ logic in all cases,
so that we fallback unless there is a specific reason not to.

Yes, that sounds better.

+/* Whether the errno indicates operation is a transient failure.
+   I.e., a failure that would indicate the operation _is_ supported,
+   but has failed in a terminal way.  */

I got confused by the terminology here, as "transient failure" has the opposite connotation from terminal failure. I suggest that we remove the function (since it's used only once and its name is confusing) and replace its calling code as suggested below.


-            if (errno == EPERM && *total_n_read == 0)
+            if (is_CLONENOTSUP (errno, *total_n_read))

The *total_n_read should be *total_n_read != 0 partly for style and partly to be portable to ancient compilers that don't properly support bool. More important, I suggest leaving is_CLONENOTSUP's API as-is, and changing the 'if' to:

   if (*total_n_read == 0 && is_CLONENOTSUP (errno))

as I don't see why we should treat EPERM differently from ENOSYS etc.


 /* Whether the errno from FICLONE, or copy_file_range
    indicates operation is not supported for this file or file system.  */
static bool
-is_CLONENOTSUP (int err)
+is_CLONENOTSUP (int err, bool partial)

Since the code no longer calls is_CLONENOTSUP when FICLONE fails, the comment should be changed to not mention FICLONE.


+  /* If the clone operation is not creating the destination (i.e., FICLONE)
+     then we could possibly be more restrictive with errors deemed non 
terminal.
+     However doing that like in the following
+     would be more coupled to disparate errno handling on various systems.
+     if (0 <= dest_desc)
+       transient_failure = ! is_CLONENOTSUP (errno, false);  */
+  bool transient_failure = is_transient_failure (errno);

I had trouble with those two "transient_failure"s lining up, plus the terminology thing mentioned above. I suggest changing this to:

  /* When FICLONE fails, report failure only with errno values known
     to mean trouble when FICLONE is supported and called properly.
     Do do not report failure merely because !is_CLONENOTSUP (errno),
     as too many systems yield oddball errno values here.  */
  bool report_failure = (errno == EIO || errno == ENOMEM
                         || errno == ENOSPC || errno == EDQUOT);

and then replace all occurrences of "transient_failure" with "report_failure".





reply via email to

[Prev in Thread] Current Thread [Next in Thread]