On Jul 29, 2011, at 10:20 10AM, Emmanuel Dreyfus wrote: > On Fri, Jul 29, 2011 at 07:10:33AM -0400, Greg Troxel wrote: >> On Linux, is a hard link to the symlink created for link on any symlink? > > On Linux, it always work on the symlink itself, and it is coherent: > $ mkdir i386 > $ ln -s i386 inst.xxx > $ ln inst.xxx machine > $ ls -lid i386 inst.xxx machine > 1135692 drwxrwxr-x 2 manu manu 4096 jui 29 10:03 i386 > 1135697 lrwxrwxrwx 2 manu manu 4 jui 29 10:03 inst.xxx -> i386 > 1135697 lrwxrwxrwx 2 manu manu 4 jui 29 10:03 machine -> i386 > > $ touch foo > $ ln -s foo bar > $ ln bar buz > [manu@boulet tmp]$ ls -lid foo bar buz > 1135704 lrwxrwxrwx 2 manu manu 3 jui 29 15:59 bar -> foo > 1135704 lrwxrwxrwx 2 manu manu 3 jui 29 15:59 buz -> foo > 1135702 -rw-rw-r-- 1 manu manu 0 jui 29 15:59 foo > > NetBSD fails (EPERM) on the first case and produce this for the second one: > # ls -ldi foo bar buz > 5 lrwxr-xr-x 1 root wheel 3 Jul 29 16:12 bar -> foo > 4 -rw-r--r-- 2 root wheel 0 Jul 29 16:12 buz > 4 -rw-r--r-- 2 root wheel 0 Jul 29 16:12 foo > >> What filesystem on Linux? > > This is plain ext3fs, but I suspect it does not depend on the > filesystem. On NetBSD, that behavior is hardcoded at the very > beginning of sys_link(), filesystems cannot interfere with it. > >> All in all it seems like a bug for glusterfs to be using link this way. > > Given the context, that will not be easy to fix and would have a performance > hit. This is a filesystem distributed using a distributed hash table, and > in order to avoid the issue, the client would have to resolve symlinks > on its own, which implies a few transactions back and forth with servers. > > What about adding a linux_link(2) that would do exactly what link(2) does > but without the FOLLOW flag to NDINIT on the path argument? If > linux_link(2) seems unreasonable, it could be lazy_link(2), weak_link(2), > braindead_link(2) or whatever. > Consider the following two sequences:
a) Create a file A b) Create a symlink X->A c) Create a hard link Y=X d) Unlink a e) Create a directory A or a) Create a symlink X-A', where A' doesn't exist b) Create a hard link Y=X c) Create a directory A What should happen? And why should A being a directory initially change the semantics of X and Y, compared with the desired result of the first two scenarios? (As best I can tell, the first scenario does work on NetBSD and the second doesn't, at least when using ln(1).) --Steve Bellovin, https://www.cs.columbia.edu/~smb