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

Reply via email to