diff options
Diffstat (limited to 'drivers/scsi/st.c')
-rw-r--r-- | drivers/scsi/st.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 12d58a7ed6bc..3ea1a713ef25 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c | |||
@@ -27,6 +27,7 @@ static const char *verstr = "20081215"; | |||
27 | #include <linux/mm.h> | 27 | #include <linux/mm.h> |
28 | #include <linux/init.h> | 28 | #include <linux/init.h> |
29 | #include <linux/string.h> | 29 | #include <linux/string.h> |
30 | #include <linux/slab.h> | ||
30 | #include <linux/errno.h> | 31 | #include <linux/errno.h> |
31 | #include <linux/mtio.h> | 32 | #include <linux/mtio.h> |
32 | #include <linux/cdrom.h> | 33 | #include <linux/cdrom.h> |
@@ -552,13 +553,15 @@ st_do_scsi(struct st_request * SRpnt, struct scsi_tape * STp, unsigned char *cmd | |||
552 | SRpnt->waiting = waiting; | 553 | SRpnt->waiting = waiting; |
553 | 554 | ||
554 | if (STp->buffer->do_dio) { | 555 | if (STp->buffer->do_dio) { |
556 | mdata->page_order = 0; | ||
555 | mdata->nr_entries = STp->buffer->sg_segs; | 557 | mdata->nr_entries = STp->buffer->sg_segs; |
556 | mdata->pages = STp->buffer->mapped_pages; | 558 | mdata->pages = STp->buffer->mapped_pages; |
557 | } else { | 559 | } else { |
560 | mdata->page_order = STp->buffer->reserved_page_order; | ||
558 | mdata->nr_entries = | 561 | mdata->nr_entries = |
559 | DIV_ROUND_UP(bytes, PAGE_SIZE << mdata->page_order); | 562 | DIV_ROUND_UP(bytes, PAGE_SIZE << mdata->page_order); |
560 | STp->buffer->map_data.pages = STp->buffer->reserved_pages; | 563 | mdata->pages = STp->buffer->reserved_pages; |
561 | STp->buffer->map_data.offset = 0; | 564 | mdata->offset = 0; |
562 | } | 565 | } |
563 | 566 | ||
564 | memcpy(SRpnt->cmd, cmd, sizeof(SRpnt->cmd)); | 567 | memcpy(SRpnt->cmd, cmd, sizeof(SRpnt->cmd)); |
@@ -2280,7 +2283,8 @@ static int st_set_options(struct scsi_tape *STp, long options) | |||
2280 | } else if (code == MT_ST_SET_CLN) { | 2283 | } else if (code == MT_ST_SET_CLN) { |
2281 | value = (options & ~MT_ST_OPTIONS) & 0xff; | 2284 | value = (options & ~MT_ST_OPTIONS) & 0xff; |
2282 | if (value != 0 && | 2285 | if (value != 0 && |
2283 | value < EXTENDED_SENSE_START && value >= SCSI_SENSE_BUFFERSIZE) | 2286 | (value < EXTENDED_SENSE_START || |
2287 | value >= SCSI_SENSE_BUFFERSIZE)) | ||
2284 | return (-EINVAL); | 2288 | return (-EINVAL); |
2285 | STp->cln_mode = value; | 2289 | STp->cln_mode = value; |
2286 | STp->cln_sense_mask = (options >> 8) & 0xff; | 2290 | STp->cln_sense_mask = (options >> 8) & 0xff; |
@@ -3718,7 +3722,7 @@ static int enlarge_buffer(struct st_buffer * STbuffer, int new_size, int need_dm | |||
3718 | priority |= __GFP_ZERO; | 3722 | priority |= __GFP_ZERO; |
3719 | 3723 | ||
3720 | if (STbuffer->frp_segs) { | 3724 | if (STbuffer->frp_segs) { |
3721 | order = STbuffer->map_data.page_order; | 3725 | order = STbuffer->reserved_page_order; |
3722 | b_size = PAGE_SIZE << order; | 3726 | b_size = PAGE_SIZE << order; |
3723 | } else { | 3727 | } else { |
3724 | for (b_size = PAGE_SIZE, order = 0; | 3728 | for (b_size = PAGE_SIZE, order = 0; |
@@ -3751,7 +3755,7 @@ static int enlarge_buffer(struct st_buffer * STbuffer, int new_size, int need_dm | |||
3751 | segs++; | 3755 | segs++; |
3752 | } | 3756 | } |
3753 | STbuffer->b_data = page_address(STbuffer->reserved_pages[0]); | 3757 | STbuffer->b_data = page_address(STbuffer->reserved_pages[0]); |
3754 | STbuffer->map_data.page_order = order; | 3758 | STbuffer->reserved_page_order = order; |
3755 | 3759 | ||
3756 | return 1; | 3760 | return 1; |
3757 | } | 3761 | } |
@@ -3764,7 +3768,7 @@ static void clear_buffer(struct st_buffer * st_bp) | |||
3764 | 3768 | ||
3765 | for (i=0; i < st_bp->frp_segs; i++) | 3769 | for (i=0; i < st_bp->frp_segs; i++) |
3766 | memset(page_address(st_bp->reserved_pages[i]), 0, | 3770 | memset(page_address(st_bp->reserved_pages[i]), 0, |
3767 | PAGE_SIZE << st_bp->map_data.page_order); | 3771 | PAGE_SIZE << st_bp->reserved_page_order); |
3768 | st_bp->cleared = 1; | 3772 | st_bp->cleared = 1; |
3769 | } | 3773 | } |
3770 | 3774 | ||
@@ -3772,7 +3776,7 @@ static void clear_buffer(struct st_buffer * st_bp) | |||
3772 | /* Release the extra buffer */ | 3776 | /* Release the extra buffer */ |
3773 | static void normalize_buffer(struct st_buffer * STbuffer) | 3777 | static void normalize_buffer(struct st_buffer * STbuffer) |
3774 | { | 3778 | { |
3775 | int i, order = STbuffer->map_data.page_order; | 3779 | int i, order = STbuffer->reserved_page_order; |
3776 | 3780 | ||
3777 | for (i = 0; i < STbuffer->frp_segs; i++) { | 3781 | for (i = 0; i < STbuffer->frp_segs; i++) { |
3778 | __free_pages(STbuffer->reserved_pages[i], order); | 3782 | __free_pages(STbuffer->reserved_pages[i], order); |
@@ -3780,7 +3784,7 @@ static void normalize_buffer(struct st_buffer * STbuffer) | |||
3780 | } | 3784 | } |
3781 | STbuffer->frp_segs = 0; | 3785 | STbuffer->frp_segs = 0; |
3782 | STbuffer->sg_segs = 0; | 3786 | STbuffer->sg_segs = 0; |
3783 | STbuffer->map_data.page_order = 0; | 3787 | STbuffer->reserved_page_order = 0; |
3784 | STbuffer->map_data.offset = 0; | 3788 | STbuffer->map_data.offset = 0; |
3785 | } | 3789 | } |
3786 | 3790 | ||
@@ -3790,7 +3794,7 @@ static void normalize_buffer(struct st_buffer * STbuffer) | |||
3790 | static int append_to_buffer(const char __user *ubp, struct st_buffer * st_bp, int do_count) | 3794 | static int append_to_buffer(const char __user *ubp, struct st_buffer * st_bp, int do_count) |
3791 | { | 3795 | { |
3792 | int i, cnt, res, offset; | 3796 | int i, cnt, res, offset; |
3793 | int length = PAGE_SIZE << st_bp->map_data.page_order; | 3797 | int length = PAGE_SIZE << st_bp->reserved_page_order; |
3794 | 3798 | ||
3795 | for (i = 0, offset = st_bp->buffer_bytes; | 3799 | for (i = 0, offset = st_bp->buffer_bytes; |
3796 | i < st_bp->frp_segs && offset >= length; i++) | 3800 | i < st_bp->frp_segs && offset >= length; i++) |
@@ -3822,7 +3826,7 @@ static int append_to_buffer(const char __user *ubp, struct st_buffer * st_bp, in | |||
3822 | static int from_buffer(struct st_buffer * st_bp, char __user *ubp, int do_count) | 3826 | static int from_buffer(struct st_buffer * st_bp, char __user *ubp, int do_count) |
3823 | { | 3827 | { |
3824 | int i, cnt, res, offset; | 3828 | int i, cnt, res, offset; |
3825 | int length = PAGE_SIZE << st_bp->map_data.page_order; | 3829 | int length = PAGE_SIZE << st_bp->reserved_page_order; |
3826 | 3830 | ||
3827 | for (i = 0, offset = st_bp->read_pointer; | 3831 | for (i = 0, offset = st_bp->read_pointer; |
3828 | i < st_bp->frp_segs && offset >= length; i++) | 3832 | i < st_bp->frp_segs && offset >= length; i++) |
@@ -3855,7 +3859,7 @@ static void move_buffer_data(struct st_buffer * st_bp, int offset) | |||
3855 | { | 3859 | { |
3856 | int src_seg, dst_seg, src_offset = 0, dst_offset; | 3860 | int src_seg, dst_seg, src_offset = 0, dst_offset; |
3857 | int count, total; | 3861 | int count, total; |
3858 | int length = PAGE_SIZE << st_bp->map_data.page_order; | 3862 | int length = PAGE_SIZE << st_bp->reserved_page_order; |
3859 | 3863 | ||
3860 | if (offset == 0) | 3864 | if (offset == 0) |
3861 | return; | 3865 | return; |
@@ -3980,8 +3984,7 @@ static int st_probe(struct device *dev) | |||
3980 | return -ENODEV; | 3984 | return -ENODEV; |
3981 | } | 3985 | } |
3982 | 3986 | ||
3983 | i = min(queue_max_hw_segments(SDp->request_queue), | 3987 | i = queue_max_segments(SDp->request_queue); |
3984 | queue_max_phys_segments(SDp->request_queue)); | ||
3985 | if (st_max_sg_segs < i) | 3988 | if (st_max_sg_segs < i) |
3986 | i = st_max_sg_segs; | 3989 | i = st_max_sg_segs; |
3987 | buffer = new_tape_buffer((SDp->host)->unchecked_isa_dma, i); | 3990 | buffer = new_tape_buffer((SDp->host)->unchecked_isa_dma, i); |
@@ -4577,7 +4580,6 @@ static int sgl_map_user_pages(struct st_buffer *STbp, | |||
4577 | } | 4580 | } |
4578 | 4581 | ||
4579 | mdata->offset = uaddr & ~PAGE_MASK; | 4582 | mdata->offset = uaddr & ~PAGE_MASK; |
4580 | mdata->page_order = 0; | ||
4581 | STbp->mapped_pages = pages; | 4583 | STbp->mapped_pages = pages; |
4582 | 4584 | ||
4583 | return nr_pages; | 4585 | return nr_pages; |