diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2006-09-10 20:53:36 +0000 |
---|---|---|
committer | Miklos Szeredi <miklos@szeredi.hu> | 2006-09-10 20:53:36 +0000 |
commit | 0c59ebfc9b811c60fcf808a5de33320eeeb394af (patch) | |
tree | 3f906a752cc13a2f46b177b6a8fdcd9df2503309 /kernel | |
parent | 349bdda3524368ee30dc92cafb6914717017fcdd (diff) | |
download | libfuse-0c59ebfc9b811c60fcf808a5de33320eeeb394af.tar.gz |
ulockmgr
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/configure.ac | 2 | ||||
-rw-r--r-- | kernel/file.c | 25 | ||||
-rw-r--r-- | kernel/inode.c | 7 |
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); } |