Miklos Szeredi wrote: > On Fri, 11 Jul 2008, Sage Weil wrote: >> However, vfs_rename_dir() doesn't properly account for filesystems with >> FS_RENAME_DOES_D_MOVE. If new_dentry has a target inode attached, it >> unhashes the new_dentry prior to the rename() iop and rehashes it after, >> but doesn't account for the possibility that rename() may have swapped >> {old,new}_dentry. For FS_RENAME_DOES_D_MOVE filesystems, it rehashes >> new_dentry (now the old renamed-from name, which d_move() expected to go >> away), such that a subsequent lookup will find it. >> >> To correct this, move vfs_rename_dir()'s call to d_move() _before_ the >> target inode mutex is dealt with. Since d_move() will have been called >> for all filesystems at this point, there is no need to rehash new_dentry >> unless the rename failed. (If the rename succeeded, old_dentry should >> already be rehashed in the new location.) > > I think rehashing the new dentry is bogus, even on error. So we'd just come back through lookup to repopulate the existing destination name that vfs_rename_dir() unhashed before calling ->rename() in the case that the rename fails? That seems gross, but relatively harmless. > So a better fix would be just to remove the rehashing completely. > Does the below patch work for you? It'd work for my case, yeah. - z -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html