Should hard links to directories work?

Jonathan Larmour jifl@jifvik.org
Wed May 20 16:56:00 GMT 2009


Bart Veer wrote:
>>>>>>"Ross" == Ross Younger <wry@ecoscentric.com> writes:
> 
> 
>     Ross> The Unix world traditionally shuns such things as an
>     Ross> abomination. The eCos docs are quiet on the subject, as is
>     Ross> the code in ramfs and jffs2. Should they work? Does anybody
>     Ross> use them?
> 
>     Ross> (By the way: I started this discussion with a bugzilla
>     Ross> ticket, which as Andrew points out is probably the wrong
>     Ross> place.
>     Ross> http://bugzilla.ecoscentric.com/show_bug.cgi?id=1000775 )
> 
> From http://www.opengroup.org/onlinepubs/7990989775/xsh/link.html:
> 
>   "The link() function creates a new link (directory entry) for the
>   existing file, path1.
> 
>   The path1 argument points to a pathname naming an existing file. The
>   path2 argument points to a pathname naming the new directory entry
>   to be created. The link() function will atomically create a new link
>   for the existing file and the link count of the file is incremented
>   by one.
> 
>   If path1 names a directory, link() will fail unless the process has
>   appropriate privileges and the implementation supports using link()
>   on directories."
> 
> So creating links to directories is not completely disallowed, but
> from my reading it is certainly discouraged. I would be happy with
> changes to ramfs and jffs2 to prevent new links to directories.
> jffs2 should probably continue to support such links in an existing
> filesystem, in case they are created in another OS.

JFFS2's other OS is linux which does not support hard linked directories. 
Presumably at the VFS layer.

Since hard linking directories can cause infinite recursion in directory 
tree searches, I think they should be discouraged if at all possible.

For JFFS2, something like this in jffs2's fs-ecos.c:jffs2_ops_link() 
before the handling of dir2 should bring it into line with linux:

if (S_ISDIR(ds1.node->i_mode)) {
    jffs2_iput(ds1.dir);
    jffs2_iput(ds1.node);
    return EPERM;
}

[Untested, and someone else would have to do that, sorry.]

I would not be surprised if hard-linked directories caused JFFS2's 
filesystem rebuild phase to blow up.

Jifl
-- 
------["The best things in life aren't things."]------      Opinions==mine



More information about the Ecos-devel mailing list