2020-05-03 13:00:57

by Jonny Grant

[permalink] [raw]
Subject: /fs/ext4/namei.c ext4_find_dest_de()

Hi

I noticed that mkdir() returns EEXIST if a directory already exists.
strerror(EEXIST) text is "File exists"

Can ext4_find_dest_de() be amended to return EISDIR if a directory
already exists? This will make the error message clearer.

This is the line of code from ext4_find_dest_de():

if (ext4_match(dir, fname, de))
return -EEXIST;



I propose to change to something like the following:


int ext4_match_result = ext4_match(dir, fname, de);

nlen = EXT4_DIR_REC_LEN(de->name_len);
rlen = ext4_rec_len_from_disk(de->rec_len, buf_size);
if ((de->inode ? rlen - nlen : rlen) >= reclen)
break;
de = (struct ext4_dir_entry_2 *)((char *)de + rlen);

if (ext4_match_result)
{
if(EXT4_FT_DIR == de->file_type)
{
return -EISDIR;
}
else
{
return -EEXIST;
}
}



Let me know if this would be supported, and I can prepare a patch.

Cheers
Jonny


2020-05-04 01:53:01

by Theodore Y. Ts'o

[permalink] [raw]
Subject: Re: /fs/ext4/namei.c ext4_find_dest_de()

On Sun, May 03, 2020 at 02:00:25PM +0100, Jonny Grant wrote:
> Hi
>
> I noticed that mkdir() returns EEXIST if a directory already exists.
> strerror(EEXIST) text is "File exists"
>
> Can ext4_find_dest_de() be amended to return EISDIR if a directory already
> exists? This will make the error message clearer.

No; this will confuse potentially a large number of existing programs.
Also, the current behavior is required by POSIx and the Single Unix
Specification standards.

https://pubs.opengroup.org/onlinepubs/009695399/

Regards,

- Ted

2020-05-04 07:41:56

by Jonny Grant

[permalink] [raw]
Subject: Re: /fs/ext4/namei.c ext4_find_dest_de()



On 04/05/2020 02:51, Theodore Y. Ts'o wrote:
> On Sun, May 03, 2020 at 02:00:25PM +0100, Jonny Grant wrote:
>> Hi
>>
>> I noticed that mkdir() returns EEXIST if a directory already exists.
>> strerror(EEXIST) text is "File exists"
>>
>> Can ext4_find_dest_de() be amended to return EISDIR if a directory already
>> exists? This will make the error message clearer.
>
> No; this will confuse potentially a large number of existing programs.
> Also, the current behavior is required by POSIx and the Single Unix
> Specification standards.
>
> https://pubs.opengroup.org/onlinepubs/009695399/
>
> Regards,
>
> - Ted

Hi,

Is it likely POSIX would introduce this change? It's a shame we're still
constrained by old standards (SVr4, BSD), but it's fine if they can be
updated.

As developer, I can see it feels more confusing for users as it is.
This issue shows up in various programs.

$ mkdir test
$ mkdir test
mkdir: cannot create directory ‘test’: File exists


I would expect it to be clear for users:

$ mkdir test
$ mkdir test
mkdir: cannot create directory ‘test’: Is a directory


The 'mkdir' team don't want to add a call to stat() to give a more
appropriate error message.

Cheers, Jonny