Re: Question about ext2

From: Alexander Viro (viro@math.psu.edu)
Date: Fri Jul 13 2001 - 05:57:51 EST


On Fri, 13 Jul 2001, Andrew Morton wrote:

> I recently spent an hour decrypting this function. Here is
> a commented version which may prove helpful. It is from a
> non-mainline branch of ext3, but it's much the same.

<raised brows> OK, here's an algorithm used in rename() - hopefully it
answers "dunno why" part.

        find directory entry of source or fail (-ENOENT)

        if moving directory
                find directory entry of ".." in object we move or fail (-EIO)

        if there is a victim
                if moving directory and victim is not empty - fail (-ENOTEMPTY)

                find directory entry of victim or fail (-ENOENT)

                grab a reference to old_inode and redirect that entry to it
                if victim is a directory
                        drop reference to victim twice
                else
                        drop reference to victim once
        else
                if moving directory
                        check that we can grab an extra reference to new parent
                        or fail with -EMLINK
                grab a reference to old inode
                create a link to old_inode (with new name)
                if link creation failed
                        drop a reference we've just got and fail
                if it was a directory
                        grab a reference to new parent

        /*
                Now we had created a new link to object we are moving
                and link to victim (if any) is destroyed.
         */

        delete old link and drop the reference held by it.

        if moving directory
                redirect ".." to new parent and drop reference to old parent

Notice that we always grab a reference before creating a link and drop it
only after the link removal. All checks are done before any directory
modifications start - that way we can bail out if they fail.

The only really obscure part is dropping an extra reference if victim is
a directory - then we know that we are cannibalizing the last external
link to it and the only link that remains is victim's ".". We don't want
it to prevent victim's removal, so we drive i_nlink of victim to zero.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sun Jul 15 2001 - 21:00:19 EST