On 10/8/19 9:50 AM, Douglas Gilbert wrote:
> Simple rework of the sg_mmap() function.
> 
> Signed-off-by: Douglas Gilbert <dgilb...@interlog.com>
> ---
>  drivers/scsi/sg.c | 25 +++++++++++++++----------
>  1 file changed, 15 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
> index befcbfbcece1..2ad86aaaf74d 100644
> --- a/drivers/scsi/sg.c
> +++ b/drivers/scsi/sg.c
> @@ -1449,14 +1449,15 @@ static const struct vm_operations_struct 
> sg_mmap_vm_ops = {
>       .fault = sg_vma_fault,
>  };
>  
> +/* Entry point for mmap(2) system call */
>  static int
>  sg_mmap(struct file *filp, struct vm_area_struct *vma)
>  {
> -     struct sg_fd *sfp;
> -     unsigned long req_sz, len, sa;
> -     struct sg_scatter_hold *rsv_schp;
>       int k, length;
>       int ret = 0;
> +     unsigned long req_sz, len, sa;
> +     struct sg_scatter_hold *rsv_schp;
> +     struct sg_fd *sfp;
>  
>       if (!filp || !vma)
>               return -ENXIO;
> @@ -1469,19 +1470,23 @@ sg_mmap(struct file *filp, struct vm_area_struct *vma)
>       SG_LOG(3, sfp, "%s: vm_start=%p, len=%d\n", __func__,
>              (void *)vma->vm_start, (int)req_sz);
>       if (vma->vm_pgoff)
> -             return -EINVAL; /* want no offset */
> -     rsv_schp = &sfp->reserve;
> +             return -EINVAL; /* only an offset of 0 accepted */
> +     /* Check reserve request is inactive and has large enough buffer */
>       mutex_lock(&sfp->f_mutex);
> -     if (req_sz > rsv_schp->buflen) {
> -             ret = -ENOMEM;  /* cannot map more than reserved buffer */
> +     if (sfp->res_in_use) {
> +             ret = -EBUSY;
> +             goto out;
> +     }
> +     rsv_schp = &sfp->reserve;
> +     if (req_sz > (unsigned long)rsv_schp->buflen) {
> +             ret = -ENOMEM;
>               goto out;
>       }
> -
>       sa = vma->vm_start;
>       length = 1 << (PAGE_SHIFT + rsv_schp->page_order);
> -     for (k = 0; k < rsv_schp->num_sgat && sa < vma->vm_end; k++) {
> +     for (k = 0; k < rsv_schp->num_sgat && sa < vma->vm_end; ++k) {
>               len = vma->vm_end - sa;
> -             len = (len < length) ? len : length;
> +             len = min_t(unsigned long, len, (unsigned long)length);
>               sa += len;
>       }
>  
> 
Some comment regarding kernel-doc applies here, too.
Anc the change in the 'for' condition above appears to be rather cosmetic...

Otherwise:
Reviewed-by: Hannes Reinecke <h...@suse.com>

Cheers,

Hannes
-- 
Dr. Hannes Reinecke                   Teamlead Storage & Networking
h...@suse.de                                      +49 911 74053 688
SUSE Software Solutions Germany GmbH, Maxfeldstr. 5, 90409 Nürnberg
HRB 247165 (AG München), GF: Felix Imendörffer

Reply via email to