On Sat, Jul 02, 2011 at 02:13:30PM -0700, Matthew Dempsky wrote:
> In physio(), the after_unlock code assumes that b_resid is valid, but
> that value is only assigned if we actually call (*strategy)(), which
> doesn't happen if uvm_vslock_device() fails.
> 
> None of that error handling code is actually needed if
> uvm_vslock_device() fails, so just break out of the loop instead of
> faking a buf failure.
> 
> ok?

My only concern would be not having B_ERROR/b_error set when brelvp() is
called on the buf. No idea if this would change the handling of the buf.

.... Ken

> 
> Diff also available on Rietveld at http://codereview.appspot.com/4639095/
> 
> Index: kern/kern_physio.c
> ===================================================================
> RCS file: /home/mdempsky/anoncvs/cvs/src/sys/kern/kern_physio.c,v
> retrieving revision 1.33
> diff -u -p -r1.33 kern_physio.c
> --- kern/kern_physio.c        8 May 2011 09:07:06 -0000       1.33
> +++ kern/kern_physio.c        27 Jun 2011 22:03:39 -0000
> @@ -141,11 +141,8 @@ physio(void (*strategy)(struct buf *), d
>                       error = uvm_vslock_device(p, iovp->iov_base, todo,
>                           (flags & B_READ) ?
>                           VM_PROT_READ | VM_PROT_WRITE : VM_PROT_READ, &map);
> -                     if (error) {
> -                             bp->b_flags |= B_ERROR;
> -                             bp->b_error = error;
> -                             goto after_unlock;
> -                     }
> +                     if (error)
> +                             goto done;
>                       if (map) {
>                               bp->b_data = map;
>                       } else {
> @@ -183,7 +180,6 @@ physio(void (*strategy)(struct buf *), d
>                       if (!map)
>                               vunmapbuf(bp, todo);
>                       uvm_vsunlock_device(p, iovp->iov_base, todo, map);
> -after_unlock:
>  
>                       /* remember error value (save a splbio/splx pair) */
>                       if (bp->b_flags & B_ERROR)

Reply via email to