#include "fuse_i.h"
+#include <linux/pagemap.h>
#include <linux/slab.h>
#include <linux/file.h>
inode->i_uid = attr->uid;
inode->i_gid = attr->gid;
inode->i_size = attr->size;
- inode->i_blksize = attr->blksize;
+ inode->i_blksize = PAGE_CACHE_SIZE;
inode->i_blocks = attr->blocks;
inode->i_atime = attr->atime;
inode->i_mtime = attr->mtime;
return ret;
}
-static int read_link(struct dentry *dentry, char **bufp)
+static char *read_link(struct dentry *dentry)
{
struct inode *inode = dentry->d_inode;
struct fuse_conn *fc = INO_FC(inode);
struct fuse_in in = FUSE_IN_INIT;
struct fuse_out out = FUSE_OUT_INIT;
- unsigned long page;
+ char *link;
- page = __get_free_page(GFP_KERNEL);
- if(!page)
- return -ENOMEM;
+ link = (char *) __get_free_page(GFP_KERNEL);
+ if(!link)
+ return ERR_PTR(-ENOMEM);
in.h.opcode = FUSE_READLINK;
in.h.ino = inode->i_ino;
- out.arg = (void *) page;
+ out.arg = link;
out.argsize = PAGE_SIZE - 1;
out.argvar = 1;
request_send(fc, &in, &out);
if(out.h.error) {
- free_page(page);
- return out.h.error;
+ free_page((unsigned long) link);
+ return ERR_PTR(out.h.error);
}
- *bufp = (char *) page;
- (*bufp)[out.argsize] = '\0';
- return 0;
+ link[out.argsize] = '\0';
+ return link;
}
static void free_link(char *link)
{
- free_page((unsigned long) link);
+ if(!IS_ERR(link))
+ free_page((unsigned long) link);
}
static int fuse_readlink(struct dentry *dentry, char *buffer, int buflen)
int ret;
char *link;
- ret = read_link(dentry, &link);
- if(ret)
- return ret;
-
+ link = read_link(dentry);
ret = vfs_readlink(dentry, buffer, buflen, link);
free_link(link);
return ret;
int ret;
char *link;
- ret = read_link(dentry, &link);
- if(ret)
- return ret;
-
+ link = read_link(dentry);
ret = vfs_follow_link(nd, link);
free_link(link);
return ret;
{
if(!entry->d_inode)
return 0;
- else if(!(flags & LOOKUP_CONTINUE) &&
- time_after(jiffies, entry->d_time + FUSE_REVALIDATE_TIME))
+ else if(!(flags & LOOKUP_CONTINUE))
return 0;
else
return 1;
#include "fuse_i.h"
+#include <linux/pagemap.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/file.h>
struct inode *root;
struct fuse_mount_data *d = data;
- sb->s_blocksize = 1024;
- sb->s_blocksize_bits = 10;
+ sb->s_blocksize = PAGE_CACHE_SIZE;
+ sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
sb->s_magic = FUSE_SUPER_MAGIC;
sb->s_op = &fuse_super_operations;