sshfs -oworkaround = rename是做什么的?


17

对于我要学习的操作系统类,我需要运行Freebsd5.4。由于我不想尝试在git发行之前就在bsd的版本上构建git,因此我认为git从Arch 那里使用它会很简洁sshfs

无论如何,我发现了一种解决方法,建议我sshfs选择该选项-o workaround=rename

它似乎使人git高兴,但我对刚刚发生的事情感到困惑。

手册页中所有关于解决方法的内容是

fix renaming to existing file

但是我对这意味着什么感到困惑

该选项到底能做什么?


3
指向想要确切了解其含义(并写出答案,并希望提供文档补丁)的人的指针:sourceforge.net/p/fuse/sshfs/ci/master/tree/sshfs.c从2300行开始。
derobert 2014年

Answers:


10

sshfs使用SSH文件传输协议(SFTP)。您已经启用的解决方法是,当“新”名称已经存在时,将通过该协议解决rename()操作的语义。

在这种情况下,rename()的POSIX行为是删除现有文件并完成重命名。

在SFTP协议中,您可以使用SSH_FXP_RENAME操作重命名文件;但是,当目标名称已经存在时,其行为似乎取决于您使用的协议的版本以及传递的标志。SFTP协议Wikipedia页面具有指向该协议各种版本的RFC草案的链接。在草稿00中,行为被列为:

如果已经存在一个由newpath指定的名称的文件,这是一个错误。

草案13中,该行为被列为

如果标志不包括SSH_FXP_RENAME_OVERWRITE,并且已经存在一个名称由newpath指定的文件,则服务器必须使用SSH_FX_FILE_ALREADY_EXISTS进行响应。

如果标志包括SSH_FXP_RENAME_ATOMIC,并且目标文件已存在,则以原子方式替换它。即,没有可观察到的瞬间,该名称既不指向旧文件也不指向新文件。SSH_FXP_RENAME_ATOMIC表示SSH_FXP_RENAME_OVERWRITE。

为了在目标名称存在时处理rename()操作的可能失败,sshfs提供了以下解决方法(如果启用)

   if (err == -EPERM && sshfs.rename_workaround) {
            size_t tolen = strlen(to);
            if (tolen + RENAME_TEMP_CHARS < PATH_MAX) {
                    int tmperr;
                    char totmp[PATH_MAX];
                    strcpy(totmp, to);
                    random_string(totmp + tolen, RENAME_TEMP_CHARS);
                    tmperr = sshfs_do_rename(to, totmp);
                    if (!tmperr) {
                            err = sshfs_do_rename(from, to);
                            if (!err)
                                    err = sshfs_unlink(totmp);
                            else
                                    sshfs_do_rename(totmp, to);
                    }
            }
    }

在此代码中,“ from”是我们要重命名的文件的现有名称,“ to”是我们想要的新名称。撇开路径长度和错误簿记,可以解决此问题

  • 将“ to”重命名为“ totmp”
  • 将“从”重命名为“到”
  • 取消链接(删除)“ totmp”

这样可以避免“文件已存在”冲突,而且还可以更改named()操作的语义,这就是默认情况下您不希望这样做的原因。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.