|
@@ -542,7 +542,7 @@ static int osst_verify_frame(struct osst_tape * STp, int frame_seq_number, int q
|
|
|
if (STp->raw) {
|
|
|
if (STp->buffer->syscall_result) {
|
|
|
for (i=0; i < STp->buffer->sg_segs; i++)
|
|
|
- memset(page_address(STp->buffer->sg[i].page),
|
|
|
+ memset(page_address(sg_page(&STp->buffer->sg[i])),
|
|
|
0, STp->buffer->sg[i].length);
|
|
|
strcpy(STp->buffer->b_data, "READ ERROR ON FRAME");
|
|
|
} else
|
|
@@ -4437,7 +4437,7 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp)
|
|
|
for (i = 0, b_size = 0;
|
|
|
(i < STp->buffer->sg_segs) && ((b_size + STp->buffer->sg[i].length) <= OS_DATA_SIZE);
|
|
|
b_size += STp->buffer->sg[i++].length);
|
|
|
- STp->buffer->aux = (os_aux_t *) (page_address(STp->buffer->sg[i].page) + OS_DATA_SIZE - b_size);
|
|
|
+ STp->buffer->aux = (os_aux_t *) (page_address(sg_page(&STp->buffer->sg[i])) + OS_DATA_SIZE - b_size);
|
|
|
#if DEBUG
|
|
|
printk(OSST_DEB_MSG "%s:D: b_data points to %p in segment 0 at %p\n", name,
|
|
|
STp->buffer->b_data, page_address(STp->buffer->sg[0].page));
|
|
@@ -5252,25 +5252,26 @@ static int enlarge_buffer(struct osst_buffer *STbuffer, int need_dma)
|
|
|
/* Try to allocate the first segment up to OS_DATA_SIZE and the others
|
|
|
big enough to reach the goal (code assumes no segments in place) */
|
|
|
for (b_size = OS_DATA_SIZE, order = OSST_FIRST_ORDER; b_size >= PAGE_SIZE; order--, b_size /= 2) {
|
|
|
- STbuffer->sg[0].page = alloc_pages(priority, order);
|
|
|
+ struct page *page = alloc_pages(priority, order);
|
|
|
+
|
|
|
STbuffer->sg[0].offset = 0;
|
|
|
- if (STbuffer->sg[0].page != NULL) {
|
|
|
+ if (page != NULL) {
|
|
|
+ sg_set_page(&STbuffer->sg[0], page);
|
|
|
STbuffer->sg[0].length = b_size;
|
|
|
- STbuffer->b_data = page_address(STbuffer->sg[0].page);
|
|
|
+ STbuffer->b_data = page_address(page);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
- if (STbuffer->sg[0].page == NULL) {
|
|
|
+ if (sg_page(&STbuffer->sg[0]) == NULL) {
|
|
|
printk(KERN_NOTICE "osst :I: Can't allocate tape buffer main segment.\n");
|
|
|
return 0;
|
|
|
}
|
|
|
/* Got initial segment of 'bsize,order', continue with same size if possible, except for AUX */
|
|
|
for (segs=STbuffer->sg_segs=1, got=b_size;
|
|
|
segs < max_segs && got < OS_FRAME_SIZE; ) {
|
|
|
- STbuffer->sg[segs].page =
|
|
|
- alloc_pages(priority, (OS_FRAME_SIZE - got <= PAGE_SIZE) ? 0 : order);
|
|
|
+ struct page *page = alloc_pages(priority, (OS_FRAME_SIZE - got <= PAGE_SIZE) ? 0 : order);
|
|
|
STbuffer->sg[segs].offset = 0;
|
|
|
- if (STbuffer->sg[segs].page == NULL) {
|
|
|
+ if (page == NULL) {
|
|
|
if (OS_FRAME_SIZE - got <= (max_segs - segs) * b_size / 2 && order) {
|
|
|
b_size /= 2; /* Large enough for the rest of the buffers */
|
|
|
order--;
|
|
@@ -5284,6 +5285,7 @@ static int enlarge_buffer(struct osst_buffer *STbuffer, int need_dma)
|
|
|
normalize_buffer(STbuffer);
|
|
|
return 0;
|
|
|
}
|
|
|
+ sg_set_page(&STbuffer->sg[segs], page);
|
|
|
STbuffer->sg[segs].length = (OS_FRAME_SIZE - got <= PAGE_SIZE / 2) ? (OS_FRAME_SIZE - got) : b_size;
|
|
|
got += STbuffer->sg[segs].length;
|
|
|
STbuffer->buffer_size = got;
|
|
@@ -5316,7 +5318,7 @@ static void normalize_buffer(struct osst_buffer *STbuffer)
|
|
|
b_size < STbuffer->sg[i].length;
|
|
|
b_size *= 2, order++);
|
|
|
|
|
|
- __free_pages(STbuffer->sg[i].page, order);
|
|
|
+ __free_pages(sg_page(&STbuffer->sg[i]), order);
|
|
|
STbuffer->buffer_size -= STbuffer->sg[i].length;
|
|
|
}
|
|
|
#if DEBUG
|
|
@@ -5344,7 +5346,7 @@ static int append_to_buffer(const char __user *ubp, struct osst_buffer *st_bp, i
|
|
|
for ( ; i < st_bp->sg_segs && do_count > 0; i++) {
|
|
|
cnt = st_bp->sg[i].length - offset < do_count ?
|
|
|
st_bp->sg[i].length - offset : do_count;
|
|
|
- res = copy_from_user(page_address(st_bp->sg[i].page) + offset, ubp, cnt);
|
|
|
+ res = copy_from_user(page_address(sg_page(&st_bp->sg[i])) + offset, ubp, cnt);
|
|
|
if (res)
|
|
|
return (-EFAULT);
|
|
|
do_count -= cnt;
|
|
@@ -5377,7 +5379,7 @@ static int from_buffer(struct osst_buffer *st_bp, char __user *ubp, int do_count
|
|
|
for ( ; i < st_bp->sg_segs && do_count > 0; i++) {
|
|
|
cnt = st_bp->sg[i].length - offset < do_count ?
|
|
|
st_bp->sg[i].length - offset : do_count;
|
|
|
- res = copy_to_user(ubp, page_address(st_bp->sg[i].page) + offset, cnt);
|
|
|
+ res = copy_to_user(ubp, page_address(sg_page(&st_bp->sg[i])) + offset, cnt);
|
|
|
if (res)
|
|
|
return (-EFAULT);
|
|
|
do_count -= cnt;
|
|
@@ -5410,7 +5412,7 @@ static int osst_zero_buffer_tail(struct osst_buffer *st_bp)
|
|
|
i < st_bp->sg_segs && do_count > 0; i++) {
|
|
|
cnt = st_bp->sg[i].length - offset < do_count ?
|
|
|
st_bp->sg[i].length - offset : do_count ;
|
|
|
- memset(page_address(st_bp->sg[i].page) + offset, 0, cnt);
|
|
|
+ memset(page_address(sg_page(&st_bp->sg[i])) + offset, 0, cnt);
|
|
|
do_count -= cnt;
|
|
|
offset = 0;
|
|
|
}
|
|
@@ -5430,7 +5432,7 @@ static int osst_copy_to_buffer(struct osst_buffer *st_bp, unsigned char *ptr)
|
|
|
for (i = 0; i < st_bp->sg_segs && do_count > 0; i++) {
|
|
|
cnt = st_bp->sg[i].length < do_count ?
|
|
|
st_bp->sg[i].length : do_count ;
|
|
|
- memcpy(page_address(st_bp->sg[i].page), ptr, cnt);
|
|
|
+ memcpy(page_address(sg_page(&st_bp->sg[i])), ptr, cnt);
|
|
|
do_count -= cnt;
|
|
|
ptr += cnt;
|
|
|
}
|
|
@@ -5451,7 +5453,7 @@ static int osst_copy_from_buffer(struct osst_buffer *st_bp, unsigned char *ptr)
|
|
|
for (i = 0; i < st_bp->sg_segs && do_count > 0; i++) {
|
|
|
cnt = st_bp->sg[i].length < do_count ?
|
|
|
st_bp->sg[i].length : do_count ;
|
|
|
- memcpy(ptr, page_address(st_bp->sg[i].page), cnt);
|
|
|
+ memcpy(ptr, page_address(sg_page(&st_bp->sg[i])), cnt);
|
|
|
do_count -= cnt;
|
|
|
ptr += cnt;
|
|
|
}
|