aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/st.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/st.c')
-rw-r--r--drivers/scsi/st.c30
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 */
3773static void normalize_buffer(struct st_buffer * STbuffer) 3777static 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)
3790static int append_to_buffer(const char __user *ubp, struct st_buffer * st_bp, int do_count) 3794static 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
3822static int from_buffer(struct st_buffer * st_bp, char __user *ubp, int do_count) 3826static 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;