[Samba] Cannot remove symlink with missing target

Andreas Maier andreas.r.maier at gmx.de
Wed Jan 6 17:36:50 UTC 2016

I have started using symbolic links on an SMB share and find that 
symbolic links whose target no longer exists cannot be removed on the 
client side.

Example, on the SMB client side in an SMB-mounted directory:

1. Create a file and a relative symlink to it:

     $ touch a
     $ ln -s a b
     $ ls -l
     total 0
     -rw-rw-r--. 1 andi andi 0 Jan 6 14:42 a
     lrwxrwxrwx. 1 andi andi 1 Jan 6 14:42 b -> a

2. Removing the symlink target causes removal of symlink to fail:

     $ rm a
     $ ls -l
     total 0
     lrwxrwxrwx. 1 andi andi 1 Jan 6 14:42 b -> a
     # With colors on, the b and a are now marked red, indicating a 
broken symlink
     $ rm b
     rm: cannot remove ‘b’: No such file or directory
     $ ls -l
     total 0
     lrwxrwxrwx. 1 andi andi 1 Jan 6 14:42 b -> a

3. Reestablishing the symlink target causes removal of symlink to work 

     $ touch a
     $ ls -l
     total 0
     -rw-rw-r--. 1 andi andi 0 Jan 6 14:44 a
     lrwxrwxrwx. 1 andi andi 1 Jan 6 14:42 b -> a
     $ rm b
     $ ls -l
     total 0
     -rw-rw-r--. 1 andi andi 0 Jan 6 14:44 a

The same test when performed on a local file system, works fine (i.e. 
the broken symlink can successfully be removed).

I have debugged this on the server side by enabling debug logs in the 
Synology NAS, and the relevant portion during the "rm b" command on the 
broken symlink is (the directory is Projects/xx/try1, relative to the 
SMB share):

../source3/smbd/process.c:1823: [2016/01/06 16:01:50.101627, all 3, 
pid=17490] process_smb
   Transaction 495774 of length 116 (0 toread)
../source3/smbd/process.c:1422: [2016/01/06 16:01:50.101795, all 3, 
pid=17490] switch_message
   switch message SMBtrans2 (pid 17490) conn 0xf78384a0
../source3/smbd/trans2.c:5419: [2016/01/06 16:01:50.101919, all 3, 
pid=17490] call_trans2qfilepathinfo
   call_trans2qfilepathinfo: TRANSACT2_QPATHINFO: level = 512
../source3/smbd/trans2.c:5562: [2016/01/06 16:01:50.102076, all 3, 
pid=17490] call_trans2qfilepathinfo
   call_trans2qfilepathinfo Projects/xx/try1/b (fnum [fsp is NULL]) 
level=512 call=5 total_data=0

../source3/smbd/process.c:1823: [2016/01/06 16:01:50.103166, all 3, 
pid=17490] process_smb
   Transaction 495775 of length 120 (0 toread)
../source3/smbd/process.c:1422: [2016/01/06 16:01:50.103370, all 3, 
pid=17490] switch_message
   switch message SMBtrans2 (pid 17490) conn 0xf78384a0
../source3/smbd/trans2.c:8435: [2016/01/06 16:01:50.103517, all 3, 
pid=17490] call_trans2setfilepathinfo
   call_trans2setfilepathinfo(6) Projects/xx/try1/b (fnum [fsp is NULL]) 
info_level=522 totdata=2
../source3/smbd/trans2.c:7989: [2016/01/06 16:01:50.103611, all 3, 
pid=17490] smbd_do_setfilepathinfo
   smbd_do_setfilepathinfo: Projects/xx/try1/b (fnum [fsp is NULL]) 
info_level=522 totdata=2
../source3/smbd/open.c:1194: [2016/01/06 16:01:50.103800, all 2, 
pid=17490] open_file
   andi opened file Projects/xx/try1/b read=No write=No (numopen=1)
../source3/modules/vfs_recycle.c:798: [2016/01/06 16:01:50.104129, 
(custom) 3, pid=17490] recycle_unlink
   andi have no permission (0x0) delete file [Projects/xx/try1/b] 
../source3/smbd/notify_internal.c:633: [2016/01/06 16:01:50.104271, all 
1, pid=17490] notify_trigger
   Bypass notify_trigger
../source3/smbd/close.c:831: [2016/01/06 16:01:50.104368, all 2, 
pid=17490] close_normal_file
   andi closed file Projects/xx/try1/b (numopen=0) 
../source3/smbd/error.c:82: [2016/01/06 16:01:50.104500, all 3, 
pid=17490] error_packet_set
   NT error packet at ../source3/smbd/trans2.c(8480) cmd=50 (SMBtrans2) 

Note the line with "andi have no permission". Could this be a permission 
problem? However, on the server side, the file system permissions look good.

-> Any ideas about the root cause and how to resolve it?
    Or how to debug it further?



Data about the environment:


* Virtual CentOS 7 client (on VirtualBox on Windows 7) using cifs-utils 
6.2 and kernel 3.10.0

* Mount: Via /etc/fstab, the entry looks like:

//ds12/home   /media/ds12_home_andi  cifs 
0 0

The mount command provides somewhat more information:

//ds12/home on /media/ds12_home_andi type cifs 

* /proc/fs/cifs/DebugData for this share:

Display Internal CIFS Data Structures for Debugging
CIFS Version 2.03
Features: dfs lanman posix spnego xattr acl
Active VFS Requests: 0
1) Name:  Domain: WORKGROUP Uses: 1 OS: Unix
         NOS: Samba 4.1.18       Capability: 0x8080f3fd
         SMB session status: 1   TCP status: 1
         Local Users To Server: 2 SecMode: 0x3 Req On Wire: 0
         1) \\ds12\home Mounts: 1 Type: NTFS DevInfo: 0x20 Attributes: 
         PathComponentMax: 255 Status: 0x1 type: DISK



* Synology NAS server with DSM 5.2-5644 Update 2 (which uses samba, I 
assume the client's DebugData file shows the version of samba on the 
server: 4.1.18).

* Symbolic link support is enabled in the SMB options in the DSM user 
interface. The relevant portions of the /usr/syno/etc/smb.conf file 
(Synology uses BusyBox) are:

         printcap name=cups
         winbind enum groups=yes
         ldap admin dn=uid=root,cn=users,dc=am,dc=org
         encrypt passwords=yes
         ldap ssl=Off
         local master=no
         ldap passwd sync=yes
         ldap suffix=dc=am,dc=org
         passdb backend=multi:smbpasswd,ldapsam:ldap://localhost
         syno ldap support=yes
         max protocol=SMB2_10
         winbind enum users=yes
         load printers=yes
         create mode = 0777
         comment = home
         browseable = no
         writable = yes
         valid users = %U
         directory mode = 0777
         path = /var/services/homes/%U

         invalid users=nobody,nobody
         valid users=nobody,nobody
         comment="User homes (mount 'home')"
         guest ok=yes
         edit synoacl=yes
         win share=yes
         skip smb perm=yes
         enable recycle bin=yes
         recycle bin admin only=no
         hide unreadable=no
         ftp disable list=no
         ftp disable modify=no
         ftp disable download=no
         read list=nobody,nobody
         write list=nobody,nobody


More information about the samba mailing list