@@ -214,6 +214,7 @@ struct sshfs {
214214 struct fuse_args ssh_args ;
215215 char * workarounds ;
216216 int rename_workaround ;
217+ int renamexdev_workaround ;
217218 int truncate_workaround ;
218219 int buflimit_workaround ;
219220 int unrel_append ;
@@ -446,6 +447,8 @@ static struct fuse_opt workaround_opts[] = {
446447 SSHFS_OPT ("none" , fstat_workaround , 0 ),
447448 SSHFS_OPT ("rename" , rename_workaround , 1 ),
448449 SSHFS_OPT ("norename" , rename_workaround , 0 ),
450+ SSHFS_OPT ("renamexdev" , renamexdev_workaround , 1 ),
451+ SSHFS_OPT ("norenamexdev" , renamexdev_workaround , 0 ),
449452 SSHFS_OPT ("truncate" , truncate_workaround , 1 ),
450453 SSHFS_OPT ("notruncate" , truncate_workaround , 0 ),
451454 SSHFS_OPT ("buflimit" , buflimit_workaround , 1 ),
@@ -2333,6 +2336,8 @@ static int sshfs_rename(const char *from, const char *to, unsigned int flags)
23332336 }
23342337 }
23352338 }
2339+ if (err == - EPERM && sshfs .renamexdev_workaround )
2340+ err = - EXDEV ;
23362341 return err ;
23372342}
23382343
@@ -3365,6 +3370,7 @@ static void usage(const char *progname)
33653370" -o workaround=LIST colon separated list of workarounds\n"
33663371" none no workarounds enabled\n"
33673372" [no]rename fix renaming to existing file (default: off)\n"
3373+ " [no]renamexdev fix moving across filesystems (default: off)\n"
33683374" [no]truncate fix truncate for old servers (default: off)\n"
33693375" [no]buflimit fix buffer fillup bug in server (default: on)\n"
33703376" [no]fstat always use stat() instead of fstat() (default: off)\n"
@@ -3851,6 +3857,7 @@ int main(int argc, char *argv[])
38513857#else
38523858 sshfs .rename_workaround = 0 ;
38533859#endif
3860+ sshfs .renamexdev_workaround = 0 ;
38543861 sshfs .truncate_workaround = 0 ;
38553862 sshfs .buflimit_workaround = 1 ;
38563863 sshfs .ssh_ver = 2 ;
0 commit comments