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