was macht `sshfs -oworkaround = umbenennen`?

17

Für eine Betriebssystemklasse, die ich nehme, musste ich Freebsd5.4 ausführen. Da ich mich nicht mit dem Versuch herumschlagen wollte, git auf einer Version von bsd zu bauen, die vor der Veröffentlichung von git veröffentlicht wurde, dachte ich, es wäre ordentlich, sie gitvon Arch her zu verwenden sshfs.

Auf jeden Fall fand ich eine Problemumgehung , die vorschlug, dass ich sshfsdie Option gebe -o workaround=rename.

Es scheint gitglücklich zu machen , aber ich bin ziemlich verwirrt darüber, was gerade passiert ist ...

Alles, was die Manpage über die Problemumgehung sagt, ist

fix renaming to existing file

aber ich bin völlig verblüfft, was das bedeutet ...

Was genau macht diese Option?

math4tots
quelle
3
Hinweis für jemanden, der sich genau ansehen möchte, was es bedeutet (und eine Antwort und hoffentlich einen Dokumentations-Patch aufschreiben): sourceforge.net/p/fuse/sshfs/ci/master/tree/sshfs.c ab Zeile 2300.
Derobert

Antworten:

10

sshfs verwendet das SSH File Transfer Protocol (SFTP). Die von Ihnen aktivierte Problemumgehung besteht darin, die Semantik einer Rename () - Operation für dieses Protokoll zu umgehen, wenn der "neue" Name bereits vorhanden ist.

In diesem Fall besteht das POSIX-Verhalten für rename () darin, die vorhandene Datei zu entfernen und die Umbenennung abzuschließen.

Im SFTP-Protokoll können Sie eine Datei mit der Operation SSH_FXP_RENAME umbenennen. Das Verhalten, wenn der Zielname bereits vorhanden ist, scheint jedoch von der Version des verwendeten Protokolls und den übergebenen Flags abzuhängen. Die Wikipedia-Seite für das SFTP-Protokoll enthält Links zu verschiedenen RFC-Entwürfen für verschiedene Versionen des Protokolls. In Entwurf 00 ist das Verhalten wie folgt aufgeführt:

Es ist ein Fehler, wenn bereits eine Datei mit dem durch newpath angegebenen Namen existiert.

In Entwurf 13 wird das Verhalten als aufgeführt

Wenn Flags nicht SSH_FXP_RENAME_OVERWRITE enthalten und bereits eine Datei mit dem von newpath angegebenen Namen vorhanden ist, MUSS der Server mit SSH_FX_FILE_ALREADY_EXISTS antworten.

Wenn Flags SSH_FXP_RENAME_ATOMIC enthalten und die Zieldatei bereits vorhanden ist, wird sie atomar ersetzt. Das heißt, es gibt keinen beobachtbaren Zeitpunkt, zu dem der Name weder auf die alte noch auf die neue Datei verweist. SSH_FXP_RENAME_ATOMIC impliziert SSH_FXP_RENAME_OVERWRITE.

Um den möglichen Fehler einer Rename () - Operation zu beheben, wenn der Zielname vorhanden ist, bietet sshfs die folgende Problemumgehung (falls aktiviert) :

   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);
                    }
            }
    }

In diesem Code ist "from" der vorhandene Name der Datei, die wir umbenennen möchten, und "to" der neue Name, den wir möchten. Wenn Sie die Pfadlänge und die Fehlerbuchhaltung beiseite lassen, können Sie dies umgehen

  • Benennt "to" in "totmp" um
  • Benennt "von" nach "nach" um
  • Entfernt (löscht) "totmp"

Dies vermeidet den Konflikt "Datei existiert bereits", ändert aber auch die Semantik der rename () -Operationen, weshalb Sie dies standardmäßig nicht möchten.

Steven D
quelle