aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorMiklos Szeredi <miklos@szeredi.hu>2005-08-01 11:58:51 +0000
committerMiklos Szeredi <miklos@szeredi.hu>2005-08-01 11:58:51 +0000
commite77cc07e755c1e360455e707653f705d0bd25622 (patch)
tree4aa51ed10ce87556f71d1bc3591f7b0a33d701be /kernel
parentcac547059462a58ec26159cdc408f5828cfe40e5 (diff)
downloadlibfuse-e77cc07e755c1e360455e707653f705d0bd25622.tar.gz
fix
Diffstat (limited to 'kernel')
-rw-r--r--kernel/file.c27
-rw-r--r--kernel/fuse_i.h6
-rw-r--r--kernel/fuse_kernel.h3
-rw-r--r--kernel/inode.c12
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;