diff mbox series

NFS: LOOKUP_DIRECTORY is also ok with symlinks

Message ID 20220208183823.1391397-1-trondmy@kernel.org (mailing list archive)
State New, archived
Headers show
Series NFS: LOOKUP_DIRECTORY is also ok with symlinks | expand

Commit Message

Trond Myklebust Feb. 8, 2022, 6:38 p.m. UTC
From: Trond Myklebust <trond.myklebust@hammerspace.com>

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 <pmenzel@molgen.mpg.de>
Fixes: ac795161c936 ("NFSv4: Handle case where the lookup of a directory fails")
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
---
 fs/nfs/dir.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Paul Menzel Feb. 9, 2022, 10:02 p.m. UTC | #1
Dear Trond,


Am 08.02.22 um 19:38 schrieb trondmy@kernel.org:
> From: Trond Myklebust <trond.myklebust@hammerspace.com>
> 
> 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 <pmenzel@molgen.mpg.de>
> Fixes: ac795161c936 ("NFSv4: Handle case where the lookup of a directory fails")
> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>

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

Tested-by: Donald Buczek <buczek@molgen.mpg.de>


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)) {
Paul Menzel Feb. 11, 2022, 10:55 a.m. UTC | #2
#regzbot monitor: 
https://lore.kernel.org/linux-nfs/20220208183823.1391397-1-trondmy@kernel.org/

Dear Trond,


Am 09.02.22 um 23:02 schrieb Paul Menzel:

> Am 08.02.22 um 19:38 schrieb trondmy@kernel.org:
>> From: Trond Myklebust <trond.myklebust@hammerspace.com>
>>
>> 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 <pmenzel@molgen.mpg.de>
>> Fixes: ac795161c936 ("NFSv4: Handle case where the lookup of a 
>> directory fails")
>> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
> 
> Thank you for fixing it so quickly. My colleague verified, that it fixes 
> our issue.
> 
> Tested-by: Donald Buczek <buczek@molgen.mpg.de>

Also for regzbot:

Link: 
https://lore.kernel.org/linux-nfs/0235e04a-18aa-ccbf-f520-38a2d55e8b54@molgen.mpg.de/


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)) {
Thorsten Leemhuis Feb. 11, 2022, 11:40 a.m. UTC | #3
On 11.02.22 11:55, Paul Menzel wrote:
> #regzbot monitor:
> https://lore.kernel.org/linux-nfs/20220208183823.1391397-1-trondmy@kernel.org/

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 trondmy@kernel.org:
>>> From: Trond Myklebust <trond.myklebust@hammerspace.com>
>>>
>>> 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 <pmenzel@molgen.mpg.de>
>>> Fixes: ac795161c936 ("NFSv4: Handle case where the lookup of a
>>> directory fails")
>>> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
>>
>> Thank you for fixing it so quickly. My colleague verified, that it
>> fixes our issue.
>>
>> Tested-by: Donald Buczek <buczek@molgen.mpg.de>
> 
> Also for regzbot:
> 
> Link:
> https://lore.kernel.org/linux-nfs/0235e04a-18aa-ccbf-f520-38a2d55e8b54@molgen.mpg.de/

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/bd2075f0-2343-5bfa-83bf-0e916303727d@molgen.mpg.de/

(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)) {
> 
>
diff mbox series

Patch

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)) {