Commit 0aa7c699 authored by Miklos Szeredi's avatar Miklos Szeredi Committed by Linus Torvalds

[PATCH] fuse: clean up fuse_lookup()

Simplify fuse_lookup() and related functions.
Signed-off-by: default avatarMiklos Szeredi <miklos@szeredi.hu>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 524e3b62
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
#include <linux/gfp.h> #include <linux/gfp.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/namei.h> #include <linux/namei.h>
#include <linux/mount.h>
static inline unsigned long time_to_jiffies(unsigned long sec, static inline unsigned long time_to_jiffies(unsigned long sec,
unsigned long nsec) unsigned long nsec)
...@@ -22,6 +21,13 @@ static inline unsigned long time_to_jiffies(unsigned long sec, ...@@ -22,6 +21,13 @@ static inline unsigned long time_to_jiffies(unsigned long sec,
return jiffies + timespec_to_jiffies(&ts); return jiffies + timespec_to_jiffies(&ts);
} }
static void fuse_change_timeout(struct dentry *entry, struct fuse_entry_out *o)
{
struct fuse_inode *fi = get_fuse_inode(entry->d_inode);
entry->d_time = time_to_jiffies(o->entry_valid, o->entry_valid_nsec);
fi->i_time = time_to_jiffies(o->attr_valid, o->attr_valid_nsec);
}
static void fuse_lookup_init(struct fuse_req *req, struct inode *dir, static void fuse_lookup_init(struct fuse_req *req, struct inode *dir,
struct dentry *entry, struct dentry *entry,
struct fuse_entry_out *outarg) struct fuse_entry_out *outarg)
...@@ -66,10 +72,7 @@ static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd) ...@@ -66,10 +72,7 @@ static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd)
return 0; return 0;
fuse_change_attributes(inode, &outarg.attr); fuse_change_attributes(inode, &outarg.attr);
entry->d_time = time_to_jiffies(outarg.entry_valid, fuse_change_timeout(entry, &outarg);
outarg.entry_valid_nsec);
fi->i_time = time_to_jiffies(outarg.attr_valid,
outarg.attr_valid_nsec);
} }
return 1; return 1;
} }
...@@ -96,8 +99,8 @@ static struct dentry_operations fuse_dentry_operations = { ...@@ -96,8 +99,8 @@ static struct dentry_operations fuse_dentry_operations = {
.d_revalidate = fuse_dentry_revalidate, .d_revalidate = fuse_dentry_revalidate,
}; };
static int fuse_lookup_iget(struct inode *dir, struct dentry *entry, static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
struct inode **inodep) struct nameidata *nd)
{ {
int err; int err;
struct fuse_entry_out outarg; struct fuse_entry_out outarg;
...@@ -106,11 +109,11 @@ static int fuse_lookup_iget(struct inode *dir, struct dentry *entry, ...@@ -106,11 +109,11 @@ static int fuse_lookup_iget(struct inode *dir, struct dentry *entry,
struct fuse_req *req; struct fuse_req *req;
if (entry->d_name.len > FUSE_NAME_MAX) if (entry->d_name.len > FUSE_NAME_MAX)
return -ENAMETOOLONG; return ERR_PTR(-ENAMETOOLONG);
req = fuse_get_request(fc); req = fuse_get_request(fc);
if (!req) if (!req)
return -EINTR; return ERR_PTR(-EINTR);
fuse_lookup_init(req, dir, entry, &outarg); fuse_lookup_init(req, dir, entry, &outarg);
request_send(fc, req); request_send(fc, req);
...@@ -122,24 +125,22 @@ static int fuse_lookup_iget(struct inode *dir, struct dentry *entry, ...@@ -122,24 +125,22 @@ static int fuse_lookup_iget(struct inode *dir, struct dentry *entry,
&outarg.attr); &outarg.attr);
if (!inode) { if (!inode) {
fuse_send_forget(fc, req, outarg.nodeid, 1); fuse_send_forget(fc, req, outarg.nodeid, 1);
return -ENOMEM; return ERR_PTR(-ENOMEM);
} }
} }
fuse_put_request(fc, req); fuse_put_request(fc, req);
if (err && err != -ENOENT) if (err && err != -ENOENT)
return err; return ERR_PTR(err);
if (inode) { if (inode && dir_alias(inode)) {
struct fuse_inode *fi = get_fuse_inode(inode); iput(inode);
entry->d_time = time_to_jiffies(outarg.entry_valid, return ERR_PTR(-EIO);
outarg.entry_valid_nsec);
fi->i_time = time_to_jiffies(outarg.attr_valid,
outarg.attr_valid_nsec);
} }
d_add(entry, inode);
entry->d_op = &fuse_dentry_operations; entry->d_op = &fuse_dentry_operations;
*inodep = inode; if (inode)
return 0; fuse_change_timeout(entry, &outarg);
return NULL;
} }
void fuse_invalidate_attr(struct inode *inode) void fuse_invalidate_attr(struct inode *inode)
...@@ -163,7 +164,6 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, int mode, ...@@ -163,7 +164,6 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, int mode,
struct fuse_open_in inarg; struct fuse_open_in inarg;
struct fuse_open_out outopen; struct fuse_open_out outopen;
struct fuse_entry_out outentry; struct fuse_entry_out outentry;
struct fuse_inode *fi;
struct fuse_file *ff; struct fuse_file *ff;
struct file *file; struct file *file;
int flags = nd->intent.open.flags - 1; int flags = nd->intent.open.flags - 1;
...@@ -224,13 +224,8 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, int mode, ...@@ -224,13 +224,8 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, int mode,
goto out_put_request; goto out_put_request;
} }
fuse_put_request(fc, req); fuse_put_request(fc, req);
entry->d_time = time_to_jiffies(outentry.entry_valid,
outentry.entry_valid_nsec);
fi = get_fuse_inode(inode);
fi->i_time = time_to_jiffies(outentry.attr_valid,
outentry.attr_valid_nsec);
d_instantiate(entry, inode); d_instantiate(entry, inode);
fuse_change_timeout(entry, &outentry);
file = lookup_instantiate_filp(nd, entry, generic_file_open); file = lookup_instantiate_filp(nd, entry, generic_file_open);
if (IS_ERR(file)) { if (IS_ERR(file)) {
ff->fh = outopen.fh; ff->fh = outopen.fh;
...@@ -254,7 +249,6 @@ static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req, ...@@ -254,7 +249,6 @@ static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req,
{ {
struct fuse_entry_out outarg; struct fuse_entry_out outarg;
struct inode *inode; struct inode *inode;
struct fuse_inode *fi;
int err; int err;
req->in.h.nodeid = get_node_id(dir); req->in.h.nodeid = get_node_id(dir);
...@@ -286,14 +280,8 @@ static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req, ...@@ -286,14 +280,8 @@ static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req,
return -EIO; return -EIO;
} }
entry->d_time = time_to_jiffies(outarg.entry_valid,
outarg.entry_valid_nsec);
fi = get_fuse_inode(inode);
fi->i_time = time_to_jiffies(outarg.attr_valid,
outarg.attr_valid_nsec);
d_instantiate(entry, inode); d_instantiate(entry, inode);
fuse_change_timeout(entry, &outarg);
fuse_invalidate_attr(dir); fuse_invalidate_attr(dir);
return 0; return 0;
} }
...@@ -883,23 +871,6 @@ static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry, ...@@ -883,23 +871,6 @@ static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry,
return err; return err;
} }
static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
struct nameidata *nd)
{
struct inode *inode;
int err;
err = fuse_lookup_iget(dir, entry, &inode);
if (err)
return ERR_PTR(err);
if (inode && dir_alias(inode)) {
iput(inode);
return ERR_PTR(-EIO);
}
d_add(entry, inode);
return NULL;
}
static int fuse_setxattr(struct dentry *entry, const char *name, static int fuse_setxattr(struct dentry *entry, const char *name,
const void *value, size_t size, int flags) const void *value, size_t size, int flags)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment