co robi `sshfs -oworkaround = rename`?

17

Aby wziąć udział w klasie systemów operacyjnych, muszę uruchomić Freebsd5.4. Ponieważ nie chciałem się zmagać z próbą zbudowania gita na wersji bsd wydanej przed wydaniem gita, pomyślałem, że byłoby to przydatne, gdyby używał go gitArch sshfs.

W każdym razie znalazłem obejście, które sugeruje, że daję sshfsopcję -o workaround=rename.

Wydaje się być gitszczęśliwy, ale jestem raczej zdezorientowany, co się właśnie stało ...

Cała strona człowiek mówi o obejście jest

fix renaming to existing file

ale jestem całkowicie zaskoczony, co to znaczy ...

Co dokładnie robi ta opcja?

math4tots
źródło
3
Wskaźnik dla kogoś, kto chce przyjrzeć się dokładnie, co to znaczy (i napisać odpowiedź, i mam nadzieję, że łatka do dokumentacji): sourceforge.net/p/fuse/sshfs/ci/master/tree/sshfs.c zaczynając od linii 2300.
derobert,

Odpowiedzi:

10

sshfs używa protokołu przesyłania plików SSH (SFTP). Obejście, które włączyłeś, polega na obejściu semantyki operacji zmiany nazwy () na tym protokole, gdy „nowa” nazwa już istnieje.

Zachowanie POSIX dla rename () w tym przypadku polega na usunięciu istniejącego pliku i dokończeniu zmiany nazwy.

W protokole SFTP możesz zmienić nazwę pliku za pomocą operacji SSH_FXP_RENAME; jednak jego zachowanie, gdy nazwa docelowa już istnieje, zależy od wersji używanego protokołu i przekazywanych flag. Strona wikipedii dla protokołu SFTP zawiera linki do różnych wersji roboczych RFC dla różnych wersji protokołu. W wersji roboczej 00 zachowanie jest wymienione jako:

Jest to błąd, jeśli istnieje już plik o nazwie określonej przez newpath.

W wersji roboczej 13 zachowanie jest wymienione jako

Jeśli flagi nie zawierają SSH_FXP_RENAME_OVERWRITE i istnieje już plik o nazwie określonej przez newpath, serwer MUSI odpowiedzieć SSH_FX_FILE_ALREADY_EXISTS.

Jeśli flagi zawierają SSH_FXP_RENAME_ATOMIC, a plik docelowy już istnieje, zostanie zastąpiony w sposób atomowy. Tzn. Nie ma zauważalnej chwili, w której nazwa nie odnosi się ani do starego, ani do nowego pliku. SSH_FXP_RENAME_ATOMIC oznacza SSH_FXP_RENAME_OVERWRITE.

Aby poradzić sobie z możliwym niepowodzeniem operacji zmiany nazwy (), gdy istnieje nazwa docelowa, sshfs zapewnia następujące obejście (jeśli jest włączone) :

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

W tym kodzie „z” to istniejąca nazwa pliku, którego nazwę chcemy zmienić, a „na” to nowa nazwa, której chcemy. Odkładając na bok pewną długość ścieżki i księgowanie błędów, to obejście

  • Zmienia nazwy „na” na „totmp”
  • Zmienia nazwę „z” na „na”
  • Odłącza (usuwa) „totmp”

Pozwala to uniknąć konfliktu „plik już istnieje”, ale zmienia również semantykę operacji zmiany nazwy (), dlatego domyślnie nie chcesz tego robić.

Steven D.
źródło