[openfirmware] r1699 - ofw/fs/ext2fs
svn at openfirmware.info
svn at openfirmware.info
Mon Jan 25 10:40:14 CET 2010
Author: wmb
Date: 2010-01-25 10:40:13 +0100 (Mon, 25 Jan 2010)
New Revision: 1699
Modified:
ofw/fs/ext2fs/methods.fth
Log:
OLPC trac 9999 - ext2 file system - Fixed rename problem introduced by svn 1648, and also made it possible to rename directories.
Modified: ofw/fs/ext2fs/methods.fth
===================================================================
--- ofw/fs/ext2fs/methods.fth 2010-01-25 08:37:51 UTC (rev 1698)
+++ ofw/fs/ext2fs/methods.fth 2010-01-25 09:40:13 UTC (rev 1699)
@@ -28,10 +28,15 @@
diroff off
;
+0 value renaming?
: $delete ( name$ -- error? )
$find-file if true exit then ( )
- wf-type dir-type = if true exit then
+ \ It's okay to delete a directory if it is a rename, because a
+ \ hardlinked copy has just been made
+ renaming? 0= if
+ wf-type dir-type = if true exit then
+ then
dirent-unlink
false
@@ -39,23 +44,31 @@
: $delete! $delete ; \ XXX should these be different?
: $hardlink ( old-name$ new-name$ -- error? )
- \ Error if the new name already exists
- 2dup $find-file 0= if ( old-name$ new-name$ )
- 4drop true exit ( -- true )
- then ( old-name$ new-name$ )
-
\ Save the current search context. The path part of the new name
\ has already been parsed out and resolved. Resolving old-name$ changes
\ the directory context, so we will need to restore the context for the
\ new name to create its dirent.
dirent-vars 2>r 2>r ( old-name$ new-name$ r: 4xVars )
+ \ Error if the new name already exists
+ 2dup $find-file 0= if ( old-name$ new-name$ r: 4xVars )
+ 2r> 2r> 4drop ( old-name$ new-name$ )
+ 4drop true exit ( -- true )
+ then ( old-name$ new-name$ )
+
2swap $find-file if ( new-name$ r: 4xVars )
- 2drop 2r> 2r> 4drop true exit
+ 2r> 2r> 4drop ( new-name$ )
+ 2drop true exit ( -- true )
then ( new-name$ r: 4xVars )
- \ Hard links to directories mess up the filesystem tree
- wf-type dir-type = if 2drop true exit then ( new-name$ r: 4xVars)
+ \ Hard links to directories mess up the filesystem tree, but they are
+ \ okay temporarily if we are renaming and will soon delete the old one
+ renaming? 0= if
+ wf-type dir-type = if ( new-name$ r: 4xVars )
+ 2r> 2r> 4drop ( new-name$ )
+ 2drop true exit ( -- true )
+ then ( new-name$ r: 4xVars)
+ then
2r> 2r> restore-dirent ( new-name$ )
wf-inum new-dirent ( error? )
@@ -71,8 +84,13 @@
2drop ( old-path$ new-name$ )
then ( old-path$ new-name$ )
- 2over 2swap $hardlink if 2drop true exit then ( old-name$ )
- $delete
+ true to renaming? ( old-path$ new-name$ )
+ 2over 2swap $hardlink if ( old-path$ )
+ false to renaming? ( old-path$ )
+ 2drop true exit ( -- true )
+ then ( old-name$ )
+ $delete ( error? )
+ false to renaming? ( old-path$ )
;
: $rmdir ( name$ -- error? )
More information about the openfirmware
mailing list