diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/configure.ac | 14 | ||||
-rw-r--r-- | kernel/control.c | 4 | ||||
-rw-r--r-- | kernel/dev.c | 2 | ||||
-rw-r--r-- | kernel/file.c | 4 | ||||
-rw-r--r-- | kernel/fuse_i.h | 9 | ||||
-rw-r--r-- | kernel/inode.c | 61 |
6 files changed, 70 insertions, 24 deletions
diff --git a/kernel/configure.ac b/kernel/configure.ac index dabd513..d54b711 100644 --- a/kernel/configure.ac +++ b/kernel/configure.ac @@ -179,6 +179,20 @@ if test "$ENABLE_FUSE_MODULE" = y; then else AC_MSG_RESULT([no]) fi + AC_MSG_CHECKING([if inode has i_mutex field ]) + if egrep -qw "i_mutex" $kernelsrc/include/linux/fs.h; then + AC_DEFINE(HAVE_I_MUTEX, 1, [inode has i_mutex field]) + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + AC_MSG_CHECKING([if kernel has mutex.h ]) + if test -f $kernelsrc/include/linux/mutex.h; then + AC_DEFINE(HAVE_MUTEX_H, 1, [kernel has mutex.h]) + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi isuml=no KERNELMAKE_PARAMS= diff --git a/kernel/control.c b/kernel/control.c index 24e8fa4..494deb9 100644 --- a/kernel/control.c +++ b/kernel/control.c @@ -221,8 +221,12 @@ static struct super_block *fuse_ctl_get_sb(struct file_system_type *fs_type, static void fuse_ctl_kill_sb(struct super_block *sb) { + struct fuse_conn *fc; + mutex_lock(&fuse_mutex); fuse_control_sb = NULL; + list_for_each_entry(fc, &fuse_conn_list, entry) + fc->ctl_ndents = 0; mutex_unlock(&fuse_mutex); kill_litter_super(sb); diff --git a/kernel/dev.c b/kernel/dev.c index 252fe5c..d1885cd 100644 --- a/kernel/dev.c +++ b/kernel/dev.c @@ -43,7 +43,7 @@ static void fuse_request_init(struct fuse_req *req) struct fuse_req *fuse_request_alloc(void) { - struct fuse_req *req = kmem_cache_alloc(fuse_req_cachep, SLAB_KERNEL); + struct fuse_req *req = kmem_cache_alloc(fuse_req_cachep, GFP_KERNEL); if (req) fuse_request_init(req); return req; diff --git a/kernel/file.c b/kernel/file.c index 3006d02..d0f46ad 100644 --- a/kernel/file.c +++ b/kernel/file.c @@ -500,10 +500,8 @@ static int fuse_commit_write(struct file *file, struct page *page, i_size_write(inode, pos); spin_unlock(&fc->lock); - if (offset == 0 && to == PAGE_CACHE_SIZE) { - clear_page_dirty(page); + if (offset == 0 && to == PAGE_CACHE_SIZE) SetPageUptodate(page); - } } fuse_invalidate_attr(inode); return err; diff --git a/kernel/fuse_i.h b/kernel/fuse_i.h index 5259ee1..f4e2ece 100644 --- a/kernel/fuse_i.h +++ b/kernel/fuse_i.h @@ -42,7 +42,7 @@ # define KERNEL_2_6_19_PLUS #endif -#ifdef __arm__ +#if defined(__arm__) && LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) #define DCACHE_BUG #endif @@ -55,13 +55,18 @@ #include <linux/spinlock.h> #include <linux/mm.h> #include <linux/backing-dev.h> -#ifndef DEFINE_MUTEX +#ifdef HAVE_MUTEX_H +#include <linux/mutex.h> +#else +#include <asm/semaphore.h> #define DEFINE_MUTEX(m) DECLARE_MUTEX(m) #define mutex_init(m) init_MUTEX(m) #define mutex_destroy(m) do { } while (0) #define mutex_lock(m) down(m) #define mutex_unlock(m) up(m) #define mutex semaphore +#endif +#ifndef HAVE_I_MUTEX #define i_mutex i_sem /* Hack for struct inode */ #endif #ifndef KERNEL_2_6_19_PLUS diff --git a/kernel/inode.c b/kernel/inode.c index d40f502..57ebb51 100644 --- a/kernel/inode.c +++ b/kernel/inode.c @@ -52,7 +52,7 @@ static struct inode *fuse_alloc_inode(struct super_block *sb) struct inode *inode; struct fuse_inode *fi; - inode = kmem_cache_alloc(fuse_inode_cachep, SLAB_KERNEL); + inode = kmem_cache_alloc(fuse_inode_cachep, GFP_KERNEL); if (!inode) return NULL; @@ -637,8 +637,10 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent) return -EINVAL; if (is_bdev) { +#ifdef CONFIG_BLOCK if (!sb_set_blocksize(sb, d.blksize)) return -EINVAL; +#endif } else { sb->s_blocksize = PAGE_CACHE_SIZE; sb->s_blocksize_bits = PAGE_CACHE_SHIFT; @@ -734,7 +736,24 @@ static int fuse_get_sb(struct file_system_type *fs_type, { return get_sb_nodev(fs_type, flags, raw_data, fuse_fill_super, mnt); } +#else +static struct super_block *fuse_get_sb(struct file_system_type *fs_type, + int flags, const char *dev_name, + void *raw_data) +{ + return get_sb_nodev(fs_type, flags, raw_data, fuse_fill_super); +} +#endif + +static struct file_system_type fuse_fs_type = { + .owner = THIS_MODULE, + .name = "fuse", + .get_sb = fuse_get_sb, + .kill_sb = kill_anon_super, +}; +#ifdef CONFIG_BLOCK +#ifdef KERNEL_2_6_18_PLUS static int fuse_get_sb_blk(struct file_system_type *fs_type, int flags, const char *dev_name, void *raw_data, struct vfsmount *mnt) @@ -743,13 +762,6 @@ static int fuse_get_sb_blk(struct file_system_type *fs_type, mnt); } #else -static struct super_block *fuse_get_sb(struct file_system_type *fs_type, - int flags, const char *dev_name, - void *raw_data) -{ - return get_sb_nodev(fs_type, flags, raw_data, fuse_fill_super); -} - static struct super_block *fuse_get_sb_blk(struct file_system_type *fs_type, int flags, const char *dev_name, void *raw_data) @@ -759,13 +771,6 @@ static struct super_block *fuse_get_sb_blk(struct file_system_type *fs_type, } #endif -static struct file_system_type fuse_fs_type = { - .owner = THIS_MODULE, - .name = "fuse", - .get_sb = fuse_get_sb, - .kill_sb = kill_anon_super, -}; - static struct file_system_type fuseblk_fs_type = { .owner = THIS_MODULE, .name = "fuseblk", @@ -774,6 +779,26 @@ static struct file_system_type fuseblk_fs_type = { .fs_flags = FS_REQUIRES_DEV, }; +static inline int register_fuseblk(void) +{ + return register_filesystem(&fuseblk_fs_type); +} + +static inline void unregister_fuseblk(void) +{ + unregister_filesystem(&fuseblk_fs_type); +} +#else +static inline int register_fuseblk(void) +{ + return 0; +} + +static inline void unregister_fuseblk(void) +{ +} +#endif + #ifndef HAVE_FS_SUBSYS static decl_subsys(fs, NULL, NULL); #endif @@ -798,7 +823,7 @@ static int __init fuse_fs_init(void) if (err) goto out; - err = register_filesystem(&fuseblk_fs_type); + err = register_fuseblk(); if (err) goto out_unreg; @@ -813,7 +838,7 @@ static int __init fuse_fs_init(void) return 0; out_unreg2: - unregister_filesystem(&fuseblk_fs_type); + unregister_fuseblk(); out_unreg: unregister_filesystem(&fuse_fs_type); out: @@ -823,7 +848,7 @@ static int __init fuse_fs_init(void) static void fuse_fs_cleanup(void) { unregister_filesystem(&fuse_fs_type); - unregister_filesystem(&fuseblk_fs_type); + unregister_fuseblk(); kmem_cache_destroy(fuse_inode_cachep); } |