sshfs-fuse options for lenny
Luk Claes wrote:
>> Options for lenny might be
>> - stay at 2.0,
>> - pick the most important fix(es) and have ~50-~70 (code-) lines diff,
>> - take the whole 2.1 and have the full diff.
>>
>> Does the release team have a preference?
> I prefer seeing the whole diff :-)
It's not uploaded yet, attached is a diff between the upstream versions.
Based on my preliminary inspection, just taking the caching fix would
amount to taking most of the cache.[ch] diff and also a chunk of the
sshfs.c.
Shipping 2.0 would mean no diff at all.
Kind regards
T.
> PS: Please mention source package names.
Apologies, I'll try keep that in mind.
--
Thomas Viehmann, http://thomas.viehmann.net/
diff -burN sshfs-fuse-2.0/cache.c sshfs-fuse-2.1/cache.c
--- sshfs-fuse-2.0/cache.c 2007-12-11 23:23:24.000000000 +0100
+++ sshfs-fuse-2.1/cache.c 2008-07-11 13:00:33.000000000 +0200
@@ -28,6 +28,7 @@
GHashTable *table;
pthread_mutex_t lock;
time_t last_cleaned;
+ uint64_t write_ctr;
};
static struct cache cache;
@@ -47,6 +48,7 @@
fuse_dirh_t h;
fuse_dirfil_t filler;
GPtrArray *dir;
+ uint64_t wrctr;
};
static void free_node(gpointer node_)
@@ -108,6 +110,14 @@
pthread_mutex_unlock(&cache.lock);
}
+void cache_invalidate_write(const char *path)
+{
+ pthread_mutex_lock(&cache.lock);
+ cache_purge(path);
+ cache.write_ctr++;
+ pthread_mutex_unlock(&cache.lock);
+}
+
static void cache_invalidate_dir(const char *path)
{
pthread_mutex_lock(&cache.lock);
@@ -148,12 +158,13 @@
return node;
}
-void cache_add_attr(const char *path, const struct stat *stbuf)
+void cache_add_attr(const char *path, const struct stat *stbuf, uint64_t wrctr)
{
struct node *node;
time_t now;
pthread_mutex_lock(&cache.lock);
+ if (wrctr == cache.write_ctr) {
node = cache_get(path);
now = time(NULL);
node->stat = *stbuf;
@@ -161,6 +172,7 @@
if (node->stat_valid > node->valid)
node->valid = node->stat_valid;
cache_clean();
+ }
pthread_mutex_unlock(&cache.lock);
}
@@ -222,13 +234,25 @@
return err;
}
+uint64_t cache_get_write_ctr(void)
+{
+ uint64_t res;
+
+ pthread_mutex_lock(&cache.lock);
+ res = cache.write_ctr;
+ pthread_mutex_unlock(&cache.lock);
+
+ return res;
+}
+
static int cache_getattr(const char *path, struct stat *stbuf)
{
int err = cache_get_attr(path, stbuf);
if (err) {
+ uint64_t wrctr = cache_get_write_ctr();
err = cache.next_oper->oper.getattr(path, stbuf);
if (!err)
- cache_add_attr(path, stbuf);
+ cache_add_attr(path, stbuf, wrctr);
}
return err;
}
@@ -268,7 +292,7 @@
const char *basepath = !ch->path[1] ? "" : ch->path;
fullpath = g_strdup_printf("%s/%s", basepath, name);
- cache_add_attr(fullpath, stbuf);
+ cache_add_attr(fullpath, stbuf, ch->wrctr);
g_free(fullpath);
}
}
@@ -299,6 +323,7 @@
ch.h = h;
ch.filler = filler;
ch.dir = g_ptr_array_new();
+ ch.wrctr = cache_get_write_ctr();
err = cache.next_oper->cache_getdir(path, &ch, cache_dirfill);
g_ptr_array_add(ch.dir, NULL);
dir = (char **) ch.dir->pdata;
@@ -421,7 +446,7 @@
{
int res = cache.next_oper->oper.write(path, buf, size, offset, fi);
if (res >= 0)
- cache_invalidate(path);
+ cache_invalidate_write(path);
return res;
}
@@ -449,9 +474,10 @@
{
int err = cache_get_attr(path, stbuf);
if (err) {
+ uint64_t wrctr = cache_get_write_ctr();
err = cache.next_oper->oper.fgetattr(path, stbuf, fi);
if (!err)
- cache_add_attr(path, stbuf);
+ cache_add_attr(path, stbuf, wrctr);
}
return err;
}
diff -burN sshfs-fuse-2.0/cache.h sshfs-fuse-2.1/cache.h
--- sshfs-fuse-2.0/cache.h 2006-02-20 12:43:23.000000000 +0100
+++ sshfs-fuse-2.1/cache.h 2008-07-11 13:00:33.000000000 +0200
@@ -24,5 +24,6 @@
struct fuse_operations *cache_init(struct fuse_cache_operations *oper);
int cache_parse_options(struct fuse_args *args);
-void cache_add_attr(const char *path, const struct stat *stbuf);
+void cache_add_attr(const char *path, const struct stat *stbuf, uint64_t wrctr);
void cache_invalidate(const char *path);
+uint64_t cache_get_write_ctr(void);
diff -burN sshfs-fuse-2.0/ChangeLog sshfs-fuse-2.1/ChangeLog
--- sshfs-fuse-2.0/ChangeLog 2008-04-23 14:07:58.000000000 +0200
+++ sshfs-fuse-2.1/ChangeLog 2008-07-11 13:00:33.000000000 +0200
@@ -1,3 +1,31 @@
+2008-07-11 Miklos Szeredi <miklos@szeredi.hu>
+
+ * Released 2.1
+
+2008-07-11 Miklos Szeredi <miklos@szeredi.hu>
+
+ * Fix statvfs extension to match the current protocol in
+ opensshfs
+
+ * Check version numbers of extensions, so such changes wouldn't
+ cause stupid behavior
+
+2008-06-24 Miklos Szeredi <miklos@szeredi.hu>
+
+ * Add '-F' option to specify the ssh config file. Patch by Pat
+ Pascal.
+
+2008-05-06 Miklos Szeredi <miklos@szeredi.hu>
+
+ * Fix bug in caching which could cause file corruption for append
+ mode writes. Reported by Jose Alonso
+
+2008-05-05 Miklos Szeredi <miklos@szeredi.hu>
+
+ * Fix compile on OS X. Original patch from Michael G Schwern
+
+ * Fix compile on Solaris. Reported by Jean-Jacques Sarton
+
2008-04-23 Miklos Szeredi <miklos@szeredi.hu>
* Released 2.0
diff -burN sshfs-fuse-2.0/configure sshfs-fuse-2.1/configure
--- sshfs-fuse-2.0/configure 2008-04-22 18:05:27.000000000 +0200
+++ sshfs-fuse-2.1/configure 2008-07-11 13:04:07.000000000 +0200
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.61 for sshfs-fuse 2.0.
+# Generated by GNU Autoconf 2.61 for sshfs-fuse 2.1.
#
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
@@ -572,8 +572,8 @@
# Identity of this package.
PACKAGE_NAME='sshfs-fuse'
PACKAGE_TARNAME='sshfs-fuse'
-PACKAGE_VERSION='2.0'
-PACKAGE_STRING='sshfs-fuse 2.0'
+PACKAGE_VERSION='2.1'
+PACKAGE_STRING='sshfs-fuse 2.1'
PACKAGE_BUGREPORT=''
ac_subst_vars='SHELL
@@ -1174,7 +1174,7 @@
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures sshfs-fuse 2.0 to adapt to many kinds of systems.
+\`configure' configures sshfs-fuse 2.1 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1240,7 +1240,7 @@
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of sshfs-fuse 2.0:";;
+ short | recursive ) echo "Configuration of sshfs-fuse 2.1:";;
esac
cat <<\_ACEOF
@@ -1327,7 +1327,7 @@
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-sshfs-fuse configure 2.0
+sshfs-fuse configure 2.1
generated by GNU Autoconf 2.61
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1341,7 +1341,7 @@
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by sshfs-fuse $as_me 2.0, which was
+It was created by sshfs-fuse $as_me 2.1, which was
generated by GNU Autoconf 2.61. Invocation command line was
$ $0 $@
@@ -2011,7 +2011,7 @@
# Define the identity of the package.
PACKAGE='sshfs-fuse'
- VERSION='2.0'
+ VERSION='2.1'
cat >>confdefs.h <<_ACEOF
@@ -4274,7 +4274,7 @@
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by sshfs-fuse $as_me 2.0, which was
+This file was extended by sshfs-fuse $as_me 2.1, which was
generated by GNU Autoconf 2.61. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -4327,7 +4327,7 @@
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF
ac_cs_version="\\
-sshfs-fuse config.status 2.0
+sshfs-fuse config.status 2.1
configured by $0, generated by GNU Autoconf 2.61,
with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
diff -burN sshfs-fuse-2.0/configure.ac sshfs-fuse-2.1/configure.ac
--- sshfs-fuse-2.0/configure.ac 2008-04-22 18:02:41.000000000 +0200
+++ sshfs-fuse-2.1/configure.ac 2008-07-11 13:00:33.000000000 +0200
@@ -1,4 +1,4 @@
-AC_INIT(sshfs-fuse, 2.0)
+AC_INIT(sshfs-fuse, 2.1)
AM_INIT_AUTOMAKE
AM_CONFIG_HEADER(config.h)
diff -burN sshfs-fuse-2.0/sshfs.1 sshfs-fuse-2.1/sshfs.1
--- sshfs-fuse-2.0/sshfs.1 2008-04-23 14:07:40.000000000 +0200
+++ sshfs-fuse-2.1/sshfs.1 2008-07-11 13:00:33.000000000 +0200
@@ -1,8 +1,24 @@
.TH SSHFS "1" "April 2008" "SSHFS version 2.0" "User Commands"
.SH NAME
SSHFS \- filesystem client based on ssh
+.SH SYNOPSIS
+.SS mounting
+.TP
+\fBsshfs\fP [\fIuser\fP@]\fBhost\fP:[\fIdir\fP] \fBmountpoint\fP [\fIoptions\fP]
+.SS unmounting
+.TP
+\fBfusermount -u mountpoint\fP
.SH DESCRIPTION
-usage: sshfs [user@]host:[dir] mountpoint [options]
+SSHFS (Secure SHell FileSystem) is a file system for Linux (and other
+operating systems with a FUSE implementation, such as Mac OS X or FreeBSD)
+capable of operating on files on a remote computer using just a secure
+shell login on the remote computer. On the local computer where the SSHFS
+is mounted, the implementation makes use of the FUSE (Filesystem in
+Userspace) kernel module. The practical effect of this is that the end user
+can seamlessly interact with remote files being securely served over SSH
+just as if they were local files on his/her computer. On the remote
+computer the SFTP subsystem of SSH is used.
+.SH OPTIONS
.SS "general options:"
.TP
\fB\-o\fR opt,[opt...]
@@ -21,6 +37,9 @@
\fB\-C\fR
equivalent to '\-o compression=yes'
.TP
+\fB\-F\fR ssh_configfile
+specifies alternative ssh configuration file
+.TP
\fB\-1\fR
equivalent to '\-o ssh_protocol=1'
.TP
@@ -47,6 +66,7 @@
.TP
\fB\-o\fR workaround=LIST
colon separated list of workarounds
+.RS 8
.TP
none
no workarounds enabled
@@ -65,15 +85,18 @@
.TP
[no]buflimit
fix buffer fillup bug in server (default: on)
+.RE
.TP
\fB\-o\fR idmap=TYPE
user/group ID mapping, possible types are:
+.RS 8
.TP
none
no translation of the ID space (default)
.TP
user
only translate UID of connecting user
+.RE
.TP
\fB\-o\fR ssh_command=CMD
execute CMD instead of 'ssh'
@@ -212,3 +235,12 @@
.TP
\fB\-o\fR to_code=CHARSET
new encoding of the file names (default: ISO-8859-2)
+.PD
+.SH "AUTHORS"
+.LP
+SSHFS has been written by Miklos Seredi <miklos@szeredi.hu>.
+.LP
+This man page was written by Bartosz Fenski <fenio@debian.org> for the
+Debian GNU/Linux distribution (but it may be used by others).
+
+
diff -burN sshfs-fuse-2.0/sshfs.c sshfs-fuse-2.1/sshfs.c
--- sshfs-fuse-2.0/sshfs.c 2008-04-22 18:02:42.000000000 +0200
+++ sshfs-fuse-2.1/sshfs.c 2008-07-11 13:00:33.000000000 +0200
@@ -24,6 +24,7 @@
#include <netdb.h>
#include <signal.h>
#include <sys/uio.h>
+#include <sys/types.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <sys/socket.h>
@@ -36,6 +37,15 @@
#include "cache.h"
+#ifndef MAP_LOCKED
+#define MAP_LOCKED 0
+#endif
+
+#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
+#define MAP_ANONYMOUS MAP_ANON
+#endif
+
+
#if FUSE_VERSION >= 23
#define SSHFS_USE_INIT
#endif
@@ -278,6 +288,7 @@
KEY_HELP,
KEY_VERSION,
KEY_FOREGROUND,
+ KEY_CONFIGFILE,
};
#define SSHFS_OPT(t, p, v) { t, offsetof(struct sshfs, p), v }
@@ -311,6 +322,7 @@
FUSE_OPT_KEY("debug", KEY_FOREGROUND),
FUSE_OPT_KEY("-d", KEY_FOREGROUND),
FUSE_OPT_KEY("-f", KEY_FOREGROUND),
+ FUSE_OPT_KEY("-F ", KEY_CONFIGFILE),
FUSE_OPT_END
};
@@ -650,29 +662,29 @@
static int buf_get_statvfs(struct buffer *buf, struct statvfs *stbuf)
{
- uint32_t bsize;
- uint32_t frsize;
+ uint64_t bsize;
+ uint64_t frsize;
uint64_t blocks;
uint64_t bfree;
uint64_t bavail;
uint64_t files;
uint64_t ffree;
uint64_t favail;
- uint32_t fsid;
- uint32_t flag;
- uint32_t namemax;
+ uint64_t fsid;
+ uint64_t flag;
+ uint64_t namemax;
- if (buf_get_uint32(buf, &bsize) == -1 ||
- buf_get_uint32(buf, &frsize) == -1 ||
+ if (buf_get_uint64(buf, &bsize) == -1 ||
+ buf_get_uint64(buf, &frsize) == -1 ||
buf_get_uint64(buf, &blocks) == -1 ||
buf_get_uint64(buf, &bfree) == -1 ||
buf_get_uint64(buf, &bavail) == -1 ||
buf_get_uint64(buf, &files) == -1 ||
buf_get_uint64(buf, &ffree) == -1 ||
buf_get_uint64(buf, &favail) == -1 ||
- buf_get_uint32(buf, &fsid) == -1 ||
- buf_get_uint32(buf, &flag) == -1 ||
- buf_get_uint32(buf, &namemax) == -1) {
+ buf_get_uint64(buf, &fsid) == -1 ||
+ buf_get_uint64(buf, &flag) == -1 ||
+ buf_get_uint64(buf, &namemax) == -1) {
return -1;
}
@@ -1338,11 +1350,13 @@
DEBUG("Extension: %s <%s>\n", ext, extdata);
- if (strcmp(ext, SFTP_EXT_POSIX_RENAME) == 0) {
+ if (strcmp(ext, SFTP_EXT_POSIX_RENAME) == 0 &&
+ strcmp(extdata, "1") == 0) {
sshfs.ext_posix_rename = 1;
sshfs.rename_workaround = 0;
}
- if (strcmp(ext, SFTP_EXT_STATVFS) == 0)
+ if (strcmp(ext, SFTP_EXT_STATVFS) == 0 &&
+ strcmp(extdata, "2") == 0)
sshfs.ext_statvfs = 1;
} while (buf2.len < buf2.size);
}
@@ -2116,6 +2130,7 @@
uint32_t pflags = 0;
struct iovec iov;
uint8_t type;
+ uint64_t wrctr = cache_get_write_ctr();
if ((fi->flags & O_ACCMODE) == O_RDONLY)
pflags = SSH_FXF_READ;
@@ -2171,7 +2186,7 @@
}
if (!err) {
- cache_add_attr(path, &stbuf);
+ cache_add_attr(path, &stbuf, wrctr);
buf_finish(&sf->handle);
fi->fh = (unsigned long) sf;
} else {
@@ -2823,6 +2838,7 @@
"SSHFS options:\n"
" -p PORT equivalent to '-o port=PORT'\n"
" -C equivalent to '-o compression=yes'\n"
+" -F ssh_configfile specifies alternative ssh configuration file\n"
" -1 equivalent to '-o ssh_protocol=1'\n"
" -o reconnect reconnect to server\n"
" -o sshfs_sync synchronous writes\n"
@@ -2913,6 +2929,12 @@
ssh_add_arg("-oCompression=yes");
return 0;
+ case KEY_CONFIGFILE:
+ tmp = g_strdup_printf("-F%s", arg + 2);
+ ssh_add_arg(tmp);
+ g_free(tmp);
+ return 0;
+
case KEY_HELP:
usage(outargs->argv[0]);
fuse_opt_add_arg(outargs, "-ho");
Reply to: