[erlang-questions] Maybe potential incompatibility of file_info record
Shunichi Shinohara
shino.shun@REDACTED
Thu Jun 7 10:38:36 CEST 2018
Thanks a lot!!
2018-06-07 17:35 GMT+09:00 Björn Gustavsson <bjorn@REDACTED>:
> Thanks for digging deeper.
>
> The old efile_driver has been rewritten and
> replaced with a NIF. I am not sure whether
> this change is an oversight/bug or a deliberate
> change. We will look into it before the release
> of OTP 21 and either fix the bug or add a
> note about the potential incompatibility.
>
> /Björn
>
>
>
> On Thu, Jun 7, 2018 at 8:52 AM, Shunichi Shinohara <shino.shun@REDACTED> wrote:
>> I looked into the source code and I think the difference between 20
>> and 21.0-rc2 is identified.
>>
>> # The subject of this thread is not suitable,
>> # but please let me report to not leave just a wrong information.
>>
>> First, the difference between OTP 20.3.4 and 21.0-rc2 is as follows.
>> (on macOS, OTPs are installed from git by kerl)
>>
>> Setup file a and b, a is owned by root user.
>> % rm -f a && rm -f b && sudo touch a && sudo chmod 755 a && touch b
>>
>> Let's start OTP 21.0-rc2 and read file_info of a and write it to b,
>> it fails:
>> % ~/local/otp/OTP-21.0-rc2/bin/erl
>> Erlang/OTP 21 [RELEASE CANDIDATE 2] [erts-10.0] [source] [64-bit]
>> [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe] [sharing-preserving]
>>
>> Eshell V10.0 (abort with ^G)
>> 1> {ok, Fi} = file:read_file_info("a").
>> {ok,#file_info{size = 0,type = regular,access = read,
>> atime = {{2018,6,7},{15,32,41}},
>> mtime = {{2018,6,7},{15,32,41}},
>> ctime = {{2018,6,7},{15,32,41}},
>> mode = 33261,links = 1,major_device = 16777220,
>> minor_device = 0,inode = 17846256,uid = 0,gid = 20}}
>> 2> file:write_file_info("b", Fi).
>> {error,eperm}
>>
>> Then, start OTP 20.3.4 and replay the same step, it succeeds:
>> % ~/local/otp/OTP-20.3.4/bin/erl
>> Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:8:8] [ds:8:8:10]
>> [async-threads:10] [hipe] [kernel-poll:false]
>>
>> Eshell V9.3 (abort with ^G)
>> 1> {ok, F} = file:read_file_info("a").
>> {ok,#file_info{size = 0,type = regular,access = read,
>> atime = {{2018,6,7},{15,32,41}},
>> mtime = {{2018,6,7},{15,32,41}},
>> ctime = {{2018,6,7},{15,32,41}},
>> mode = 33261,links = 1,major_device = 16777220,
>> minor_device = 0,inode = 17846256,uid = 0,gid = 20}}
>> 2> file:write_file_info("b", F).
>> ok
>>
>> The file_info records are the same (sorry again...), but the results differ.
>>
>> Looking into unix_efile.c on maint-20 branch:
>> https://github.com/erlang/otp/blob/maint-20/erts/emulator/drivers/unix/unix_efile.c#L572
>> it ignores eperm error and proceeds forward:
>> if (chown(name, pInfo->uid, pInfo->gid) && errno != EPERM) {
>>
>> I'm not sure the difference is judged as incompatibility or not,
>> it's nice if this note helps someone (including future me).
>>
>> Thanks,
>> Shino
>>
>> 2018-06-07 15:07 GMT+09:00 Shunichi Shinohara <shino.shun@REDACTED>:
>>> I'm sorry I was wrong. Thanks for correct me, Bjorn.
>>> I have to dig the root cause down ;)
>>>
>>> Shino
>>>
>>> 2018-06-07 15:04 GMT+09:00 Björn Gustavsson <bjorn@REDACTED>:
>>>> On Thu, Jun 7, 2018 at 7:39 AM, Shunichi Shinohara <shino.shun@REDACTED> wrote:
>>>> [...]
>>>>> It seems that some fields are added to file_info record between 20 and 21-rc2,
>>>>
>>>> "Seems"?
>>>>
>>>> No fields have been added for a very long time. The only
>>>> modifications done in recent releases are updates
>>>> to the types of the existing fields. The last such change
>>>> was made at the end of 2015.
>>>>
>>>> /Bjorn
>>>>
>>>> --
>>>> Björn Gustavsson, Erlang/OTP, Ericsson AB
>
>
>
> --
> Björn Gustavsson, Erlang/OTP, Ericsson AB
More information about the erlang-questions
mailing list