Hi Jon,

I think this is a great cleanup!

A few nitpicky comments below:

> -typedef int (*opal_step)(struct opal_dev *dev);
> +typedef struct opal_step {
> +     int (*fn)(struct opal_dev *dev, void *data);
> +     void *data;
> +} opal_step;

no typedefs for structure types, please.

> +     opal_step *funcs;

maybe calls this member steps?

> +static int set_mbr_done(struct opal_dev *dev, void *data)
>  {
> -     u8 mbr_done_tf = *(u8 *)dev->func_data[dev->state];
> +     u8 mbr_done_tf = *(u8 *)data;

No need for casts when going from void * to any pointer type.  There are
a couple more instance below where the cast should be removed as well.

> +static int __opal_lock_unlock(struct opal_dev *dev,
> +                           struct opal_lock_unlock *lk_unlk)
>  {
> +     opal_step _unlock_funcs[] = {
> +             { opal_discovery0, },
> +             { start_auth_opal_session, &lk_unlk->session },
> +             { NULL, lk_unlk },
> +             { end_opal_session, },
> +             { NULL, }
>       };
>  
> +     if (lk_unlk->session.sum)
> +             _unlock_funcs[2].fn = lock_unlock_locking_range_sum;
> +     else
> +             _unlock_funcs[2].fn = lock_unlock_locking_range;
>  
>       dev->funcs = _unlock_funcs;

I would suggest to just have two different arrays, and merge
__opal_lock_unlock into opal_lock_unlock.  E.g. something like:

static int opal_lock_unlock(struct opal_dev *dev,
                struct opal_lock_unlock *lk_unlk)
{
        const struct opal_step unlock_funcs[] = {
                { opal_discovery0, },
                { start_auth_opal_session, &lk_unlk->session },
                { lock_unlock_locking_range, lk_unlk },
                { end_opal_session, },
                { NULL, }
        };
        const struct opal_step unlock_sun_funcs[] = {
                { opal_discovery0, },
                { start_auth_opal_session, &lk_unlk->session },
                { lock_unlock_locking_range_sum, lk_unlk },
                { end_opal_session, },
                { NULL, }
        };
        int ret;

        if (lk_unlk->session.who < OPAL_ADMIN1 ||
            lk_unlk->session.who > OPAL_USER9)
                return -EINVAL;

        mutex_lock(&dev->dev_lock);
        setup_opal_dev(dev, lk_unlk->session.sum ?
                        unlock_sum_funcs : unlock_funcs);
        ret = next(dev);
        mutex_unlock(&dev->dev_lock);
        return ret;
}

and yes, I noticed that all the opal_step structures really should
be marked const, especially given that they contain function pointers
and are potential exploit targets.  Please apply that everywhere.

Reply via email to