13111: Port "rename a to a/b/c" fix from 11377b3b.
authorTom Clegg <tclegg@veritasgenetics.com>
Wed, 3 Jan 2018 06:20:47 +0000 (01:20 -0500)
committerTom Clegg <tclegg@veritasgenetics.com>
Wed, 3 Jan 2018 06:20:47 +0000 (01:20 -0500)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

sdk/go/arvados/fs_base.go
sdk/go/arvados/fs_collection.go

index a3df1684cc90a7fd77d32dd3579c81ced7ced3b6..419be7ffb1ef621ab1db359b62832f6d22842948 100644 (file)
@@ -444,6 +444,11 @@ func (fs *fileSystem) Rename(oldname, newname string) error {
                        err = os.ErrNotExist
                        return nil
                }
+               if locked[oldinode] {
+                       // oldinode cannot become a descendant of itself.
+                       err = ErrInvalidArgument
+                       return oldinode
+               }
                accepted := newdirf.inode.Child(newname, func(existing inode) inode {
                        if existing != nil && existing.IsDir() {
                                err = ErrIsDirectory
index e7e6f19690e8c93f47837735b9a2d57d44a76afd..27ea9048acdc6e8b45ed16e1b1ab313ceb9b554c 100644 (file)
@@ -539,7 +539,12 @@ func (dn *dirnode) Child(name string, replace func(inode) inode) inode {
                gn.SetParent(dn, name)
                return gn
        }
-       return dn.treenode.Child(name, replace)
+       oldchild := dn.treenode.Child(name, nil)
+       child := dn.treenode.Child(name, replace)
+       if child != nil && child != oldchild {
+               child.SetParent(dn, name)
+       }
+       return child
 }
 
 // sync flushes in-memory data (for all files in the tree rooted at