View | Details | Raw Unified | Return to bug 249395 | Differences between
and this patch

Collapse All | Expand All

(-)b/sys/cam/scsi/scsi_sg.c (-3 / +5 lines)
Lines 553-558 sgioctl(struct cdev *dev, u_long cmd, caddr_t arg, int flag, struct thread *td) Link Here
553
		}
553
		}
554
554
555
		if (req->dxfer_len > MAXPHYS) {
555
		if (req->dxfer_len > MAXPHYS) {
556
			printf("%s: dxfer_len (%u) > MAXPHYS (%u)\n",
557
			    __func__, req->dxfer_len, MAXPHYS);
556
			error = EINVAL;
558
			error = EINVAL;
557
			break;
559
			break;
558
		}
560
		}
Lines 578-584 sgioctl(struct cdev *dev, u_long cmd, caddr_t arg, int flag, struct thread *td) Link Here
578
			dir = CAM_DIR_IN;
580
			dir = CAM_DIR_IN;
579
			break;
581
			break;
580
		case SG_DXFER_TO_FROM_DEV:
582
		case SG_DXFER_TO_FROM_DEV:
581
			dir = CAM_DIR_BOTH;
583
			dir = CAM_DIR_IN | CAM_DIR_OUT;
582
			break;
584
			break;
583
		case SG_DXFER_NONE:
585
		case SG_DXFER_NONE:
584
		default:
586
		default:
Lines 586-592 sgioctl(struct cdev *dev, u_long cmd, caddr_t arg, int flag, struct thread *td) Link Here
586
			break;
588
			break;
587
		}
589
		}
588
590
589
		if (dir == CAM_DIR_IN || dir == CAM_DIR_BOTH) {
591
		if (dir & CAM_DIR_IN) {
590
			error = copyin(req->dxferp, data_ptr, req->dxfer_len);
592
			error = copyin(req->dxferp, data_ptr, req->dxfer_len);
591
			if (error) {
593
			if (error) {
592
				free(data_ptr, M_DEVBUF);
594
				free(data_ptr, M_DEVBUF);
Lines 629-635 sgioctl(struct cdev *dev, u_long cmd, caddr_t arg, int flag, struct thread *td) Link Here
629
					req->sb_len_wr);
631
					req->sb_len_wr);
630
		}
632
		}
631
633
632
		if ((dir == CAM_DIR_OUT || dir == CAM_DIR_BOTH) && error == 0)
634
		if ((dir & CAM_DIR_OUT) && error == 0)
633
			error = copyout(data_ptr, req->dxferp, req->dxfer_len);
635
			error = copyout(data_ptr, req->dxferp, req->dxfer_len);
634
636
635
		free(data_ptr, M_DEVBUF);
637
		free(data_ptr, M_DEVBUF);

Return to bug 249395