Remove gotos with direct returns and flatten nested if/else structure. No functional changes. Suggested-by: Amir Goldstein Reviewed-by: Amir Goldstein Signed-off-by: Joanne Koong --- fs/fuse/dir.c | 112 +++++++++++++++++++++++--------------------------- 1 file changed, 52 insertions(+), 60 deletions(-) diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 7d3c9878b833..a338f2a06b50 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -386,72 +386,31 @@ static int fuse_dentry_revalidate(struct inode *dir, const struct qstr *name, struct dentry *entry, unsigned int flags) { struct inode *inode; - struct fuse_mount *fm; struct fuse_conn *fc; struct fuse_inode *fi; + struct fuse_entry_out outarg; + struct fuse_forget_link *forget; + FUSE_ARGS(args); + u64 attr_version; + bool need_reval; int ret; fc = get_fuse_conn_super(dir->i_sb); if (entry->d_time < atomic_read(&fc->epoch)) - goto invalid; + return 0; inode = d_inode_rcu(entry); if (inode && fuse_is_bad(inode)) - goto invalid; - else if (time_before64(fuse_dentry_time(entry), get_jiffies_64()) || - (flags & (LOOKUP_EXCL | LOOKUP_REVAL | LOOKUP_RENAME_TARGET))) { - struct fuse_entry_out outarg; - FUSE_ARGS(args); - struct fuse_forget_link *forget; - u64 attr_version; - - /* For negative dentries, always do a fresh lookup */ - if (!inode) - goto invalid; - - ret = -ECHILD; - if (flags & LOOKUP_RCU) - goto out; - - fm = get_fuse_mount(inode); + return 0; - forget = fuse_alloc_forget(); - ret = -ENOMEM; - if (!forget) - goto out; + need_reval = time_before64(fuse_dentry_time(entry), get_jiffies_64()) || + (flags & (LOOKUP_EXCL | LOOKUP_REVAL | LOOKUP_RENAME_TARGET)); - attr_version = fuse_get_attr_version(fm->fc); - - fuse_lookup_init(&args, get_node_id(dir), name, &outarg); - ret = fuse_simple_request(fm, &args); - /* Zero nodeid is same as -ENOENT */ - if (!ret && !outarg.nodeid) - ret = -ENOENT; - if (!ret) { - fi = get_fuse_inode(inode); - if (outarg.nodeid != get_node_id(inode) || - (bool) IS_AUTOMOUNT(inode) != (bool) (outarg.attr.flags & FUSE_ATTR_SUBMOUNT)) { - fuse_chan_queue_forget(fm->fc->chan, forget, - outarg.nodeid, 1); - goto invalid; - } - spin_lock(&fi->lock); - fi->nlookup++; - spin_unlock(&fi->lock); - } - kfree(forget); - if (ret == -ENOMEM || ret == -EINTR) - goto out; - if (ret || fuse_invalid_attr(&outarg.attr) || - fuse_stale_inode(inode, outarg.generation, &outarg.attr)) - goto invalid; + /* For negative dentries that need revalidation, always do a fresh lookup */ + if (!inode) + return need_reval ? 0 : 1; - forget_all_cached_acls(inode); - fuse_change_attributes(inode, &outarg.attr, NULL, - ATTR_TIMEOUT(&outarg), - attr_version); - fuse_change_entry_timeout(entry, &outarg); - } else if (inode) { + if (!need_reval) { fi = get_fuse_inode(inode); if (flags & LOOKUP_RCU) { if (test_bit(FUSE_I_INIT_RDPLUS, &fi->state)) @@ -459,14 +418,47 @@ static int fuse_dentry_revalidate(struct inode *dir, const struct qstr *name, } else if (test_and_clear_bit(FUSE_I_INIT_RDPLUS, &fi->state)) { fuse_advise_use_readdirplus(dir); } + + return 1; } - ret = 1; -out: - return ret; -invalid: - ret = 0; - goto out; + if (flags & LOOKUP_RCU) + return -ECHILD; + + forget = fuse_alloc_forget(); + if (!forget) + return -ENOMEM; + + attr_version = fuse_get_attr_version(fc); + + fuse_lookup_init(&args, get_node_id(dir), name, &outarg); + ret = fuse_simple_request(get_fuse_mount(inode), &args); + if (ret || !outarg.nodeid) { + kfree(forget); + return (ret == -ENOMEM || ret == -EINTR) ? ret : 0; + } + + if (outarg.nodeid != get_node_id(inode) || + !!IS_AUTOMOUNT(inode) != !!(outarg.attr.flags & FUSE_ATTR_SUBMOUNT)) { + fuse_chan_queue_forget(fc->chan, forget, outarg.nodeid, 1); + return 0; + } + + kfree(forget); + fi = get_fuse_inode(inode); + spin_lock(&fi->lock); + fi->nlookup++; + spin_unlock(&fi->lock); + + if (fuse_invalid_attr(&outarg.attr) || + fuse_stale_inode(inode, outarg.generation, &outarg.attr)) + return 0; + + forget_all_cached_acls(inode); + fuse_change_attributes(inode, &outarg.attr, NULL, ATTR_TIMEOUT(&outarg), + attr_version); + fuse_change_entry_timeout(entry, &outarg); + return 1; } static int fuse_dentry_init(struct dentry *dentry) -- 2.52.0