aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorMiklos Szeredi <miklos@szeredi.hu>2006-09-10 20:53:36 +0000
committerMiklos Szeredi <miklos@szeredi.hu>2006-09-10 20:53:36 +0000
commit0c59ebfc9b811c60fcf808a5de33320eeeb394af (patch)
tree3f906a752cc13a2f46b177b6a8fdcd9df2503309 /kernel
parent349bdda3524368ee30dc92cafb6914717017fcdd (diff)
downloadlibfuse-0c59ebfc9b811c60fcf808a5de33320eeeb394af.tar.gz
ulockmgr
Diffstat (limited to 'kernel')
-rw-r--r--kernel/configure.ac2
-rw-r--r--kernel/file.c25
-rw-r--r--kernel/inode.c7
3 files changed, 32 insertions, 2 deletions
diff --git a/kernel/configure.ac b/kernel/configure.ac
index c3c1f3f..910e125 100644
--- a/kernel/configure.ac
+++ b/kernel/configure.ac
@@ -1,4 +1,4 @@
-AC_INIT(fuse-kernel, 2.6.0-pre3)
+AC_INIT(fuse-kernel, 2.6.0-rc1)
AC_CONFIG_HEADERS([config.h])
AC_PROG_INSTALL
diff --git a/kernel/file.c b/kernel/file.c
index 61eba56..e3a42c0 100644
--- a/kernel/file.c
+++ b/kernel/file.c
@@ -867,9 +867,32 @@ static int fuse_setlk(struct file *file, struct file_lock *fl)
/* Unlock on close is handled by the flush method */
if (fl->fl_flags & FL_CLOSE)
return 0;
-#endif
req = fuse_get_req(fc);
+#else
+ /* If it's (possibly) unlock on close, don't fail the allocation */
+ if (fl->fl_type == F_UNLCK && fl->fl_start == 0 &&
+ fl->fl_end == OFFSET_MAX)
+ req = fuse_get_req_nofail(fc, file);
+ else {
+ /* Hack: add dummy lock, otherwise unlock on close is
+ optimized away */
+ struct file_lock **flp;
+ for (flp = &inode->i_flock;
+ *flp && !((*flp)->fl_flags & FL_POSIX);
+ flp = &(*flp)->fl_next);
+ if (!*flp) {
+ struct file_lock *dummy =
+ kmalloc(sizeof(struct file_lock), GFP_KERNEL);
+ if (!dummy)
+ return -ENOLCK;
+ locks_init_lock(dummy);
+ dummy->fl_flags |= FL_POSIX;
+ *flp = dummy;
+ }
+ req = fuse_get_req(fc);
+ }
+#endif
if (IS_ERR(req))
return PTR_ERR(req);
diff --git a/kernel/inode.c b/kernel/inode.c
index 0145045..475513b 100644
--- a/kernel/inode.c
+++ b/kernel/inode.c
@@ -83,6 +83,13 @@ static void fuse_destroy_inode(struct inode *inode)
struct fuse_inode *fi = get_fuse_inode(inode);
if (fi->forget_req)
fuse_request_free(fi->forget_req);
+#ifndef KERNEL_2_6_18_PLUS
+ if (inode->i_flock) {
+ WARN_ON(inode->i_flock->fl_next);
+ kfree(inode->i_flock);
+ inode->i_flock = NULL;
+ }
+#endif
kmem_cache_free(fuse_inode_cachep, inode);
}