2022-02-09 07:16:38

by Trond Myklebust

[permalink] [raw]
Subject: [PATCH] NFS: LOOKUP_DIRECTORY is also ok with symlinks

From: Trond Myklebust <[email protected]>

Commit ac795161c936 (NFSv4: Handle case where the lookup of a directory
fails) [1], part of Linux since 5.17-rc2, introduced a regression, where
a symbolic link on an NFS mount to a directory on another NFS does not
resolve(?) the first time it is accessed:

Reported-by: Paul Menzel <[email protected]>
Fixes: ac795161c936 ("NFSv4: Handle case where the lookup of a directory fails")
Signed-off-by: Trond Myklebust <[email protected]>
---
fs/nfs/dir.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index e128503728f2..6dee4e12d381 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -2051,14 +2051,14 @@ int nfs_atomic_open(struct inode *dir, struct dentry *dentry,
if (!res) {
inode = d_inode(dentry);
if ((lookup_flags & LOOKUP_DIRECTORY) && inode &&
- !S_ISDIR(inode->i_mode))
+ !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)))
res = ERR_PTR(-ENOTDIR);
else if (inode && S_ISREG(inode->i_mode))
res = ERR_PTR(-EOPENSTALE);
} else if (!IS_ERR(res)) {
inode = d_inode(res);
if ((lookup_flags & LOOKUP_DIRECTORY) && inode &&
- !S_ISDIR(inode->i_mode)) {
+ !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) {
dput(res);
res = ERR_PTR(-ENOTDIR);
} else if (inode && S_ISREG(inode->i_mode)) {
--
2.34.1



2022-02-09 23:31:59

by Paul Menzel

[permalink] [raw]
Subject: Re: [PATCH] NFS: LOOKUP_DIRECTORY is also ok with symlinks

Dear Trond,


Am 08.02.22 um 19:38 schrieb [email protected]:
> From: Trond Myklebust <[email protected]>
>
> Commit ac795161c936 (NFSv4: Handle case where the lookup of a directory
> fails) [1], part of Linux since 5.17-rc2, introduced a regression, where
> a symbolic link on an NFS mount to a directory on another NFS does not
> resolve(?) the first time it is accessed:
>
> Reported-by: Paul Menzel <[email protected]>
> Fixes: ac795161c936 ("NFSv4: Handle case where the lookup of a directory fails")
> Signed-off-by: Trond Myklebust <[email protected]>

Thank you for fixing it so quickly. My colleague verified, that it fixes
our issue.

Tested-by: Donald Buczek <[email protected]>


Kind regards,

Paul


> ---
> fs/nfs/dir.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
> index e128503728f2..6dee4e12d381 100644
> --- a/fs/nfs/dir.c
> +++ b/fs/nfs/dir.c
> @@ -2051,14 +2051,14 @@ int nfs_atomic_open(struct inode *dir, struct dentry *dentry,
> if (!res) {
> inode = d_inode(dentry);
> if ((lookup_flags & LOOKUP_DIRECTORY) && inode &&
> - !S_ISDIR(inode->i_mode))
> + !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)))
> res = ERR_PTR(-ENOTDIR);
> else if (inode && S_ISREG(inode->i_mode))
> res = ERR_PTR(-EOPENSTALE);
> } else if (!IS_ERR(res)) {
> inode = d_inode(res);
> if ((lookup_flags & LOOKUP_DIRECTORY) && inode &&
> - !S_ISDIR(inode->i_mode)) {
> + !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) {
> dput(res);
> res = ERR_PTR(-ENOTDIR);
> } else if (inode && S_ISREG(inode->i_mode)) {

2022-02-11 20:05:41

by Paul Menzel

[permalink] [raw]
Subject: Re: [PATCH] NFS: LOOKUP_DIRECTORY is also ok with symlinks

#regzbot monitor:
https://lore.kernel.org/linux-nfs/[email protected]/

Dear Trond,


Am 09.02.22 um 23:02 schrieb Paul Menzel:

> Am 08.02.22 um 19:38 schrieb [email protected]:
>> From: Trond Myklebust <[email protected]>
>>
>> Commit ac795161c936 (NFSv4: Handle case where the lookup of a directory
>> fails) [1], part of Linux since 5.17-rc2, introduced a regression, where
>> a symbolic link on an NFS mount to a directory on another NFS does not
>> resolve(?) the first time it is accessed:
>>
>> Reported-by: Paul Menzel <[email protected]>
>> Fixes: ac795161c936 ("NFSv4: Handle case where the lookup of a
>> directory fails")
>> Signed-off-by: Trond Myklebust <[email protected]>
>
> Thank you for fixing it so quickly. My colleague verified, that it fixes
> our issue.
>
> Tested-by: Donald Buczek <[email protected]>

Also for regzbot:

Link:
https://lore.kernel.org/linux-nfs/[email protected]/


Kind regards,

Paul


>> ---
>>   fs/nfs/dir.c | 4 ++--
>>   1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
>> index e128503728f2..6dee4e12d381 100644
>> --- a/fs/nfs/dir.c
>> +++ b/fs/nfs/dir.c
>> @@ -2051,14 +2051,14 @@ int nfs_atomic_open(struct inode *dir, struct
>> dentry *dentry,
>>       if (!res) {
>>           inode = d_inode(dentry);
>>           if ((lookup_flags & LOOKUP_DIRECTORY) && inode &&
>> -            !S_ISDIR(inode->i_mode))
>> +            !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)))
>>               res = ERR_PTR(-ENOTDIR);
>>           else if (inode && S_ISREG(inode->i_mode))
>>               res = ERR_PTR(-EOPENSTALE);
>>       } else if (!IS_ERR(res)) {
>>           inode = d_inode(res);
>>           if ((lookup_flags & LOOKUP_DIRECTORY) && inode &&
>> -            !S_ISDIR(inode->i_mode)) {
>> +            !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) {
>>               dput(res);
>>               res = ERR_PTR(-ENOTDIR);
>>           } else if (inode && S_ISREG(inode->i_mode)) {

2022-02-13 13:07:10

by Thorsten Leemhuis

[permalink] [raw]
Subject: Re: [PATCH] NFS: LOOKUP_DIRECTORY is also ok with symlinks

On 11.02.22 11:55, Paul Menzel wrote:
> #regzbot monitor:
> https://lore.kernel.org/linux-nfs/[email protected]/

Thx for trying, but that failed (as is unneeded, see below): regzbot
can't determine which of the tracked regression might be meant here, so
it can't associate it with your report.

> Am 09.02.22 um 23:02 schrieb Paul Menzel:
>
>> Am 08.02.22 um 19:38 schrieb [email protected]:
>>> From: Trond Myklebust <[email protected]>
>>>
>>> Commit ac795161c936 (NFSv4: Handle case where the lookup of a directory
>>> fails) [1], part of Linux since 5.17-rc2, introduced a regression, where
>>> a symbolic link on an NFS mount to a directory on another NFS does not
>>> resolve(?) the first time it is accessed:
>>>
>>> Reported-by: Paul Menzel <[email protected]>
>>> Fixes: ac795161c936 ("NFSv4: Handle case where the lookup of a
>>> directory fails")
>>> Signed-off-by: Trond Myklebust <[email protected]>
>>
>> Thank you for fixing it so quickly. My colleague verified, that it
>> fixes our issue.
>>
>> Tested-by: Donald Buczek <[email protected]>
>
> Also for regzbot:
>
> Link:
> https://lore.kernel.org/linux-nfs/[email protected]/

Hmmm, regzbot from this could in theory be modified to determine which
regression was meant, but right now regzbot processes commands
sequentially, so in this order it wouldn't work anyway.

But there is a bigger problem: that link points to a reply to your
report, not the report. I guess I can modify regzbot to handle such
cases, but I have more pressing issue right now, sorry. But I'll keep it
in mind.

The right link tag one would have been:

Link:
https://lore.kernel.org/r/[email protected]/

(s!/r/!/linux-nfs/! would have worked for regzbot as well)

Trond, can you please add this tag to your patch in case you respin it,
as explained, as explained in
'Documentation/process/submitting-patches.rst' and
'Documentation/process/5.Posting.rst'.

BTW, paul: Regzbot will monitor every subthread with a proper link tag
(like I gave above), so there is no need for a "#regzbot monitor" in
anyway if developers would just place the tags as the documentation states.

Ciao, Thorsten


>>> ---
>>>   fs/nfs/dir.c | 4 ++--
>>>   1 file changed, 2 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
>>> index e128503728f2..6dee4e12d381 100644
>>> --- a/fs/nfs/dir.c
>>> +++ b/fs/nfs/dir.c
>>> @@ -2051,14 +2051,14 @@ int nfs_atomic_open(struct inode *dir, struct
>>> dentry *dentry,
>>>       if (!res) {
>>>           inode = d_inode(dentry);
>>>           if ((lookup_flags & LOOKUP_DIRECTORY) && inode &&
>>> -            !S_ISDIR(inode->i_mode))
>>> +            !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)))
>>>               res = ERR_PTR(-ENOTDIR);
>>>           else if (inode && S_ISREG(inode->i_mode))
>>>               res = ERR_PTR(-EOPENSTALE);
>>>       } else if (!IS_ERR(res)) {
>>>           inode = d_inode(res);
>>>           if ((lookup_flags & LOOKUP_DIRECTORY) && inode &&
>>> -            !S_ISDIR(inode->i_mode)) {
>>> +            !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) {
>>>               dput(res);
>>>               res = ERR_PTR(-ENOTDIR);
>>>           } else if (inode && S_ISREG(inode->i_mode)) {
>
>

2022-05-06 23:15:54

by Jonathan Cormier

[permalink] [raw]
Subject: Re: [PATCH] NFS: LOOKUP_DIRECTORY is also ok with symlinks

Tested patch on ubuntu kernel 5.13.0-40. And it resolved a regression
we were seeing on our build servers.

Reported bug: https://bugs.launchpad.net/ubuntu/+source/linux-signed-hwe-5.13/+bug/1971482

Tested-by: Jonathan Cormier <[email protected]>

Thanks

-- Sending again in plain text mode...