20 static const char *verstr =
"20101219";
22 #include <linux/module.h>
25 #include <linux/kernel.h>
26 #include <linux/sched.h>
29 #include <linux/string.h>
30 #include <linux/slab.h>
31 #include <linux/errno.h>
33 #include <linux/cdrom.h>
35 #include <linux/fcntl.h>
44 #include <asm/uaccess.h>
47 #include <scsi/scsi.h>
65 #define ST_DEB_MSG KERN_NOTICE
67 #define DEBC(a) if (debugging) { a ; }
73 #define ST_KILOBYTE 1024
78 static int buffer_kbs;
79 static int max_sg_segs;
81 static int try_rdio = 1;
82 static int try_wdio = 1;
84 static struct class st_sysfs_class;
98 MODULE_PARM_DESC(buffer_kbs,
"Default driver buffer size for fixed block mode (KB; 32)");
100 MODULE_PARM_DESC(max_sg_segs,
"Maximum number of scatter/gather segments to use (256)");
102 MODULE_PARM_DESC(try_direct_io,
"Try direct I/O between user buffer and tape drive (1)");
111 static int write_threshold_kbs;
112 static struct st_dev_parm {
117 "buffer_kbs", &buffer_kbs
120 "write_threshold_kbs", &write_threshold_kbs
126 "try_direct_io", &try_direct_io
132 #if ST_NBR_MODES > 16
133 #error "Maximum number of modes is 16"
137 static const char *st_formats[] = {
138 "",
"r",
"k",
"s",
"l",
"t",
"o",
"u",
139 "m",
"v",
"p",
"x",
"a",
"y",
"q",
"z"};
143 #define ST_FIXED_BUFFER_SIZE (ST_FIXED_BUFFER_BLOCKS * ST_KILOBYTE)
147 #if ST_FIXED_BUFFER_SIZE >= (2 << 24 - 1)
148 #error "Buffer size should not exceed (2 << 24 - 1) bytes!"
151 static int debugging =
DEBUG;
153 #define MAX_RETRIES 0
154 #define MAX_WRITE_RETRIES 0
155 #define MAX_READY_RETRIES 0
156 #define NO_TAPE NOT_READY
158 #define ST_TIMEOUT (900 * HZ)
159 #define ST_LONG_TIMEOUT (14000 * HZ)
162 #define TAPE_NR(x) ( ((iminor(x) & ~255) >> (ST_NBR_MODE_BITS + 1)) | \
163 (iminor(x) & ~(-1 << ST_MODE_SHIFT)) )
164 #define TAPE_MODE(x) ((iminor(x) & ST_MODE_MASK) >> ST_MODE_SHIFT)
167 #define TAPE_MINOR(d, m, n) (((d & ~(255 >> (ST_NBR_MODE_BITS + 1))) << (ST_NBR_MODE_BITS + 1)) | \
168 (d & (255 >> (ST_NBR_MODE_BITS + 1))) | (m << ST_MODE_SHIFT) | ((n != 0) << 7) )
172 #define SET_DENS_AND_BLK 0x10001
177 static int modes_defined;
179 static int enlarge_buffer(
struct st_buffer *,
int,
int);
180 static void clear_buffer(
struct st_buffer *);
181 static void normalize_buffer(
struct st_buffer *);
182 static int append_to_buffer(
const char __user *,
struct st_buffer *,
int);
183 static int from_buffer(
struct st_buffer *,
char __user *,
int);
184 static void move_buffer_data(
struct st_buffer *,
int);
186 static int sgl_map_user_pages(
struct st_buffer *,
const unsigned int,
187 unsigned long,
size_t,
int);
188 static int sgl_unmap_user_pages(
struct st_buffer *,
const unsigned int,
int);
190 static int st_probe(
struct device *);
191 static int st_remove(
struct device *);
193 static int do_create_sysfs_files(
void);
194 static void do_remove_sysfs_files(
void);
205 static int st_compression(
struct scsi_tape *,
int);
207 static int find_partition(
struct scsi_tape *);
208 static int switch_partition(
struct scsi_tape *);
210 static int st_int_ioctl(
struct scsi_tape *,
unsigned int,
unsigned long);
212 static void scsi_tape_release(
struct kref *);
214 #define to_scsi_tape(obj) container_of(obj, struct scsi_tape, kref)
224 #ifndef SIGS_FROM_OSST
225 #define SIGS_FROM_OSST \
226 {"OnStream", "SC-", "", "osst"}, \
227 {"OnStream", "DI-", "", "osst"}, \
228 {"OnStream", "DP-", "", "osst"}, \
229 {"OnStream", "USB", "", "osst"}, \
230 {"OnStream", "FW-", "", "osst"}
238 spin_lock(&st_index_lock);
243 kref_get(&STp->
kref);
254 kref_put(&STp->
kref, scsi_tape_release);
257 spin_unlock(&st_index_lock);
262 static void scsi_tape_put(
struct scsi_tape *STp)
267 kref_put(&STp->
kref, scsi_tape_release);
286 static char * st_incompatible(
struct scsi_device* SDp)
290 for (rp=&(reject_list[0]); rp->
vendor !=
NULL; rp++)
303 static inline char *tape_name(
struct scsi_tape *tape)
305 return tape->
disk->disk_name;
322 switch (sense[0] & 0x7f) {
327 s->
flags = sense[2] & 0xe0;
334 s->
flags = ucp ? (ucp[3] & 0xe0) : 0;
346 DEB(
const char *stp;)
347 char *
name = tape_name(STp);
353 cmdstatp = &STp->
buffer->cmdstat;
354 st_analyze_sense(SRpnt, cmdstatp);
357 scode = STp->
buffer->cmdstat.sense_hdr.sense_key;
363 printk(ST_DEB_MSG
"%s: Error: %x, cmd: %x %x %x %x %x %x\n",
365 SRpnt->
cmd[0], SRpnt->
cmd[1], SRpnt->
cmd[2],
366 SRpnt->
cmd[3], SRpnt->
cmd[4], SRpnt->
cmd[5]);
373 "%s: Error %x (driver bt 0x%x, host bt 0x%x).\n",
422 printk(ST_DEB_MSG
"%s: Recovered %s error (%d).\n",
name, stp,
426 if (cmdstatp->
flags == 0)
443 stp->buffer->syscall_result = -
EINTR;
445 stp->buffer->syscall_result = -
EBUSY;
451 static void st_release_request(
struct st_request *streq)
456 static void st_scsi_execute_end(
struct request *
req,
int uptodate)
462 STp->
buffer->cmdstat.midlevel_result = SRpnt->
result = req->errors;
463 STp->
buffer->cmdstat.residual = req->resid_len;
473 static int st_scsi_execute(
struct st_request *SRpnt,
const unsigned char *
cmd,
478 struct rq_map_data *mdata = &SRpnt->
stp->buffer->map_data;
487 req->cmd_type = REQ_TYPE_BLOCK_PC;
490 mdata->null_mapped = 1;
501 SRpnt->
bio = req->bio;
503 memset(req->cmd, 0, BLK_MAX_CDB);
504 memcpy(req->cmd, cmd, req->cmd_len);
505 req->sense = SRpnt->
sense;
507 req->timeout = timeout;
509 req->end_io_data = SRpnt;
523 struct rq_map_data *mdata = &STp->
buffer->map_data;
527 if (!do_wait && ((STp->
buffer)->last_SRpnt)) {
538 SRpnt = st_allocate_request(STp);
546 (STp->
buffer)->last_SRpnt = SRpnt;
548 waiting = &STp->
wait;
549 init_completion(waiting);
552 if (STp->
buffer->do_dio) {
553 mdata->page_order = 0;
554 mdata->nr_entries = STp->
buffer->sg_segs;
555 mdata->pages = STp->
buffer->mapped_pages;
557 mdata->page_order = STp->
buffer->reserved_page_order;
560 mdata->pages = STp->
buffer->reserved_pages;
565 STp->
buffer->cmdstat.have_sense = 0;
566 STp->
buffer->syscall_result = 0;
568 ret = st_scsi_execute(SRpnt, cmd, direction,
NULL, bytes, timeout,
574 }
else if (do_wait) {
577 (STp->
buffer)->syscall_result = st_chk_result(STp, SRpnt);
588 static int write_behind_check(
struct scsi_tape * STp)
601 if (STp->write_pending)
608 SRpnt = STbuffer->last_SRpnt;
609 STbuffer->last_SRpnt =
NULL;
610 SRpnt->waiting = NULL;
612 (STp->buffer)->syscall_result = st_chk_result(STp, SRpnt);
613 st_release_request(SRpnt);
615 STbuffer->buffer_bytes -= STbuffer->writing;
617 if (STps->drv_block >= 0) {
618 if (STp->block_size == 0)
641 DEB(
if (debugging && retval)
642 printk(ST_DEB_MSG
"%s: Async write error %x, return value %d.\n",
643 tape_name(STp), STbuffer->
cmdstat.midlevel_result, retval);)
662 cmd[2] = cmd[3] = cmd[4] = 0xff;
665 DEBC(
printk(ST_DEB_MSG
"%s: Stepping over filemark %s.\n",
666 tape_name(STp), forward ?
"forward" :
"backward"));
668 SRpnt = st_do_scsi(NULL, STp, cmd, 0,
DMA_NONE,
669 STp->device->request_queue->rq_timeout,
672 return (STp->buffer)->syscall_result;
674 st_release_request(SRpnt);
677 if ((STp->buffer)->cmdstat.midlevel_result != 0)
679 tape_name(STp), forward ?
"forward" :
"backward");
681 return (STp->buffer)->syscall_result;
686 static int st_flush_write_buffer(
struct scsi_tape * STp)
694 result = write_behind_check(STp);
699 if (STp->
dirty == 1) {
701 transfer = STp->
buffer->buffer_bytes;
702 DEBC(
printk(ST_DEB_MSG
"%s: Flushing %d bytes.\n",
703 tape_name(STp), transfer));
714 STp->
device->request_queue->rq_timeout,
717 return (STp->
buffer)->syscall_result;
720 if ((STp->
buffer)->syscall_result != 0) {
730 (STp->
buffer)->buffer_bytes = 0;
744 (STp->
buffer)->buffer_bytes = 0;
746 st_release_request(SRpnt);
755 static int flush_buffer(
struct scsi_tape *STp,
int seek_next)
774 return st_flush_write_buffer(STp);
779 backspace = ((STp->
buffer)->buffer_bytes +
783 (STp->
buffer)->buffer_bytes = 0;
784 (STp->
buffer)->read_pointer = 0;
788 result = cross_eof(STp, 0);
797 if (!result && backspace > 0)
798 result = st_int_ioctl(STp,
MTBSR, backspace);
814 char *
name = tape_name(STp);
834 "%s: Can't set default block size to %d bytes and density %x.\n",
844 static int do_door_lock(
struct scsi_tape * STp,
int do_lock)
847 DEB(
char *name = tape_name(STp);)
851 DEBC(
printk(ST_DEB_MSG
"%s: %socking drive door.\n", name,
852 do_lock ?
"L" :
"Unl"));
865 static void reset_state(
struct scsi_tape *STp)
872 STps = &(STp->
ps[
i]);
890 #define CHKRES_READY 0
891 #define CHKRES_NEW_SESSION 1
892 #define CHKRES_NOT_READY 2
893 #define CHKRES_NO_TAPE 3
895 #define MAX_ATTENTIONS 10
897 static int test_ready(
struct scsi_tape *STp,
int do_wait)
899 int attentions, waits, max_wait, scode;
907 for (attentions=waits=0; ; ) {
910 SRpnt = st_do_scsi(SRpnt, STp, cmd, 0,
DMA_NONE,
914 retval = (STp->
buffer)->syscall_result;
935 if (waits < max_wait) {
954 retval = (STp->
buffer)->syscall_result;
961 st_release_request(SRpnt);
971 static int check_tape(
struct scsi_tape *STp,
struct file *filp)
973 int i,
retval, new_session = 0, do_wait;
975 unsigned short st_flags = filp->
f_flags;
979 char *name = tape_name(STp);
986 DEBC(
printk(ST_DEB_MSG
"%s: Mode change from %d to %d.\n",
997 retval = test_ready(STp, do_wait);
1009 STps = &(STp->
ps[
i]);
1031 STp->
ps[0].drv_file = STp->
ps[0].drv_block = (-1);
1045 STp->
device->request_queue->rq_timeout,
1048 retval = (STp->
buffer)->syscall_result;
1052 if (!SRpnt->
result && !STp->
buffer->cmdstat.have_sense) {
1054 ((STp->
buffer)->b_data[2] << 8) | (STp->
buffer)->b_data[3];
1056 (STp->
buffer)->b_data[5];
1059 "%s: Block limits %d - %d bytes.\n", name,
1063 DEBC(
printk(ST_DEB_MSG
"%s: Can't read block limits.\n",
1073 STp->
device->request_queue->rq_timeout,
1076 retval = (STp->
buffer)->syscall_result;
1080 if ((STp->
buffer)->syscall_result != 0) {
1081 DEBC(
printk(ST_DEB_MSG
"%s: No Mode Sense.\n", name));
1083 (STp->
buffer)->syscall_result = 0;
1087 "%s: Mode sense. Length %d, medium %x, WBS %x, BLL %d\n",
1092 if ((STp->
buffer)->b_data[3] >= 8) {
1096 (STp->
buffer)->b_data[10] * 256 + (STp->
buffer)->b_data[11];
1098 "%s: Density %x, tape length: %x, drv buffer: %d\n",
1100 (STp->
buffer)->b_data[6] * 256 + (STp->
buffer)->b_data[7],
1106 "%s: non-buffered tape: disabling writing immediate filemarks\n",
1111 st_release_request(SRpnt);
1116 (STp->
buffer)->buffer_blocks =
1119 (STp->
buffer)->buffer_blocks = 1;
1120 (STp->
buffer)->buffer_bytes = (STp->
buffer)->read_pointer = 0;
1123 "%s: Block size: %d, buffer size: %d (%d blocks).\n", name,
1125 (STp->
buffer)->buffer_blocks));
1130 DEBC(
printk(ST_DEB_MSG
"%s: Write protected\n", name));
1134 (st_flags & O_ACCMODE) ==
O_RDWR)) {
1145 "%s: Updating partition number in status.\n", name));
1146 if ((STp->
partition = find_partition(STp)) < 0) {
1158 (retval = set_mode_densblk(STp, STm)) < 0)
1164 "%s: Can't set default drive buffering to %d.\n",
1178 static int st_open(
struct inode *inode,
struct file *filp)
1180 int i, retval = (-
EIO);
1194 if (!(STp = scsi_tape_get(dev))) {
1199 name = tape_name(STp);
1201 spin_lock(&st_use_lock);
1203 spin_unlock(&st_use_lock);
1205 DEB(
printk(ST_DEB_MSG
"%s: Device already in use.\n", name); )
1210 spin_unlock(&st_use_lock);
1213 if (scsi_autopm_get_device(STp->
device) < 0) {
1231 (STp->
buffer)->cleared = 0;
1232 (STp->
buffer)->writing = 0;
1233 (STp->
buffer)->syscall_result = 0;
1239 STps = &(STp->
ps[
i]);
1244 DEB( STp->nbr_waits = STp->nbr_finished = 0;
1245 STp->nbr_requests = STp->nbr_dio = STp->nbr_pages = 0; )
1247 retval = check_tape(STp, filp);
1261 normalize_buffer(STp->buffer);
1262 spin_lock(&st_use_lock);
1264 spin_unlock(&st_use_lock);
1267 scsi_autopm_put_device(STp->device);
1276 int result = 0, result2;
1282 char *name = tape_name(STp);
1288 result = st_flush_write_buffer(STp);
1289 if (result != 0 && result != (-
ENOSPC))
1294 (result2 = switch_partition(STp)) < 0) {
1296 "%s: switch_partition at close failed.\n", name));
1302 DEBC(
if (STp->nbr_requests)
1303 printk(
KERN_DEBUG "%s: Number of r/w requests %d, dio used in %d, pages %d.\n",
1304 name, STp->nbr_requests, STp->nbr_dio, STp->nbr_pages));
1309 DEBC(
printk(ST_DEB_MSG
"%s: Async write waits %d, finished %d.\n",
1310 name, STp->nbr_waits, STp->nbr_finished);
1315 if (STp->immediate_filemark)
1317 cmd[4] = 1 + STp->two_fm;
1319 SRpnt = st_do_scsi(NULL, STp, cmd, 0,
DMA_NONE,
1323 result = (STp->buffer)->syscall_result;
1327 if (STp->
buffer->syscall_result == 0 ||
1334 st_release_request(SRpnt);
1344 st_release_request(SRpnt);
1351 DEBC(
printk(ST_DEB_MSG
"%s: Buffer flushed, %d EOF(s) written\n",
1357 result = flush_buffer(STp, 0);
1359 result = cross_eof(STp, 0);
1369 !(result = cross_eof(STp, 1))) ||
1380 result2 = st_int_ioctl(STp,
MTREW, 1);
1390 static int st_release(
struct inode *inode,
struct file *filp)
1396 do_door_lock(STp, 0);
1398 normalize_buffer(STp->
buffer);
1399 spin_lock(&st_use_lock);
1401 spin_unlock(&st_use_lock);
1402 scsi_autopm_put_device(STp->
device);
1452 printk(ST_DEB_MSG
"%s: Incorrect device.\n", tape_name(STp));
1458 (retval = switch_partition(STp)) < 0)
1468 !do_door_lock(STp, 1))
1476 static int setup_buffering(
struct scsi_tape *STp,
const char __user *
buf,
1477 size_t count,
int is_read)
1487 if (i && ((
unsigned long)buf & queue_dma_alignment(
1488 STp->
device->request_queue)) == 0) {
1489 i = sgl_map_user_pages(STbp, STbp->
use_sg, (
unsigned long)buf,
1501 STp->nbr_pages += STbp->
do_dio;
1506 DEB( STp->nbr_requests++; )
1510 bufsize = STp->
block_size > st_fixed_buffer_size ?
1521 !enlarge_buffer(STbp, bufsize, STp->
restr_dma)) {
1523 tape_name(STp), bufsize);
1537 static void release_buffering(
struct scsi_tape *STp,
int is_read)
1543 sgl_unmap_user_pages(STbp, STbp->
do_dio, is_read);
1552 st_write(
struct file *filp,
const char __user *buf,
size_t count, loff_t * ppos)
1555 ssize_t i, do_count, blks, transfer;
1557 int undone, retry_eot = 0, scode;
1560 const char __user *b_point;
1566 char *name = tape_name(STp);
1571 retval = rw_checks(STp, filp, count);
1572 if (retval || count == 0)
1593 retval = flush_buffer(STp, 0);
1599 if ((retval = set_mode_densblk(STp, STm)) < 0)
1606 if (modes_defined) {
1615 i = write_behind_check(STp);
1643 retval = setup_buffering(STp, buf, count, 0);
1656 while (count > 0 && !retry_eot) {
1667 if (do_count > count)
1671 i = append_to_buffer(b_point, STbp, do_count);
1678 b_point += do_count;
1688 if (!async_write && count == 0)
1694 blks = transfer = do_count;
1703 cmd[2] = blks >> 16;
1707 SRpnt = st_do_scsi(SRpnt, STp, cmd, transfer,
DMA_TO_DEVICE,
1708 STp->
device->request_queue->rq_timeout,
1719 DEB( STp->write_pending = 1; )
1726 DEBC(
printk(ST_DEB_MSG
"%s: Error on write:\n", name));
1738 if (undone <= do_count) {
1744 blks = (transfer - undone) / STp->
block_size;
1751 undone > 0 || count == 0)
1754 "%s: EOM with %d bytes unwritten.\n",
1759 if (!retry_eot && !cmdstatp->
deferred &&
1761 move_buffer_data(STp->
buffer, transfer - undone);
1764 STps->
drv_block += (transfer - undone) /
1769 "%s: Retry write of %d bytes at EOM.\n",
1770 name, STp->
buffer->buffer_bytes));
1777 blks = do_count = 0;
1782 "%s: EOM with lost data.\n",
1804 if (retval || retry_eot) {
1806 retval = total -
count;
1815 retval = total -
count;
1819 st_release_request(SRpnt);
1820 release_buffering(STp, 0);
1832 static long read_tape(
struct scsi_tape *STp,
long count,
1835 int transfer, blks,
bytes;
1842 char *name = tape_name(STp);
1854 blks = bytes =
count;
1861 if (!STbp->
do_dio && bytes > (STp->
buffer)->buffer_size)
1862 bytes = (STp->
buffer)->buffer_size;
1871 if (!cmd[1] && STp->
sili)
1873 cmd[2] = blks >> 16;
1879 STp->
device->request_queue->rq_timeout,
1881 release_buffering(STp, 1);
1894 DEBC(
printk(ST_DEB_MSG
"%s: Sense: %2x %2x %2x %2x %2x %2x %2x %2x\n",
1903 cmdstatp->
flags &= 0xcf;
1905 if (cmdstatp->
flags != 0) {
1917 if (transfer <= 0) {
1920 "%s: Failed to read %d byte block with %d byte transfer.\n",
1921 name, bytes - transfer, bytes);
1929 st_release_request(SRpnt);
1930 SRpnt = *aSRpnt =
NULL;
1931 if (transfer == blks) {
1935 st_int_ioctl(STp,
MTBSR, 1);
1942 "%s: ILI but enough data received %ld %d.\n",
1946 if (st_int_ioctl(STp,
MTBSR, 1))
1960 "%s: EOF detected (%d bytes read).\n",
1973 DEBC(
printk(ST_DEB_MSG
"%s: EOM detected (%d bytes read).\n",
1980 "%s: Tape error while reading.\n", name));
1985 "%s: Zero returned for first BLANK CHECK after EOF.\n",
2020 st_read(
struct file *filp,
char __user *buf,
size_t count, loff_t * ppos)
2025 int special, do_dio = 0;
2031 DEB(
char *name = tape_name(STp); )
2036 retval = rw_checks(STp, filp, count);
2037 if (retval || count == 0)
2040 STm = &(STp->modes[STp->current_mode]);
2046 STp->try_dio_now = 0;
2049 STps = &(STp->ps[STp->partition]);
2051 retval = flush_buffer(STp, 0);
2058 printk(ST_DEB_MSG
"%s: EOF/EOM flag up (%d). Bytes %d\n", name,
2062 retval = setup_buffering(STp, buf, count, 1);
2065 do_dio = STbp->do_dio;
2094 for (total = 0, special = 0; total < count && !special;) {
2098 special = read_tape(STp, count - total, &SRpnt);
2110 "%s: EOF up (%d). Left %d, needed %d.\n", name,
2112 (
int)(count - total));
2117 i = from_buffer(STbp, buf, transfer);
2127 if (STp->block_size == 0)
2140 }
else if (STps->
eof == ST_EOD_1) {
2152 if (SRpnt != NULL) {
2153 st_release_request(SRpnt);
2157 release_buffering(STp, 1);
2173 "%s: Mode %d options: buffer writes: %d, async writes: %d, read ahead: %d\n",
2177 "%s: can bsr: %d, two FMs: %d, fast mteom: %d, auto lock: %d,\n",
2180 "%s: defs for wr: %d, no block limits: %d, partitions: %d, s2 log: %d\n",
2184 "%s: sysv: %d nowait: %d sili: %d nowait_filemark: %d\n",
2199 char *name = tape_name(STp);
2200 struct cdev *cd0, *cd1;
2209 "%s: Initialized mode %d definition from mode 0\n",
2232 st_log_options(STp, STm, name); )
2267 if ((options & MT_ST_DEBUGGING) != 0)
2269 st_log_options(STp, STm, name); )
2273 value = (options & ~MT_ST_OPTIONS);
2274 if (value == ~MT_ST_OPTIONS) {
2283 set_mode_densblk(STp, STm);
2287 value = (options & ~MT_ST_OPTIONS);
2291 (value & ~MT_ST_SET_LONG_TIMEOUT)));
2299 value = (options & ~MT_ST_OPTIONS) & 0xff;
2308 "%s: Cleaning request mode %d, mask %02x, value %02x\n",
2324 set_mode_densblk(STp, STm);
2331 "%s: Drive buffer default disabled.\n", name));
2335 "%s: Drive buffer default set to %x\n",
2344 "%s: Compression default disabled.\n", name));
2346 if ((value & 0xff00) != 0) {
2347 STp->
c_algo = (value & 0xff00) >> 8;
2351 if ((value & 0xff) != 0xff) {
2354 name, (value & 1)));
2368 #define MODE_HEADER_LENGTH 4
2371 #define MH_OFF_DATA_LENGTH 0
2372 #define MH_OFF_MEDIUM_TYPE 1
2373 #define MH_OFF_DEV_SPECIFIC 2
2374 #define MH_OFF_BDESCS_LENGTH 3
2375 #define MP_OFF_PAGE_NBR 0
2376 #define MP_OFF_PAGE_LENGTH 1
2379 #define MH_BIT_WP 0x80
2380 #define MP_MSK_PAGE_NBR 0x3f
2383 #define MODE_SENSE_OMIT_BDESCS 0x08
2385 #define MODE_SELECT_PAGE_FORMAT 0x10
2390 static int read_mode_page(
struct scsi_tape *STp,
int page,
int omit_block_descs)
2397 if (omit_block_descs)
2403 STp->
device->request_queue->rq_timeout, 0, 1);
2405 return (STp->
buffer)->syscall_result;
2407 st_release_request(SRpnt);
2409 return STp->
buffer->syscall_result;
2415 static int write_mode_page(
struct scsi_tape *STp,
int page,
int slow)
2439 return (STp->
buffer)->syscall_result;
2441 st_release_request(SRpnt);
2443 return STp->
buffer->syscall_result;
2447 #define COMPRESSION_PAGE 0x0f
2448 #define COMPRESSION_PAGE_LENGTH 16
2450 #define CP_OFF_DCE_DCC 2
2451 #define CP_OFF_C_ALGO 7
2453 #define DCE_MASK 0x80
2454 #define DCC_MASK 0x40
2455 #define RED_MASK 0x60
2468 unsigned char *b_data = (STp->
buffer)->b_data;
2469 DEB(
char *name = tape_name(STp); )
2477 DEBC(
printk(ST_DEB_MSG
"%s: Compression mode page not supported.\n",
2483 DEBC(
printk(ST_DEB_MSG
"%s: Compression state is %d.\n", name,
2488 DEBC(
printk(ST_DEB_MSG
"%s: Compression not supported.\n", name));
2506 DEBC(
printk(ST_DEB_MSG
"%s: Compression change failed.\n", name));
2509 DEBC(
printk(ST_DEB_MSG
"%s: Compression state changed to %d.\n",
2518 static int do_load_unload(
struct scsi_tape *STp,
struct file *filp,
int load_code)
2520 int retval = (-
EIO), timeout;
2521 DEB(
char *name = tape_name(STp); )
2542 DEBC(
printk(ST_DEB_MSG
"%s: Enhanced %sload slot %2d.\n",
2543 name, (cmd[4]) ?
"" :
"un",
2549 timeout = STp->
device->request_queue->rq_timeout;
2556 printk(ST_DEB_MSG
"%s: Unloading tape.\n", name);
2558 printk(ST_DEB_MSG
"%s: Loading tape.\n", name);
2561 SRpnt = st_do_scsi(NULL, STp, cmd, 0,
DMA_NONE,
2564 return (STp->
buffer)->syscall_result;
2566 retval = (STp->
buffer)->syscall_result;
2567 st_release_request(SRpnt);
2577 retval = check_tape(STp, filp);
2591 #define ST_DEB_FORWARD 0
2592 #define ST_DEB_BACKWARD 1
2593 static void deb_space_print(
char *name,
int direction,
char *units,
unsigned char *cmd)
2597 sc = cmd[2] & 0x80 ? 0xff000000 : 0;
2598 sc |= (cmd[2] << 16) | (cmd[3] << 8) | cmd[4];
2601 printk(ST_DEB_MSG
"%s: Spacing tape %s over %d %s.\n", name,
2602 direction ?
"backward" :
"forward", sc, units);
2608 static int st_int_ioctl(
struct scsi_tape *STp,
unsigned int cmd_in,
unsigned long arg)
2617 int fileno, blkno,
at_sm, undone;
2619 char *name = tape_name(STp);
2632 at_sm = STps->
at_sm;
2641 cmd[2] = (arg >> 16);
2642 cmd[3] = (arg >> 8);
2644 DEBC(deb_space_print(name, ST_DEB_FORWARD,
"filemarks", cmd);)
2648 at_sm &= (arg == 0);
2656 cmd[2] = (ltmp >> 16);
2657 cmd[3] = (ltmp >> 8);
2659 DEBC(deb_space_print(name, ST_DEB_BACKWARD, "filemarks", cmd);)
2663 at_sm &= (arg == 0);
2668 cmd[2] = (arg >> 16);
2669 cmd[3] = (arg >> 8);
2671 DEBC(deb_space_print(name, ST_DEB_FORWARD, "blocks", cmd);)
2674 at_sm &= (arg == 0);
2680 cmd[2] = (ltmp >> 16);
2681 cmd[3] = (ltmp >> 8);
2683 DEBC(deb_space_print(name, ST_DEB_BACKWARD, "blocks", cmd);)
2686 at_sm &= (arg == 0);
2691 cmd[2] = (arg >> 16);
2692 cmd[3] = (arg >> 8);
2694 DEBC(deb_space_print(name, ST_DEB_FORWARD, "setmarks", cmd);)
2696 blkno = fileno = (-1);
2704 cmd[2] = (ltmp >> 16);
2705 cmd[3] = (ltmp >> 8);
2707 DEBC(deb_space_print(name, ST_DEB_BACKWARD,
"setmarks", cmd);)
2709 blkno = fileno = (-1);
2719 if (cmd_in ==
MTWSM)
2724 cmd[2] = (arg >> 16);
2725 cmd[3] = (arg >> 8);
2727 timeout = STp->
device->request_queue->rq_timeout;
2729 if (cmd_in !=
MTWSM)
2730 printk(ST_DEB_MSG
"%s: Writing %d filemarks.\n", name,
2731 cmd[2] * 65536 + cmd[3] * 256 + cmd[4]);
2733 printk(ST_DEB_MSG
"%s: Writing %d setmarks.\n", name,
2734 cmd[2] * 65536 + cmd[3] * 256 + cmd[4]);
2739 at_sm = (cmd_in ==
MTWSM);
2743 if (STp->immediate) {
2745 timeout = STp->
device->request_queue->rq_timeout;
2747 DEBC(
printk(ST_DEB_MSG
"%s: Rewinding tape.\n", name));
2748 fileno = blkno = at_sm = 0;
2751 DEBC(
printk(ST_DEB_MSG
"%s: No op on tape.\n", name));
2758 timeout = STp->
device->request_queue->rq_timeout;
2761 DEBC(
printk(ST_DEB_MSG
"%s: Retensioning tape.\n", name));
2762 fileno = blkno = at_sm = 0;
2767 ioctl_result = st_int_ioctl(STp,
MTFSF, 0x7fffff);
2769 if (STps->
eof >= ST_EOD_1)
2779 DEBC(
printk(ST_DEB_MSG
"%s: Spacing to end of recorded medium.\n",
2788 cmd[1] = (arg ? 1 : 0);
2791 timeout = STp->
device->request_queue->rq_timeout;
2796 DEBC(
printk(ST_DEB_MSG
"%s: Erasing tape.\n", name));
2797 fileno = blkno = at_sm = 0;
2804 if (STp->
dirty || (STp->
buffer)->buffer_bytes != 0)
2809 ((arg & MT_ST_BLKSIZE_MASK) < STp->
min_block ||
2810 (arg & MT_ST_BLKSIZE_MASK) > STp->
max_block)) {
2817 cmd[4] = datalen = 12;
2822 (STp->
buffer)->b_data[2] = (arg & 7) << 4;
2824 (STp->
buffer)->b_data[2] =
2826 (STp->
buffer)->b_data[3] = 8;
2828 (STp->
buffer)->b_data[4] = arg;
2831 (STp->
buffer)->b_data[4] = arg >> 24;
2840 (STp->
buffer)->b_data[9] = (ltmp >> 16);
2841 (STp->
buffer)->b_data[10] = (ltmp >> 8);
2842 (STp->
buffer)->b_data[11] = ltmp;
2843 timeout = STp->
device->request_queue->rq_timeout;
2847 "%s: Setting block size to %d bytes.\n", name,
2848 (STp->
buffer)->b_data[9] * 65536 +
2849 (STp->
buffer)->b_data[10] * 256 +
2850 (STp->
buffer)->b_data[11]);
2853 "%s: Setting density code to %x.\n", name,
2854 (STp->
buffer)->b_data[4]);
2857 "%s: Setting drive buffer code to %d.\n", name,
2858 ((STp->
buffer)->b_data[2] >> 4) & 7);
2865 SRpnt = st_do_scsi(NULL, STp, cmd, datalen, direction,
2868 return (STp->buffer)->syscall_result;
2870 ioctl_result = (STp->buffer)->syscall_result;
2872 if (!ioctl_result) {
2873 st_release_request(SRpnt);
2880 ioctl_result = st_int_ioctl(STp,
MTFSF, 1);
2881 else if (cmd_in ==
MTFSFM)
2882 ioctl_result = st_int_ioctl(STp,
MTBSF, 1);
2886 if (STp->block_size != 0) {
2887 (STp->buffer)->buffer_blocks =
2888 (STp->buffer)->buffer_size / STp->block_size;
2890 (STp->buffer)->buffer_bytes = (STp->buffer)->read_pointer = 0;
2894 STp->drv_buffer = (arg & 7);
2898 if (cmd_in ==
MTEOM)
2900 else if (cmd_in ==
MTFSF)
2937 }
else if ((cmd_in ==
MTFSF) || (cmd_in ==
MTFSFM)) {
2944 }
else if ((cmd_in ==
MTBSF) || (cmd_in ==
MTBSFM)) {
2945 if (arg > 0 && undone < 0)
2951 }
else if (cmd_in ==
MTFSR) {
2958 if (blkno >= undone)
2964 }
else if (cmd_in ==
MTBSR) {
2969 if (arg > 0 && undone < 0)
2975 }
else if (cmd_in ==
MTEOM) {
2988 st_release_request(SRpnt);
2990 return st_int_ioctl(STp, cmd_in, arg);
2998 st_release_request(SRpnt);
3002 return ioctl_result;
3009 static int get_location(
struct scsi_tape *STp,
unsigned int *
block,
int *partition,
3015 DEB(
char *name = tape_name(STp); )
3030 STp->
device->request_queue->rq_timeout,
3033 return (STp->
buffer)->syscall_result;
3035 if ((STp->
buffer)->syscall_result != 0 ||
3037 ((STp->
buffer)->b_data[0] & 4) != 0)) {
3038 *block = *partition = 0;
3039 DEBC(
printk(ST_DEB_MSG
"%s: Can't read tape position.\n", name));
3044 *block = ((STp->
buffer)->b_data[0] << 16)
3045 + ((STp->
buffer)->b_data[1] << 8)
3046 + (STp->
buffer)->b_data[2];
3049 *block = ((STp->
buffer)->b_data[4] << 24)
3050 + ((STp->
buffer)->b_data[5] << 16)
3051 + ((STp->
buffer)->b_data[6] << 8)
3052 + (STp->
buffer)->b_data[7];
3053 *partition = (STp->
buffer)->b_data[1];
3054 if (((STp->
buffer)->b_data[0] & 0x80) &&
3055 (STp->
buffer)->b_data[1] == 0)
3056 STp->
ps[0].drv_block = STp->
ps[0].drv_file = 0;
3058 DEBC(
printk(ST_DEB_MSG
"%s: Got tape pos. blk %d part %d.\n", name,
3059 *block, *partition));
3061 st_release_request(SRpnt);
3070 static int set_location(
struct scsi_tape *STp,
unsigned int block,
int partition,
3079 DEB(
char *name = tape_name(STp); )
3083 timeout = STp->long_timeout;
3084 STps = &(STp->
ps[STp->partition]);
3087 name, block, partition));
3088 DEB(
if (partition < 0)
3092 if ((!STp->can_partitions && partition != 0) ||
3093 partition >= ST_NBR_PARTITIONS)
3095 if (partition != STp->partition) {
3096 if (get_location(STp, &blk, &p, 1))
3102 "%s: Visited block %d for partition %d saved.\n",
3110 scmd[2] = (block >> 16);
3111 scmd[3] = (block >> 8);
3116 scmd[3] = (block >> 24);
3117 scmd[4] = (block >> 16);
3118 scmd[5] = (block >> 8);
3124 scmd[8] = partition;
3126 "%s: Trying to change partition from %d to %d\n",
3132 timeout = STp->
device->request_queue->rq_timeout;
3135 SRpnt = st_do_scsi(NULL, STp, scmd, 0,
DMA_NONE,
3138 return (STp->
buffer)->syscall_result;
3142 if ((STp->
buffer)->syscall_result != 0) {
3146 (p = find_partition(STp)) >= 0)
3151 STps = &(STp->
ps[partition]);
3164 st_release_request(SRpnt);
3173 static int find_partition(
struct scsi_tape *STp)
3178 if ((i = get_location(STp, &block, &partition, 1)) < 0)
3180 if (partition >= ST_NBR_PARTITIONS)
3187 static int switch_partition(
struct scsi_tape *STp)
3201 #define PART_PAGE 0x11
3202 #define PART_PAGE_FIXED_LENGTH 8
3204 #define PP_OFF_MAX_ADD_PARTS 2
3205 #define PP_OFF_NBR_ADD_PARTS 3
3206 #define PP_OFF_FLAGS 4
3207 #define PP_OFF_PART_UNITS 6
3208 #define PP_OFF_RESERVED 7
3210 #define PP_BIT_IDP 0x20
3211 #define PP_MSK_PSUM_MB 0x10
3215 static int nbr_partitions(
struct scsi_tape *STp)
3218 DEB(
char *name = tape_name(STp); )
3223 result = read_mode_page(STp,
PART_PAGE, 1);
3226 DEBC(
printk(ST_DEB_MSG
"%s: Can't read medium partition page.\n",
3232 DEBC(
printk(ST_DEB_MSG
"%s: Number of partitions %d.\n", name, result));
3260 char *name = tape_name(STp);
3262 int pgo, psd_cnt, psdo;
3265 result = read_mode_page(STp,
PART_PAGE, 0);
3267 DEBC(
printk(ST_DEB_MSG
"%s: Can't read partition mode page.\n", name));
3271 bp = (STp->
buffer)->b_data;
3273 DEBC(
printk(ST_DEB_MSG
"%s: Partition page length is %d bytes.\n",
3279 bp[psdo] = bp[psdo + 1] = 0xff;
3284 DEBC(
printk(
"%s: psd_cnt %d, max.parts %d, nbr_parts %d\n", name,
3292 DEBC(
printk(ST_DEB_MSG
"%s: Formatting tape with one partition.\n",
3295 bp[psdo] = (size >> 8) & 0xff;
3296 bp[psdo + 1] = size & 0xff;
3301 "%s: Formatting tape with two partitions (1 = %d MB).\n",
3308 result = write_mode_page(STp,
PART_PAGE, 1);
3320 static long st_ioctl(
struct file *
file,
unsigned int cmd_in,
unsigned long arg)
3322 int i, cmd_nr, cmd_type,
bt;
3328 char *name = tape_name(STp);
3332 return -ERESTARTSYS;
3335 if (debugging && !STp->
in_use) {
3336 printk(ST_DEB_MSG
"%s: Incorrect device.\n", name);
3375 "%s: MTSETDRVBUFFER only allowed for root.\n", name);
3381 (mtc.mt_count & MT_ST_OPTIONS) == 0)) {
3390 mtc.mt_op ==
MTEOM) {
3394 }
else if (mtc.mt_op ==
MTBSF || mtc.mt_op ==
MTBSFM) {
3401 if (mtc.mt_op ==
MTSEEK) {
3414 i = flush_buffer(STp, i);
3423 i = st_int_ioctl(STp,
MTWEOF, 1);
3439 if (mtc.mt_op !=
MTREW &&
3444 mtc.mt_op !=
MTEOM) {
3450 STp->
device->was_reset = 0;
3459 do_door_lock(STp, 0);
3462 (mtc.mt_count & MT_ST_OPTIONS) != 0) {
3463 retval = st_set_options(STp, mtc.mt_count);
3469 mtc.mt_count < 0 || mtc.mt_count >= ST_NBR_PARTITIONS) {
3492 if ((i = st_int_ioctl(STp,
MTREW, 0)) < 0 ||
3493 (i = partition_tape(STp, mtc.mt_count)) < 0) {
3499 STp->
ps[
i].at_sm = 0;
3500 STp->
ps[
i].last_block_valid = 0;
3509 if (mtc.mt_op ==
MTSEEK) {
3518 retval = do_load_unload(STp, file, 0);
3522 if (mtc.mt_op ==
MTLOAD) {
3523 retval = do_load_unload(STp, file,
max(1, mtc.mt_count));
3528 retval = do_door_lock(STp, (mtc.mt_op ==
MTLOCK));
3533 (i = switch_partition(STp)) < 0) {
3539 retval = st_compression(STp, (mtc.mt_count & 1));
3541 retval = st_int_ioctl(STp, mtc.mt_op, mtc.mt_count);
3549 if ((i = flush_buffer(STp, 0)) < 0) {
3554 (i = switch_partition(STp)) < 0) {
3560 struct mtget mt_status;
3568 mt_status.mt_dsreg =
3572 mt_status.mt_fileno = STps->
drv_file;
3575 mt_status.mt_blkno +=
3578 mt_status.mt_blkno -=
3579 ((STp->
buffer)->buffer_bytes +
3583 mt_status.mt_gstat = 0;
3586 if (mt_status.mt_blkno == 0) {
3587 if (mt_status.mt_fileno == 0)
3588 mt_status.mt_gstat |=
GMT_BOT(0xffffffff);
3590 mt_status.mt_gstat |=
GMT_EOF(0xffffffff);
3595 mt_status.mt_gstat |=
GMT_EOT(0xffffffff);
3597 mt_status.mt_gstat |=
GMT_EOD(0xffffffff);
3599 mt_status.mt_gstat |=
GMT_D_800(0xffffffff);
3601 mt_status.mt_gstat |=
GMT_D_1600(0xffffffff);
3603 mt_status.mt_gstat |=
GMT_D_6250(0xffffffff);
3605 mt_status.mt_gstat |=
GMT_ONLINE(0xffffffff);
3609 mt_status.mt_gstat |=
GMT_SM(0xffffffff);
3615 mt_status.mt_gstat |=
GMT_CLN(0xffffffff);
3628 struct mtpos mt_pos;
3633 if ((i = get_location(STp, &blk, &bt, 0)) < 0) {
3637 mt_pos.mt_blkno =
blk;
3649 if ((cmd_in ==
SG_IO ||
3656 file->
f_mode, cmd_in, p);
3673 #ifdef CONFIG_COMPAT
3674 static long st_compat_ioctl(
struct file *file,
unsigned int cmd,
unsigned long arg)
3679 if (sdev->
host->hostt->compat_ioctl) {
3681 ret = sdev->
host->hostt->compat_ioctl(sdev, cmd, (
void __user *)arg);
3692 static struct st_buffer *new_tape_buffer(
int need_dma,
int max_sg)
3718 #define ST_MAX_ORDER 6
3720 static int enlarge_buffer(
struct st_buffer * STbuffer,
int new_size,
int need_dma)
3722 int segs, nbr, max_segs, b_size,
order, got;
3729 normalize_buffer(STbuffer);
3731 max_segs = STbuffer->
use_sg;
3732 nbr = max_segs - STbuffer->
frp_segs;
3750 order++, b_size *= 2)
3754 if (max_segs * (
PAGE_SIZE << order) < new_size) {
3757 normalize_buffer(STbuffer);
3758 return enlarge_buffer(STbuffer, new_size, need_dma);
3762 segs < max_segs && got < new_size;) {
3768 normalize_buffer(STbuffer);
3785 static void clear_buffer(
struct st_buffer * st_bp)
3789 for (i=0; i < st_bp->
frp_segs; i++)
3797 static void normalize_buffer(
struct st_buffer * STbuffer)
3801 for (i = 0; i < STbuffer->
frp_segs; i++) {
3814 static int append_to_buffer(
const char __user *ubp,
struct st_buffer * st_bp,
int do_count)
3820 i < st_bp->frp_segs && offset >= length; i++)
3826 for (; i < st_bp->
frp_segs && do_count > 0; i++) {
3828 cnt = length - offset < do_count ? length - offset : do_count;
3846 static int from_buffer(
struct st_buffer * st_bp,
char __user *ubp,
int do_count)
3852 i < st_bp->frp_segs && offset >= length; i++)
3858 for (; i < st_bp->
frp_segs && do_count > 0; i++) {
3860 cnt = length - offset < do_count ? length - offset : do_count;
3878 static void move_buffer_data(
struct st_buffer * st_bp,
int offset)
3880 int src_seg, dst_seg, src_offset = 0, dst_offset;
3888 for (src_seg=0; src_seg < st_bp->
frp_segs; src_seg++) {
3890 if (src_offset < length)
3896 for (dst_seg=dst_offset=0; total > 0; ) {
3900 count =
min(length - dst_offset, length - src_offset);
3903 src_offset +=
count;
3904 if (src_offset >= length) {
3908 dst_offset +=
count;
3909 if (dst_offset >= length) {
3918 static void validate_options(
void)
3923 st_max_sg_segs = max_sg_segs;
3931 int i,
len, ints[5];
3939 *
parms[
i].val = ints[i + 1];
3941 while (stp != NULL) {
3945 (*(stp + len) ==
':' || *(stp + len) ==
'=')) {
3978 .unlocked_ioctl = st_ioctl,
3979 #ifdef CONFIG_COMPAT
3980 .compat_ioctl = st_compat_ioctl,
3984 .release = st_release,
3988 static int create_one_cdev(
struct scsi_tape *tape,
int mode,
int rew)
3996 int dev_num = tape->
index;
4002 pr_err(
"st%d: out of memory. Device not attached.\n", dev_num);
4007 cdev->
ops = &st_fops;
4009 error =
cdev_add(cdev, cdev_devno, 1);
4011 pr_err(
"st%d: Can't add %s-rewind mode %d\n", dev_num,
4012 rew ?
"non" :
"auto", mode);
4013 pr_err(
"st%d: Device not attached.\n", dev_num);
4019 snprintf(name, 10,
"%s%s%s", rew ?
"n" :
"",
4020 tape->
disk->disk_name, st_formats[i]);
4023 cdev_devno, &tape->
modes[mode],
"%s", name);
4025 pr_err(
"st%d: device_create failed\n", dev_num);
4026 error = PTR_ERR(dev);
4040 static int create_cdevs(
struct scsi_tape *tape)
4044 error = create_one_cdev(tape, mode, 0);
4047 error = create_one_cdev(tape, mode, 1);
4053 &tape->
modes[0].devs[0]->kobj,
"tape");
4056 static void remove_cdevs(
struct scsi_tape *tape)
4062 for (rew = 0; rew < 2; rew++) {
4063 if (STm->
cdevs[rew])
4071 static int st_probe(
struct device *dev)
4074 struct gendisk *disk =
NULL;
4084 if ((stp = st_incompatible(SDp))) {
4091 if (st_max_sg_segs < i)
4093 buffer = new_tape_buffer((SDp->
host)->unchecked_isa_dma, i);
4094 if (buffer == NULL) {
4096 "st: Can't allocate new tape buffer. Device not attached.\n");
4103 goto out_buffer_free;
4111 kref_init(&tpnt->
kref);
4113 disk->private_data = &tpnt->
driver;
4115 tpnt->
driver = &st_template;
4148 tpnt->
try_dio = try_direct_io && !SDp->
host->unchecked_isa_dma;
4165 STps = &(tpnt->
ps[
i]);
4175 tpnt->
modes[0].defined = 1;
4182 pr_warn(
"st: idr expansion failed\n");
4187 spin_lock(&st_index_lock);
4188 error =
idr_get_new(&st_index_idr, tpnt, &dev_num);
4189 spin_unlock(&st_index_lock);
4191 pr_warn(
"st: idr allocation failed: %d\n", error);
4200 tpnt->
index = dev_num;
4201 sprintf(disk->disk_name,
"st%d", dev_num);
4206 error = create_cdevs(tpnt);
4208 goto out_remove_devs;
4209 scsi_autopm_put_device(SDp);
4212 "Attached scsi tape %s\n", tape_name(tpnt));
4214 tape_name(tpnt), tpnt->
try_dio ?
"yes" :
"no",
4222 spin_lock(&st_index_lock);
4224 spin_unlock(&st_index_lock);
4235 static int st_remove(
struct device *dev)
4244 kref_put(&tpnt->
kref, scsi_tape_release);
4246 spin_lock(&st_index_lock);
4248 spin_unlock(&st_index_lock);
4261 static void scsi_tape_release(
struct kref *
kref)
4264 struct gendisk *disk = tpnt->
disk;
4269 normalize_buffer(tpnt->
buffer);
4274 disk->private_data =
NULL;
4280 static struct class st_sysfs_class = {
4281 .name =
"scsi_tape",
4282 .dev_attrs = st_dev_attrs,
4285 static int __init init_st(
void)
4292 verstr, st_fixed_buffer_size, st_max_sg_segs);
4296 pr_err(
"Unable register sysfs class for SCSI tapes\n");
4312 err = do_create_sysfs_files();
4328 static void __exit exit_st(
void)
4330 do_remove_sysfs_files();
4367 static int do_create_sysfs_files(
void)
4377 goto err_try_direct_io;
4380 goto err_attr_fixed_buf;
4383 goto err_attr_max_sg;
4396 static void do_remove_sysfs_files(
void)
4464 DEB( options |= debugging ? MT_ST_DEBUGGING : 0 );
4465 options |= STp->
two_fm ? MT_ST_TWO_FM : 0;
4466 options |= STp->
fast_mteom ? MT_ST_FAST_MTEOM : 0;
4468 options |= STp->
can_bsr ? MT_ST_CAN_BSR : 0;
4472 options |= STm->
sysv ? MT_ST_SYSV : 0;
4473 options |= STp->
immediate ? MT_ST_NOWAIT : 0;
4475 options |= STp->
sili ? MT_ST_SILI : 0;
4491 static int sgl_map_user_pages(
struct st_buffer *STbp,
4492 const unsigned int max_pages,
unsigned long uaddr,
4493 size_t count,
int rw)
4497 const int nr_pages = end -
start;
4499 struct page **
pages;
4500 struct rq_map_data *mdata = &STbp->
map_data;
4503 if ((uaddr + count) <
uaddr)
4507 if (nr_pages > max_pages)
4535 for (i=0; i < nr_pages; i++) {
4548 for (j=0; j <
res; j++)
4558 static int sgl_unmap_user_pages(
struct st_buffer *STbp,
4559 const unsigned int nr_pages,
int dirtied)
4563 for (i=0; i < nr_pages; i++) {