+2005-03-05 Miklos Szeredi <miklos@szeredi.hu>
+
+ * Released 2.2.1
+
+2005-03-04 Miklos Szeredi <miklos@szeredi.hu>
+
+ * kernel: fix nasty bug which could cause an Oops under certain
+ situations. Found by Magnus Johansson
+
+2005-02-28 Miklos Szeredi <miklos@szeredi.hu>
+
+ * kernel: llseek() method for files and directories made explicit
+
+ * kernel: fixed inode leak in NFS export in case of nodeid
+ wrapping
+
+2005-02-15 Miklos Szeredi <miklos@szeredi.hu>
+
+ * libfuse: clean up some unitialized memory found with valgrind
+
+ * Add -lpthread to Libs in fuse.pc. Valgrind seems to need an
+ explicitly linked libpthread for applications
+
+2005-02-10 Miklos Szeredi <miklos@szeredi.hu>
+
+ * fusermount: set umask, otherwise /etc/mtab will have
+ unpredictable permission. Spotted by Jindrich Kolorenc
+
+ * fusermount: set owner and group of /etc/mtab to original values
+ on unmount
+
+ * libfuse: add 'use_ino' option to help. Patch by Valient Gough
+
2005-02-02 Miklos Szeredi <miklos@szeredi.hu>
* Released 2.2
+What is new in 2.2.1
+
+ - Bug fixes
+
What is new in 2.2
Userspace changes:
make install
modprobe fuse
-Also see the file 'INSTALL'
+You may also need to add '/usr/local/lib' to '/etc/ld.so.conf' and/or
+run ldconfig.
+
+For more details see the file 'INSTALL'
How To Use
==========
-AC_INIT(fuse, 2.2)
+AC_INIT(fuse, 2.2.1)
AM_INIT_AUTOMAKE
AM_CONFIG_HEADER(include/config.h)
Name: fuse
Description: Filesystem in Userspace
Version: @VERSION@
-Libs: -L${libdir} -lfuse
+Libs: -L${libdir} -lfuse -lpthread
Cflags: -I${includedir}/fuse -D_FILE_OFFSET_BITS=64
-AC_INIT(fuse-kernel, 2.2)
+AC_INIT(fuse-kernel, 2.2.1)
AC_CONFIG_HEADERS([config.h])
AC_PROG_INSTALL
static void fuse_putback_request(struct fuse_conn *fc, struct fuse_req *req)
{
- if (!req->preallocated)
- fuse_request_free(req);
-
spin_lock(&fuse_lock);
if (req->preallocated)
list_add(&req->list, &fc->unused_list);
+ else
+ fuse_request_free(req);
if (fc->outstanding_debt)
fc->outstanding_debt--;
};
static struct file_operations fuse_dir_operations = {
+ .llseek = generic_file_llseek,
.read = generic_read_dir,
.readdir = fuse_readdir,
.open = fuse_dir_open,
#endif
static struct file_operations fuse_file_operations = {
+ .llseek = generic_file_llseek,
.read = fuse_file_read,
.write = fuse_file_write,
.mmap = fuse_file_mmap,
return ERR_PTR(-ESTALE);
inode = ilookup5(sb, nodeid, fuse_inode_eq, &nodeid);
- if (!inode || inode->i_generation != generation)
+ if (!inode)
+ return ERR_PTR(-ESTALE);
+ if (inode->i_generation != generation) {
+ iput(inode);
return ERR_PTR(-ESTALE);
+ }
entry = d_alloc_anon(inode);
if (!entry) {
mount.c \
fuse_i.h
-libfuse_la_LDFLAGS = -lpthread -version-number 2:2:0 \
+libfuse_la_LDFLAGS = -lpthread -version-number 2:2:1 \
-Wl,--version-script,fuse_versionscript
EXTRA_DIST = fuse_versionscript
struct fuse_open_out outarg;
struct fuse_file_info fi;
+ memset(&outarg, 0, sizeof(outarg));
memset(&fi, 0, sizeof(fi));
fi.flags = arg->flags;
res = -ENOENT;
(void) arg;
+ memset(&outarg, 0, sizeof(outarg));
res = -ENOMEM;
dh = (struct fuse_dirhandle *) malloc(sizeof(struct fuse_dirhandle));
if (dh != NULL) {
+ memset(dh, 0, sizeof(struct fuse_dirhandle));
dh->fuse = f;
dh->fp = tmpfile();
dh->filled = 0;
fprintf(stderr,
"FUSE options:\n"
- " -d enable debug output (implies -f)\n"
- " -f foreground operation\n"
- " -s disable multithreaded operation\n"
- " -r mount read only (equivalent to '-o ro')\n"
- " -o opt,[opt...] mount options\n"
- " -h print help\n"
+ " -d enable debug output (implies -f)\n"
+ " -f foreground operation\n"
+ " -s disable multithreaded operation\n"
+ " -r mount read only (equivalent to '-o ro')\n"
+ " -o opt,[opt...] mount options\n"
+ " -h print help\n"
"\n"
"Mount options:\n"
" default_permissions enable permission checking\n"
" max_read=N set maximum size of read requests\n"
" hard_remove immediate removal (don't hide files)\n"
" debug enable debug output\n"
- " fsname=NAME set filesystem name in mtab\n");
+ " fsname=NAME set filesystem name in mtab\n"
+ " use_ino let filesystem set inode numbers\n");
}
static void invalid_option(const char *argv[], int argctr)
const char *mtab, const char *mtab_new)
{
int res;
+ struct stat sbuf;
if (getuid() != 0) {
res = drop_privs();
if (getuid() != 0)
restore_privs();
+ if (stat(mtab, &sbuf) == 0)
+ chown(mtab_new, sbuf.st_uid, sbuf.st_gid);
+
res = rename(mtab_new, mtab);
if (res == -1) {
fprintf(stderr, "%s: failed to rename %s to %s: %s\n", progname,
if (getuid() != 0)
restore_privs();
+ umask(033);
if (unmount) {
if (geteuid() == 0) {
int mtablock = lock_mtab();