Bug 1722977 - ESTALE change in fuse breaks get_real_filename implementation
Summary: ESTALE change in fuse breaks get_real_filename implementation
Keywords:
Status: CLOSED NEXTRELEASE
Alias: None
Product: GlusterFS
Classification: Community
Component: posix
Version: mainline
Hardware: Unspecified
OS: Unspecified
unspecified
high
Target Milestone: ---
Assignee: Michael Adam
QA Contact:
URL:
Whiteboard:
Depends On:
Blocks: 1723659
TreeView+ depends on / blocked
 
Reported: 2019-06-21 21:47 UTC by Michael Adam
Modified: 2019-06-26 08:45 UTC (History)
3 users (show)

Fixed In Version:
Doc Type: If docs needed, set a value
Doc Text:
Clone Of:
: 1723659 (view as bug list)
Environment:
Last Closed: 2019-06-26 07:19:34 UTC
Regression: ---
Mount Type: ---
Documentation: ---
CRM:
Verified Versions:


Attachments (Terms of Use)


Links
System ID Priority Status Summary Last Updated
Samba Project 14010 None None None 2019-08-05 09:47:42 UTC
Gluster.org Gerrit 22925 None Merged [RFC] change get_real_filename implementation to use ENOATTR instead of ENOENT 2019-06-26 07:19:33 UTC

Description Michael Adam 2019-06-21 21:47:28 UTC
Description of problem:

The change of ENOENT to ESTALE in the fuse bridge in 59629f1da9dca670d5dcc6425f7f89b3e96b46bf has broken the get_real_filename implementation over fuse:

get_real_filename is implemented as a virtual extended attribute to help Samba implement the case-insensitive but case preserving SMB protocol more efficiently. It is implemented as a getxattr call on the parent directory with the virtual key of "get_real_filename:<entryname>" by looking for a spelling with different case for the provided file/dir name (<entryname>) and returning this correct spelling as a result if the entry is found.

Originally (05aaec645a6262d431486eb5ac7cd702646cfcfb), the implementation used the ENOENT errno to return the authoritative answer that <entryname> does not exist in any case folding.
    
Now this implementation is actually a violation or misuse of the defined API for the getxattr call which returns ENOENT for the case that the dir that the call is made against does not exist and ENOATTR (or the synonym ENODATA) for the case that the xattr does not exist.
    
This was not a problem until the gluster fuse-bridge was changed to do map ENOENT to ESTALE in 59629f1da9dca670d5dcc6425f7f89b3e96b46bf, after which we the getxattr call for get_real_filename returned an ESTALE instead of ENOENT breaking the expectation in Samba.

(It is an independent problem that ESTALE should not leak out to user space but is intended to trigger retries between fuse and gluster. My theory is that the leaking happens because of the wrong use of ESTALE here: the parent directory exists in this case, and there is nothing stale....) 

But nevertheless, the semantics seem to be incorrect here and should be changed.


Version-Release number of selected component (if applicable):

master and version 6


How reproducible:

Always.


Steps to Reproduce:

On a gluster fuse mount, run `getfattr -n glusterfs.get_real_filename:file-that-does-not-exist /path/to/fuse/mount/some-subdir`.


Actual results:

This shows the ESTALE error.


Expected results:

It shows ENONET.

Comment 1 Worker Ant 2019-06-21 22:01:05 UTC
REVIEW: https://review.gluster.org/22925 ([RFC] change get_real_filename implementation to use ENOATTR instead of ENOENT) posted (#1) for review on master by Michael Adam

Comment 2 Michael Adam 2019-06-21 22:03:50 UTC
Corresponding changes to Samba are already written and will be posted to Samba.

Comment 3 Worker Ant 2019-06-26 07:19:34 UTC
REVIEW: https://review.gluster.org/22925 ([RFC] change get_real_filename implementation to use ENOATTR instead of ENOENT) merged (#2) on master by Amar Tumballi


Note You need to log in before you can comment on or make changes to this bug.