diff options
author | Miklos Szeredi <mszeredi@suse.cz> | 2013-09-05 11:44:43 +0200 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-09-05 16:23:54 -0400 |
commit | e2a6b95236eba5341253a2e4a50946355f887303 (patch) | |
tree | c85bd19135c6a9242e81c30eb0c81091c84d9c03 /fs/fuse/dir.c | |
parent | 5835f3390e35ae3da9add646a2ca2cc30b47370e (diff) | |
download | op-kernel-dev-e2a6b95236eba5341253a2e4a50946355f887303.zip op-kernel-dev-e2a6b95236eba5341253a2e4a50946355f887303.tar.gz |
fuse: clean up return in fuse_dentry_revalidate()
On errors unrelated to the filesystem's state (ENOMEM, ENOTCONN) return the
error itself from ->d_revalidate() insted of returning zero (invalid).
Also make a common label for invalidating the dentry. This will be used by
the next patch.
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/fuse/dir.c')
-rw-r--r-- | fs/fuse/dir.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 131d14b..25c6cfe 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -182,10 +182,11 @@ static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags) struct inode *inode; struct dentry *parent; struct fuse_conn *fc; + int ret; inode = ACCESS_ONCE(entry->d_inode); if (inode && is_bad_inode(inode)) - return 0; + goto invalid; else if (fuse_dentry_time(entry) < get_jiffies_64()) { int err; struct fuse_entry_out outarg; @@ -195,20 +196,23 @@ static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags) /* For negative dentries, always do a fresh lookup */ if (!inode) - return 0; + goto invalid; + ret = -ECHILD; if (flags & LOOKUP_RCU) - return -ECHILD; + goto out; fc = get_fuse_conn(inode); req = fuse_get_req_nopages(fc); + ret = PTR_ERR(req); if (IS_ERR(req)) - return 0; + goto out; forget = fuse_alloc_forget(); if (!forget) { fuse_put_request(fc, req); - return 0; + ret = -ENOMEM; + goto out; } attr_version = fuse_get_attr_version(fc); @@ -227,7 +231,7 @@ static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags) struct fuse_inode *fi = get_fuse_inode(inode); if (outarg.nodeid != get_node_id(inode)) { fuse_queue_forget(fc, forget, outarg.nodeid, 1); - return 0; + goto invalid; } spin_lock(&fc->lock); fi->nlookup++; @@ -235,7 +239,7 @@ static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags) } kfree(forget); if (err || (outarg.attr.mode ^ inode->i_mode) & S_IFMT) - return 0; + goto invalid; fuse_change_attributes(inode, &outarg.attr, entry_attr_timeout(&outarg), @@ -249,7 +253,13 @@ static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags) dput(parent); } } - return 1; + ret = 1; +out: + return ret; + +invalid: + ret = 0; + goto out; } static int invalid_nodeid(u64 nodeid) |