On Tue, 6 Aug 2019 at 20:01, Bob Peterson <[email protected]> wrote: > > Hi, > > Before this patch, function gfs2_drevalidate was a horrific tangle of > unreadable labels, cases and goto statements. This patch tries to > simplify the logic and make it more readable. > > Signed-off-by: Bob Peterson <[email protected]> > --- > fs/gfs2/dentry.c | 45 +++++++++++---------------------------------- > 1 file changed, 11 insertions(+), 34 deletions(-) > > diff --git a/fs/gfs2/dentry.c b/fs/gfs2/dentry.c > index a7bb76e9a82b..26d73f94ae45 100644 > --- a/fs/gfs2/dentry.c > +++ b/fs/gfs2/dentry.c > @@ -38,7 +38,7 @@ static int gfs2_drevalidate(struct dentry *dentry, unsigned > int flags) > struct inode *inode; > struct gfs2_holder d_gh; > struct gfs2_inode *ip = NULL; > - int error; > + int error, valid = 0; > int had_lock = 0; > > if (flags & LOOKUP_RCU) > @@ -51,53 +51,30 @@ static int gfs2_drevalidate(struct dentry *dentry, > unsigned int flags) > > if (inode) { > if (is_bad_inode(inode)) > - goto invalid; > + goto out; > ip = GFS2_I(inode); > } > > - if (sdp->sd_lockstruct.ls_ops->lm_mount == NULL) > - goto valid; > + if (sdp->sd_lockstruct.ls_ops->lm_mount == NULL) { > + valid = 1; > + goto out; > + } > > had_lock = (gfs2_glock_is_locked_by_me(dip->i_gl) != NULL); > if (!had_lock) { > error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, &d_gh); > if (error) > - goto fail; > - } > - > - error = gfs2_dir_check(d_inode(parent), &dentry->d_name, ip); > - switch (error) { > - case 0: > - if (!inode) > - goto invalid_gunlock; > - break; > - case -ENOENT: > - if (!inode) > - goto valid_gunlock; > - goto invalid_gunlock; > - default: > - goto fail_gunlock; > + goto out; > } > > -valid_gunlock: > - if (!had_lock) > - gfs2_glock_dq_uninit(&d_gh); > -valid: > - dput(parent); > - return 1; > + error = gfs2_dir_check(d_inode(parent), &dentry->d_name, ip); > + valid = (!error && inode) || ((error == -ENOENT) && !inode);
valid = inode ? !error : (error == -ENOENT); > -invalid_gunlock: > if (!had_lock) > gfs2_glock_dq_uninit(&d_gh); > -invalid: > +out: > dput(parent); > - return 0; > - > -fail_gunlock: > - gfs2_glock_dq_uninit(&d_gh); > -fail: > - dput(parent); > - return 0; > + return valid; > } > > static int gfs2_dhash(const struct dentry *dentry, struct qstr *str) Andreas
