File 3011-kernel-Introduce-file-delete-2-supporting-raw-option.patch of Package erlang

From 33963ee94429de168fc62b485799450578ade84a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9r=C3=B4me=20de=20Bretagne?=
 <jerome.debretagne@gmail.com>
Date: Sun, 17 May 2020 12:19:21 +0200
Subject: [PATCH] kernel: Introduce file:delete/2 supporting 'raw' option

Some functions in the file module can pass a 'raw' option
to run locally with direct file access, bypassing the
registered file_server. There was no such possibility
when deleting files so introduce a new file:delete/2
function supporting the same 'raw' option.

Add its documentation and add a test in file_SUITE.

https://bugs.erlang.org/browse/ERL-1244
---
 lib/kernel/doc/src/file.xml    |  6 ++++++
 lib/kernel/src/file.erl        | 27 ++++++++++++++++++++++++---
 lib/kernel/test/file_SUITE.erl | 15 +++++++++++++++
 3 files changed, 45 insertions(+), 3 deletions(-)

diff --git a/lib/kernel/doc/src/file.xml b/lib/kernel/doc/src/file.xml
index 77d01925ec..9d962dc5c7 100644
--- a/lib/kernel/doc/src/file.xml
+++ b/lib/kernel/doc/src/file.xml
@@ -379,10 +379,16 @@ f.txt:  {person, "kalle", 25}.
     </func>
     <func>
       <name name="delete" arity="1"/>
+      <name name="delete" arity="2"/>
       <fsummary>Delete a file.</fsummary>
+      <type name="delete_option"/>
       <desc>
         <p>Tries to delete file <c><anno>Filename</anno></c>.
           Returns <c>ok</c> if successful.</p>
+        <p>If the option <c>raw</c> is set, the file server is not called.
+           This can be useful in particular during the early boot stage when
+           the file server is not yet registered, to still be able to delete
+           local files.</p>
         <p>Typical error reasons:</p>
         <taglist>
           <tag><c>enoent</c></tag>
diff --git a/lib/kernel/src/file.erl b/lib/kernel/src/file.erl
index 8abfb3ef35..860b8ecc84 100644
--- a/lib/kernel/src/file.erl
+++ b/lib/kernel/src/file.erl
@@ -27,7 +27,7 @@
 
 -export([format_error/1]).
 %% File system and metadata.
--export([get_cwd/0, get_cwd/1, set_cwd/1, delete/1, rename/2,
+-export([get_cwd/0, get_cwd/1, set_cwd/1, delete/1, delete/2, rename/2,
 	 make_dir/1, del_dir/1, list_dir/1, list_dir_all/1,
 	 read_file_info/1, read_file_info/2,
 	 write_file_info/2, write_file_info/3,
@@ -112,10 +112,11 @@
 -type date_time() :: calendar:datetime().
 -type posix_file_advise() :: 'normal' | 'sequential' | 'random'
                            | 'no_reuse' | 'will_need' | 'dont_need'.
+-type delete_option() :: 'raw'.
 -type sendfile_option() :: {chunk_size, non_neg_integer()}
 			 | {use_threads, boolean()}.
--type file_info_option() :: {'time', 'local'} | {'time', 'universal'} 
-			  | {'time', 'posix'} | raw.
+-type file_info_option() :: {'time', 'local'} | {'time', 'universal'}
+			  | {'time', 'posix'} | 'raw'.
 %%% BIFs
 
 -export([native_name_encoding/0]).
@@ -206,6 +207,26 @@ set_cwd(Dirname) ->
 delete(Name) ->
     check_and_call(delete, [file_name(Name)]).
 
+-spec delete(Filename, Opts) -> ok | {error, Reason} when
+      Filename :: name_all(),
+      Opts :: [delete_option()],
+      Reason :: posix() | badarg.
+
+delete(Name, Opts) when is_list(Opts) ->
+    Args = [file_name(Name), Opts],
+    case check_args(Args) of
+        ok ->
+            case lists:member(raw, Opts) of
+                true ->
+                    [FileName|_] = Args,
+                    ?PRIM_FILE:delete(FileName);
+                false ->
+                    call(delete, Args)
+            end;
+        Error ->
+            Error
+    end.
+
 -spec rename(Source, Destination) -> ok | {error, Reason} when
       Source :: name_all(),
       Destination :: name_all(),
diff --git a/lib/kernel/test/file_SUITE.erl b/lib/kernel/test/file_SUITE.erl
index 52ef711008..eafd4f38dd 100644
--- a/lib/kernel/test/file_SUITE.erl
+++ b/lib/kernel/test/file_SUITE.erl
@@ -2313,6 +2313,21 @@ delete(Config) when is_list(Config) ->
     {error, _} = ?FILE_MODULE:open(Name, read),
     %% Try deleting a nonexistent file
     {error, enoent} = ?FILE_MODULE:delete(Name),
+    Name2 = filename:join(RootDir,
+                          atom_to_list(?MODULE)
+                          ++"_delete_2.fil"),
+    {ok, Fd3} = ?FILE_MODULE:open(Name2, write),
+    io:format(Fd3,"ok.\n",[]),
+    ok = ?FILE_MODULE:close(Fd3),
+    %% Check that the file is readable
+    {ok, Fd4} = ?FILE_MODULE:open(Name2, read),
+    ok = ?FILE_MODULE:close(Fd4),
+    %% Try deleting with the raw option
+    ok = ?FILE_MODULE:delete(Name2, [raw]),
+    %% Check that the file is not readable anymore
+    {error, _} = ?FILE_MODULE:open(Name2, read),
+    %% Try deleting a nonexistent file with the raw option
+    {error, enoent} = ?FILE_MODULE:delete(Name2, [raw]),
     [] = flush(),
     ok.
 
-- 
2.26.2

openSUSE Build Service is sponsored by