Sorry for being prolix in last comment, I was reading ganesha code, by my own personal interest, to check what could have happened and the TL;DR I have is this:
TODO: Enabling Debug will give you the exact acl/uid/gid for the broken access, together with the file/directory server was trying to access. From the acl you will get a the ACES which is the FSAL ACE structure giving you the: access type, erm, uid, gid, so you will have the exact EACCESS issue.
This will get you the EACCESS you're having in FSAL layer coming from the link() operation. Independently if you're getting it from NFS3 or NFS4 clients, LogFullDebug() or LogDebug() will get you the exact EACCESS issue you're getting (Also independently of the underlying filesystem you're using).
I hope this helps as I don't know if you can reproduce the issue outside production environment.
Sorry for being prolix in last comment, I was reading ganesha code, by my own personal interest, to check what could have happened and the TL;DR I have is this:
TODO: Enabling Debug will give you the exact acl/uid/gid for the broken access, together with the file/directory server was trying to access. From the acl you will get a the ACES which is the FSAL ACE structure giving you the: access type, erm, uid, gid, so you will have the exact EACCESS issue.
This will get you the EACCESS you're having in FSAL layer coming from the link() operation. Independently if you're getting it from NFS3 or NFS4 clients, LogFullDebug() or LogDebug() will get you the exact EACCESS issue you're getting (Also independently of the underlying filesystem you're using).
I hope this helps as I don't know if you can reproduce the issue outside production environment.
----
Exporting:
#export COMPONENT_ DISPATCH= NIV_FULL_ DEBUG DISPATCH= NIV_DEBUG
#export COMPONENT_
in the systemd .service unit might do the trick
----
#define LogDebug(component, format, args...) \ component_ log_level[ component] \ mponentLevel( component, __FILE__,\
do { \
if (unlikely(
>= NIV_DEBUG)) \
DisplayLogCo
__LINE__, \
__func__, \
NIV_DEBUG, format, ## args); \
} while (0)
----
#define LogFullDebug( component, format, args...) \ component_ log_level[ component] \ mponentLevel( component, __FILE__,\
NIV_FULL_ DEBUG, \
do { \
if (unlikely(
>= NIV_FULL_DEBUG)) \
DisplayLogCo
__LINE__, \
__func__, \
format, ## args); \
} while (0)