This happens if you have:

        replacing
           foo
           bar

And you try to replace 'foo' with 'bar.  Sure enough, the old code used
to do:

        if (parent is replacing)
                return ENOTSUP
        if (initialize new vdev failed)
                return failure (EBUSY)

Now it switched the order:

        if (initialize new vdev failed)
                return failure (EBUSY)
        if (parent is replacing)
                return ENOTSUP

Both cases are correct, its just a matter of which error condition gets
triggered first.  You cannot trigger this through the CLI (since it
refuses to issue the ioctl because said disk is actively in use).  I'll
think some more about it, but most likely the correct fix is the one
below.

- Eric

On Fri, Jun 09, 2006 at 10:12:51AM -0700, Eric Schrock wrote:
> Yes, I'm seeing this unexpectedly fail with EBUSY  (errno 16) instead of
> ENOTSUP.  This was definitely caused by the hot spare work, and it's my
> fault for not running ztest more rigorously.  I'll file a bug and take a
> look.  For now, you can change (in ztest.c):
> 
>         if (error == EOVERFLOW)
>                 expected_error = error;
> 
> To:
> 
>         if (error == EOVERFLOW || error == EBUSY)
>                 expected_error = error;
> 
> I've been able to run this way for 10 minutes, with the 'rarely ->
> always' change.
> 
> Sorry about that,
> 
> - Eric

--
Eric Schrock, Solaris Kernel Development       http://blogs.sun.com/eschrock

Reply via email to