diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2005-08-01 11:58:51 +0000 |
---|---|---|
committer | Miklos Szeredi <miklos@szeredi.hu> | 2005-08-01 11:58:51 +0000 |
commit | e77cc07e755c1e360455e707653f705d0bd25622 (patch) | |
tree | 4aa51ed10ce87556f71d1bc3591f7b0a33d701be /kernel | |
parent | cac547059462a58ec26159cdc408f5828cfe40e5 (diff) | |
download | libfuse-e77cc07e755c1e360455e707653f705d0bd25622.tar.gz |
fix
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/file.c | 27 | ||||
-rw-r--r-- | kernel/fuse_i.h | 6 | ||||
-rw-r--r-- | kernel/fuse_kernel.h | 3 | ||||
-rw-r--r-- | kernel/inode.c | 12 |
4 files changed, 16 insertions, 32 deletions
diff --git a/kernel/file.c b/kernel/file.c index 5ceea6e..013093d 100644 --- a/kernel/file.c +++ b/kernel/file.c @@ -16,6 +16,8 @@ #define PageUptodate(page) Page_Uptodate(page) #define clear_page_dirty(page) ClearPageDirty(page) #endif +static struct file_operations fuse_direct_io_file_operations; + int fuse_open_common(struct inode *inode, struct file *file, int isdir) { struct fuse_conn *fc = get_fuse_conn(inode); @@ -65,16 +67,19 @@ int fuse_open_common(struct inode *inode, struct file *file, int isdir) req->out.args[0].value = &outarg; request_send(fc, req); err = req->out.h.error; - if (!err && !(fc->flags & FUSE_KERNEL_CACHE)) -#ifdef KERNEL_2_6 - invalidate_inode_pages(inode->i_mapping); -#else - invalidate_inode_pages(inode); -#endif if (err) { fuse_request_free(ff->release_req); kfree(ff); } else { + if (!isdir && (outarg.open_flags & FOPEN_DIRECT_IO)) + file->f_op = &fuse_direct_io_file_operations; + if (!(outarg.open_flags & FOPEN_KEEP_CACHE)) { +#ifdef KERNEL_2_6 + invalidate_inode_pages(inode->i_mapping); +#else + invalidate_inode_pages(inode); +#endif + } ff->fh = outarg.fh; file->private_data = ff; } @@ -814,12 +819,6 @@ static struct address_space_operations fuse_file_aops = { void fuse_init_file_inode(struct inode *inode) { - struct fuse_conn *fc = get_fuse_conn(inode); - - if (fc->flags & FUSE_DIRECT_IO) - inode->i_fop = &fuse_direct_io_file_operations; - else { - inode->i_fop = &fuse_file_operations; - inode->i_data.a_ops = &fuse_file_aops; - } + inode->i_fop = &fuse_file_operations; + inode->i_data.a_ops = &fuse_file_aops; } diff --git a/kernel/fuse_i.h b/kernel/fuse_i.h index 7843a96..4faaff7 100644 --- a/kernel/fuse_i.h +++ b/kernel/fuse_i.h @@ -90,17 +90,11 @@ static inline void set_page_dirty_lock(struct page *page) doing the mount will be allowed to access the filesystem */ #define FUSE_ALLOW_OTHER (1 << 1) -/** If the FUSE_KERNEL_CACHE flag is given, then cached data will not - be flushed on open */ -#define FUSE_KERNEL_CACHE (1 << 2) - #ifndef KERNEL_2_6 /** Allow FUSE to combine reads into 64k chunks. This is useful if the filesystem is better at handling large chunks */ #define FUSE_LARGE_READ (1 << 31) #endif -/** Bypass the page cache for read and write operations */ -#define FUSE_DIRECT_IO (1 << 3) /** FUSE inode */ struct fuse_inode { diff --git a/kernel/fuse_kernel.h b/kernel/fuse_kernel.h index a470bed..fc99b7d 100644 --- a/kernel/fuse_kernel.h +++ b/kernel/fuse_kernel.h @@ -71,6 +71,9 @@ struct fuse_file_lock { #define FATTR_MTIME (1 << 5) #define FATTR_CTIME (1 << 6) +#define FOPEN_DIRECT_IO (1 << 0) +#define FOPEN_KEEP_CACHE (1 << 1) + enum fuse_opcode { FUSE_LOOKUP = 1, FUSE_FORGET = 2, /* no reply */ diff --git a/kernel/inode.c b/kernel/inode.c index 60c5ade..2bc2ac8 100644 --- a/kernel/inode.c +++ b/kernel/inode.c @@ -402,19 +402,11 @@ static int parse_fuse_opt(char *opt, struct fuse_mount_data *d) d->flags |= FUSE_ALLOW_OTHER; break; - case OPT_KERNEL_CACHE: - d->flags |= FUSE_KERNEL_CACHE; - break; - #ifndef KERNEL_2_6 case OPT_LARGE_READ: d->flags |= FUSE_LARGE_READ; break; #endif - case OPT_DIRECT_IO: - d->flags |= FUSE_DIRECT_IO; - break; - case OPT_MAX_READ: if (match_int(&args[0], &value)) return 0; @@ -443,14 +435,10 @@ static int fuse_show_options(struct seq_file *m, struct vfsmount *mnt) seq_puts(m, ",default_permissions"); if (fc->flags & FUSE_ALLOW_OTHER) seq_puts(m, ",allow_other"); - if (fc->flags & FUSE_KERNEL_CACHE) - seq_puts(m, ",kernel_cache"); #ifndef KERNEL_2_6 if (fc->flags & FUSE_LARGE_READ) seq_puts(m, ",large_read"); #endif - if (fc->flags & FUSE_DIRECT_IO) - seq_puts(m, ",direct_io"); if (fc->max_read != ~0) seq_printf(m, ",max_read=%u", fc->max_read); return 0; |