Skip to content

Commit

Permalink
Re-enabled writeback cache.
Browse files Browse the repository at this point in the history
Fixes: libfuse#72.
  • Loading branch information
Nikratio committed Aug 6, 2017
1 parent 6ac4046 commit d141ea4
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 10 deletions.
3 changes: 1 addition & 2 deletions ChangeLog.rst
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
Unreleased Changes
------------------

* Truly disable the writeback cache, instead of just adjusting the
default and printing a warning when explicitly enabled.
* Re-enabled writeback cache.
* SSHFS now supports O_APPEND.

Release 3.1.0 (2017-08-04)
Expand Down
10 changes: 10 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,16 @@ individual files when seen through an SSHFS mount, i.e. they will
appear to have different inodes and an *st_nlink* value of 1.


O_APPEND
~~~~~~~~

When writeback caching is enabled, SSHFS cannot reliably support the
``O_APPEND`` open flag and thus signals an error on open. To enable
support for unreliable ``O_APPEND`` (which may overwrite data if the
file changes on the server at a bad time), mount the file system with
``-o unreliable_append``.


Getting Help
------------

Expand Down
30 changes: 23 additions & 7 deletions sshfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,7 @@ struct sshfs {
int rename_workaround;
int truncate_workaround;
int buflimit_workaround;
int unrel_append;
int fstat_workaround;
int transform_symlinks;
int follow_symlinks;
Expand Down Expand Up @@ -409,6 +410,7 @@ static struct fuse_opt sshfs_opts[] = {
SSHFS_OPT("dir_cache=no", dir_cache, 0),
SSHFS_OPT("writeback_cache=yes", writeback_cache, 1),
SSHFS_OPT("writeback_cache=no", writeback_cache, 0),
SSHFS_OPT("unreliable_append", unrel_append, 1),

SSHFS_OPT("-h", show_help, 1),
SSHFS_OPT("--help", show_help, 1),
Expand Down Expand Up @@ -2500,6 +2502,24 @@ static int sshfs_open_common(const char *path, mode_t mode,
if (sshfs.dir_cache)
wrctr = cache_get_write_ctr();

/* With writeback cache, kernel may send read requests even
when userspace opened write-only */
if (sshfs.writeback_cache &&
(fi->flags & O_ACCMODE) == O_WRONLY) {
fi->flags &= ~O_ACCMODE;
fi->flags |= O_RDWR;
}

/* Having the kernel handle O_APPEND doesn't work reliably, if
the file changes on the server at the wrong time, we will
overwrite data instead of appending. */
if ((fi->flags & O_APPEND) && sshfs.writeback_cache) {
if(sshfs.unrel_append)
fi->flags &= ~O_APPEND;
else
return -EINVAL;
}

if ((fi->flags & O_ACCMODE) == O_RDONLY)
pflags = SSH_FXF_READ;
else if((fi->flags & O_ACCMODE) == O_WRONLY)
Expand Down Expand Up @@ -3344,6 +3364,7 @@ static void usage(const char *progname)
" -o sshfs_sync synchronous writes\n"
" -o no_readahead synchronous reads (no speculative readahead)\n"
" -o sync_readdir synchronous readdir\n"
" -o unreliable_append Enable (unreliable) O_APPEND support\n"
" -d, --debug print some debugging information (implies -f)\n"
" -o writeback_cache=BOOL enable writeback cache {yes,no} (default: yes)\n"
" -o dir_cache=BOOL enable caching of directory contents (names,\n"
Expand Down Expand Up @@ -3855,7 +3876,8 @@ int main(int argc, char *argv[])
sshfs.wfd = -1;
sshfs.ptyfd = -1;
sshfs.dir_cache = 1;
sshfs.writeback_cache = 0;
sshfs.writeback_cache = 1;
sshfs.unrel_append = 0;
sshfs.show_help = 0;
sshfs.show_version = 0;
sshfs.singlethread = 0;
Expand Down Expand Up @@ -3904,12 +3926,6 @@ int main(int argc, char *argv[])
exit(1);
}

if(sshfs.writeback_cache) {
printf("NOTICE: writeback cache is disabled in this release due to potential\n"
"dataloss. It will be re-enabled in a future SSHFS release.\n");
sshfs.writeback_cache = 0;
}

if (sshfs.idmap == IDMAP_USER)
sshfs.detect_uid = 1;
else if (sshfs.idmap == IDMAP_FILE) {
Expand Down
3 changes: 2 additions & 1 deletion test/test_sshfs.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,8 @@ def test_sshfs(tmpdir, debug, cache_timeout, sync_rd,
cmdline += [ '-o', 'sync_readdir' ]

if writeback:
cmdline += [ '-o', 'writeback_cache=yes' ]
cmdline += [ '-o', 'writeback_cache=yes',
'-o', 'unreliable_append' ]
else:
cmdline += [ '-o', 'writeback_cache=no' ]

Expand Down

0 comments on commit d141ea4

Please sign in to comment.