pktcdvd.c
上传用户:ajay2009
上传日期:2009-05-22
资源大小:495k
文件大小:65k
源码类别:

驱动编程

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (C) 2000 Jens Axboe <axboe@suse.de>
  3.  * Copyright (C) 2001-2004 Peter Osterlund <petero2@telia.com>
  4.  *
  5.  * May be copied or modified under the terms of the GNU General Public
  6.  * License.  See linux/COPYING for more information.
  7.  *
  8.  * Packet writing layer for ATAPI and SCSI CD-RW, DVD+RW, DVD-RW and
  9.  * DVD-RAM devices.
  10.  *
  11.  * Theory of operation:
  12.  *
  13.  * At the lowest level, there is the standard driver for the CD/DVD device,
  14.  * typically ide-cd.c or sr.c. This driver can handle read and write requests,
  15.  * but it doesn't know anything about the special restrictions that apply to
  16.  * packet writing. One restriction is that write requests must be aligned to
  17.  * packet boundaries on the physical media, and the size of a write request
  18.  * must be equal to the packet size. Another restriction is that a
  19.  * GPCMD_FLUSH_CACHE command has to be issued to the drive before a read
  20.  * command, if the previous command was a write.
  21.  *
  22.  * The purpose of the packet writing driver is to hide these restrictions from
  23.  * higher layers, such as file systems, and present a block device that can be
  24.  * randomly read and written using 2kB-sized blocks.
  25.  *
  26.  * The lowest layer in the packet writing driver is the packet I/O scheduler.
  27.  * Its data is defined by the struct packet_iosched and includes two bio
  28.  * queues with pending read and write requests. These queues are processed
  29.  * by the pkt_iosched_process_queue() function. The write requests in this
  30.  * queue are already properly aligned and sized. This layer is responsible for
  31.  * issuing the flush cache commands and scheduling the I/O in a good order.
  32.  *
  33.  * The next layer transforms unaligned write requests to aligned writes. This
  34.  * transformation requires reading missing pieces of data from the underlying
  35.  * block device, assembling the pieces to full packets and queuing them to the
  36.  * packet I/O scheduler.
  37.  *
  38.  * At the top layer there is a custom make_request_fn function that forwards
  39.  * read requests directly to the iosched queue and puts write requests in the
  40.  * unaligned write queue. A kernel thread performs the necessary read
  41.  * gathering to convert the unaligned writes to aligned writes and then feeds
  42.  * them to the packet I/O scheduler.
  43.  *
  44.  *************************************************************************/
  45. #define VERSION_CODE "v0.2.0a 2004-07-14 Jens Axboe (axboe@suse.de) and petero2@telia.com"
  46. #include <linux/pktcdvd.h>
  47. #include <linux/config.h>
  48. #include <linux/module.h>
  49. #include <linux/types.h>
  50. #include <linux/kernel.h>
  51. #include <linux/kthread.h>
  52. #include <linux/errno.h>
  53. #include <linux/spinlock.h>
  54. #include <linux/file.h>
  55. #include <linux/proc_fs.h>
  56. #include <linux/seq_file.h>
  57. #include <linux/miscdevice.h>
  58. #include <linux/suspend.h>
  59. #include <scsi/scsi_cmnd.h>
  60. #include <scsi/scsi_ioctl.h>
  61. #include <asm/uaccess.h>
  62. #if PACKET_DEBUG
  63. #define DPRINTK(fmt, args...) printk(KERN_NOTICE fmt, ##args)
  64. #else
  65. #define DPRINTK(fmt, args...)
  66. #endif
  67. #if PACKET_DEBUG > 1
  68. #define VPRINTK(fmt, args...) printk(KERN_NOTICE fmt, ##args)
  69. #else
  70. #define VPRINTK(fmt, args...)
  71. #endif
  72. #define MAX_SPEED 0xffff
  73. #define ZONE(sector, pd) (((sector) + (pd)->offset) & ~((pd)->settings.size - 1))
  74. static struct pktcdvd_device *pkt_devs[MAX_WRITERS];
  75. static struct proc_dir_entry *pkt_proc;
  76. static int pkt_major;
  77. static struct semaphore ctl_mutex; /* Serialize open/close/setup/teardown */
  78. static mempool_t *psd_pool;
  79. static void pkt_bio_finished(struct pktcdvd_device *pd)
  80. {
  81. BUG_ON(atomic_read(&pd->cdrw.pending_bios) <= 0);
  82. if (atomic_dec_and_test(&pd->cdrw.pending_bios)) {
  83. VPRINTK("pktcdvd: queue emptyn");
  84. atomic_set(&pd->iosched.attention, 1);
  85. wake_up(&pd->wqueue);
  86. }
  87. }
  88. static void pkt_bio_destructor(struct bio *bio)
  89. {
  90. kfree(bio->bi_io_vec);
  91. kfree(bio);
  92. }
  93. static struct bio *pkt_bio_alloc(int nr_iovecs)
  94. {
  95. struct bio_vec *bvl = NULL;
  96. struct bio *bio;
  97. bio = kmalloc(sizeof(struct bio), GFP_KERNEL);
  98. if (!bio)
  99. goto no_bio;
  100. bio_init(bio);
  101. bvl = kcalloc(nr_iovecs, sizeof(struct bio_vec), GFP_KERNEL);
  102. if (!bvl)
  103. goto no_bvl;
  104. bio->bi_max_vecs = nr_iovecs;
  105. bio->bi_io_vec = bvl;
  106. bio->bi_destructor = pkt_bio_destructor;
  107. return bio;
  108.  no_bvl:
  109. kfree(bio);
  110.  no_bio:
  111. return NULL;
  112. }
  113. /*
  114.  * Allocate a packet_data struct
  115.  */
  116. static struct packet_data *pkt_alloc_packet_data(void)
  117. {
  118. int i;
  119. struct packet_data *pkt;
  120. pkt = kzalloc(sizeof(struct packet_data), GFP_KERNEL);
  121. if (!pkt)
  122. goto no_pkt;
  123. pkt->w_bio = pkt_bio_alloc(PACKET_MAX_SIZE);
  124. if (!pkt->w_bio)
  125. goto no_bio;
  126. for (i = 0; i < PAGES_PER_PACKET; i++) {
  127. pkt->pages[i] = alloc_page(GFP_KERNEL|__GFP_ZERO);
  128. if (!pkt->pages[i])
  129. goto no_page;
  130. }
  131. spin_lock_init(&pkt->lock);
  132. for (i = 0; i < PACKET_MAX_SIZE; i++) {
  133. struct bio *bio = pkt_bio_alloc(1);
  134. if (!bio)
  135. goto no_rd_bio;
  136. pkt->r_bios[i] = bio;
  137. }
  138. return pkt;
  139. no_rd_bio:
  140. for (i = 0; i < PACKET_MAX_SIZE; i++) {
  141. struct bio *bio = pkt->r_bios[i];
  142. if (bio)
  143. bio_put(bio);
  144. }
  145. no_page:
  146. for (i = 0; i < PAGES_PER_PACKET; i++)
  147. if (pkt->pages[i])
  148. __free_page(pkt->pages[i]);
  149. bio_put(pkt->w_bio);
  150. no_bio:
  151. kfree(pkt);
  152. no_pkt:
  153. return NULL;
  154. }
  155. /*
  156.  * Free a packet_data struct
  157.  */
  158. static void pkt_free_packet_data(struct packet_data *pkt)
  159. {
  160. int i;
  161. for (i = 0; i < PACKET_MAX_SIZE; i++) {
  162. struct bio *bio = pkt->r_bios[i];
  163. if (bio)
  164. bio_put(bio);
  165. }
  166. for (i = 0; i < PAGES_PER_PACKET; i++)
  167. __free_page(pkt->pages[i]);
  168. bio_put(pkt->w_bio);
  169. kfree(pkt);
  170. }
  171. static void pkt_shrink_pktlist(struct pktcdvd_device *pd)
  172. {
  173. struct packet_data *pkt, *next;
  174. BUG_ON(!list_empty(&pd->cdrw.pkt_active_list));
  175. list_for_each_entry_safe(pkt, next, &pd->cdrw.pkt_free_list, list) {
  176. pkt_free_packet_data(pkt);
  177. }
  178. }
  179. static int pkt_grow_pktlist(struct pktcdvd_device *pd, int nr_packets)
  180. {
  181. struct packet_data *pkt;
  182. INIT_LIST_HEAD(&pd->cdrw.pkt_free_list);
  183. INIT_LIST_HEAD(&pd->cdrw.pkt_active_list);
  184. spin_lock_init(&pd->cdrw.active_list_lock);
  185. while (nr_packets > 0) {
  186. pkt = pkt_alloc_packet_data();
  187. if (!pkt) {
  188. pkt_shrink_pktlist(pd);
  189. return 0;
  190. }
  191. pkt->id = nr_packets;
  192. pkt->pd = pd;
  193. list_add(&pkt->list, &pd->cdrw.pkt_free_list);
  194. nr_packets--;
  195. }
  196. return 1;
  197. }
  198. static void *pkt_rb_alloc(gfp_t gfp_mask, void *data)
  199. {
  200. return kmalloc(sizeof(struct pkt_rb_node), gfp_mask);
  201. }
  202. static void pkt_rb_free(void *ptr, void *data)
  203. {
  204. kfree(ptr);
  205. }
  206. static inline struct pkt_rb_node *pkt_rbtree_next(struct pkt_rb_node *node)
  207. {
  208. struct rb_node *n = rb_next(&node->rb_node);
  209. if (!n)
  210. return NULL;
  211. return rb_entry(n, struct pkt_rb_node, rb_node);
  212. }
  213. static inline void pkt_rbtree_erase(struct pktcdvd_device *pd, struct pkt_rb_node *node)
  214. {
  215. rb_erase(&node->rb_node, &pd->bio_queue);
  216. mempool_free(node, pd->rb_pool);
  217. pd->bio_queue_size--;
  218. BUG_ON(pd->bio_queue_size < 0);
  219. }
  220. /*
  221.  * Find the first node in the pd->bio_queue rb tree with a starting sector >= s.
  222.  */
  223. static struct pkt_rb_node *pkt_rbtree_find(struct pktcdvd_device *pd, sector_t s)
  224. {
  225. struct rb_node *n = pd->bio_queue.rb_node;
  226. struct rb_node *next;
  227. struct pkt_rb_node *tmp;
  228. if (!n) {
  229. BUG_ON(pd->bio_queue_size > 0);
  230. return NULL;
  231. }
  232. for (;;) {
  233. tmp = rb_entry(n, struct pkt_rb_node, rb_node);
  234. if (s <= tmp->bio->bi_sector)
  235. next = n->rb_left;
  236. else
  237. next = n->rb_right;
  238. if (!next)
  239. break;
  240. n = next;
  241. }
  242. if (s > tmp->bio->bi_sector) {
  243. tmp = pkt_rbtree_next(tmp);
  244. if (!tmp)
  245. return NULL;
  246. }
  247. BUG_ON(s > tmp->bio->bi_sector);
  248. return tmp;
  249. }
  250. /*
  251.  * Insert a node into the pd->bio_queue rb tree.
  252.  */
  253. static void pkt_rbtree_insert(struct pktcdvd_device *pd, struct pkt_rb_node *node)
  254. {
  255. struct rb_node **p = &pd->bio_queue.rb_node;
  256. struct rb_node *parent = NULL;
  257. sector_t s = node->bio->bi_sector;
  258. struct pkt_rb_node *tmp;
  259. while (*p) {
  260. parent = *p;
  261. tmp = rb_entry(parent, struct pkt_rb_node, rb_node);
  262. if (s < tmp->bio->bi_sector)
  263. p = &(*p)->rb_left;
  264. else
  265. p = &(*p)->rb_right;
  266. }
  267. rb_link_node(&node->rb_node, parent, p);
  268. rb_insert_color(&node->rb_node, &pd->bio_queue);
  269. pd->bio_queue_size++;
  270. }
  271. /*
  272.  * Add a bio to a single linked list defined by its head and tail pointers.
  273.  */
  274. static inline void pkt_add_list_last(struct bio *bio, struct bio **list_head, struct bio **list_tail)
  275. {
  276. bio->bi_next = NULL;
  277. if (*list_tail) {
  278. BUG_ON((*list_head) == NULL);
  279. (*list_tail)->bi_next = bio;
  280. (*list_tail) = bio;
  281. } else {
  282. BUG_ON((*list_head) != NULL);
  283. (*list_head) = bio;
  284. (*list_tail) = bio;
  285. }
  286. }
  287. /*
  288.  * Remove and return the first bio from a single linked list defined by its
  289.  * head and tail pointers.
  290.  */
  291. static inline struct bio *pkt_get_list_first(struct bio **list_head, struct bio **list_tail)
  292. {
  293. struct bio *bio;
  294. if (*list_head == NULL)
  295. return NULL;
  296. bio = *list_head;
  297. *list_head = bio->bi_next;
  298. if (*list_head == NULL)
  299. *list_tail = NULL;
  300. bio->bi_next = NULL;
  301. return bio;
  302. }
  303. /*
  304.  * Send a packet_command to the underlying block device and
  305.  * wait for completion.
  306.  */
  307. static int pkt_generic_packet(struct pktcdvd_device *pd, struct packet_command *cgc)
  308. {
  309. char sense[SCSI_SENSE_BUFFERSIZE];
  310. request_queue_t *q;
  311. struct request *rq;
  312. DECLARE_COMPLETION(wait);
  313. int err = 0;
  314. q = bdev_get_queue(pd->bdev);
  315. rq = blk_get_request(q, (cgc->data_direction == CGC_DATA_WRITE) ? WRITE : READ,
  316.      __GFP_WAIT);
  317. rq->errors = 0;
  318. rq->rq_disk = pd->bdev->bd_disk;
  319. rq->bio = NULL;
  320. rq->buffer = NULL;
  321. rq->timeout = 60*HZ;
  322. rq->data = cgc->buffer;
  323. rq->data_len = cgc->buflen;
  324. rq->sense = sense;
  325. memset(sense, 0, sizeof(sense));
  326. rq->sense_len = 0;
  327. rq->flags |= REQ_BLOCK_PC | REQ_HARDBARRIER;
  328. if (cgc->quiet)
  329. rq->flags |= REQ_QUIET;
  330. memcpy(rq->cmd, cgc->cmd, CDROM_PACKET_SIZE);
  331. if (sizeof(rq->cmd) > CDROM_PACKET_SIZE)
  332. memset(rq->cmd + CDROM_PACKET_SIZE, 0, sizeof(rq->cmd) - CDROM_PACKET_SIZE);
  333. rq->ref_count++;
  334. rq->flags |= REQ_NOMERGE;
  335. rq->waiting = &wait;
  336. rq->end_io = blk_end_sync_rq;
  337. elv_add_request(q, rq, ELEVATOR_INSERT_BACK, 1);
  338. generic_unplug_device(q);
  339. wait_for_completion(&wait);
  340. if (rq->errors)
  341. err = -EIO;
  342. blk_put_request(rq);
  343. return err;
  344. }
  345. /*
  346.  * A generic sense dump / resolve mechanism should be implemented across
  347.  * all ATAPI + SCSI devices.
  348.  */
  349. static void pkt_dump_sense(struct packet_command *cgc)
  350. {
  351. static char *info[9] = { "No sense", "Recovered error", "Not ready",
  352.  "Medium error", "Hardware error", "Illegal request",
  353.  "Unit attention", "Data protect", "Blank check" };
  354. int i;
  355. struct request_sense *sense = cgc->sense;
  356. printk("pktcdvd:");
  357. for (i = 0; i < CDROM_PACKET_SIZE; i++)
  358. printk(" %02x", cgc->cmd[i]);
  359. printk(" - ");
  360. if (sense == NULL) {
  361. printk("no sensen");
  362. return;
  363. }
  364. printk("sense %02x.%02x.%02x", sense->sense_key, sense->asc, sense->ascq);
  365. if (sense->sense_key > 8) {
  366. printk(" (INVALID)n");
  367. return;
  368. }
  369. printk(" (%s)n", info[sense->sense_key]);
  370. }
  371. /*
  372.  * flush the drive cache to media
  373.  */
  374. static int pkt_flush_cache(struct pktcdvd_device *pd)
  375. {
  376. struct packet_command cgc;
  377. init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
  378. cgc.cmd[0] = GPCMD_FLUSH_CACHE;
  379. cgc.quiet = 1;
  380. /*
  381.  * the IMMED bit -- we default to not setting it, although that
  382.  * would allow a much faster close, this is safer
  383.  */
  384. #if 0
  385. cgc.cmd[1] = 1 << 1;
  386. #endif
  387. return pkt_generic_packet(pd, &cgc);
  388. }
  389. /*
  390.  * speed is given as the normal factor, e.g. 4 for 4x
  391.  */
  392. static int pkt_set_speed(struct pktcdvd_device *pd, unsigned write_speed, unsigned read_speed)
  393. {
  394. struct packet_command cgc;
  395. struct request_sense sense;
  396. int ret;
  397. init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
  398. cgc.sense = &sense;
  399. cgc.cmd[0] = GPCMD_SET_SPEED;
  400. cgc.cmd[2] = (read_speed >> 8) & 0xff;
  401. cgc.cmd[3] = read_speed & 0xff;
  402. cgc.cmd[4] = (write_speed >> 8) & 0xff;
  403. cgc.cmd[5] = write_speed & 0xff;
  404. if ((ret = pkt_generic_packet(pd, &cgc)))
  405. pkt_dump_sense(&cgc);
  406. return ret;
  407. }
  408. /*
  409.  * Queue a bio for processing by the low-level CD device. Must be called
  410.  * from process context.
  411.  */
  412. static void pkt_queue_bio(struct pktcdvd_device *pd, struct bio *bio)
  413. {
  414. spin_lock(&pd->iosched.lock);
  415. if (bio_data_dir(bio) == READ) {
  416. pkt_add_list_last(bio, &pd->iosched.read_queue,
  417.   &pd->iosched.read_queue_tail);
  418. } else {
  419. pkt_add_list_last(bio, &pd->iosched.write_queue,
  420.   &pd->iosched.write_queue_tail);
  421. }
  422. spin_unlock(&pd->iosched.lock);
  423. atomic_set(&pd->iosched.attention, 1);
  424. wake_up(&pd->wqueue);
  425. }
  426. /*
  427.  * Process the queued read/write requests. This function handles special
  428.  * requirements for CDRW drives:
  429.  * - A cache flush command must be inserted before a read request if the
  430.  *   previous request was a write.
  431.  * - Switching between reading and writing is slow, so don't do it more often
  432.  *   than necessary.
  433.  * - Optimize for throughput at the expense of latency. This means that streaming
  434.  *   writes will never be interrupted by a read, but if the drive has to seek
  435.  *   before the next write, switch to reading instead if there are any pending
  436.  *   read requests.
  437.  * - Set the read speed according to current usage pattern. When only reading
  438.  *   from the device, it's best to use the highest possible read speed, but
  439.  *   when switching often between reading and writing, it's better to have the
  440.  *   same read and write speeds.
  441.  */
  442. static void pkt_iosched_process_queue(struct pktcdvd_device *pd)
  443. {
  444. request_queue_t *q;
  445. if (atomic_read(&pd->iosched.attention) == 0)
  446. return;
  447. atomic_set(&pd->iosched.attention, 0);
  448. q = bdev_get_queue(pd->bdev);
  449. for (;;) {
  450. struct bio *bio;
  451. int reads_queued, writes_queued;
  452. spin_lock(&pd->iosched.lock);
  453. reads_queued = (pd->iosched.read_queue != NULL);
  454. writes_queued = (pd->iosched.write_queue != NULL);
  455. spin_unlock(&pd->iosched.lock);
  456. if (!reads_queued && !writes_queued)
  457. break;
  458. if (pd->iosched.writing) {
  459. int need_write_seek = 1;
  460. spin_lock(&pd->iosched.lock);
  461. bio = pd->iosched.write_queue;
  462. spin_unlock(&pd->iosched.lock);
  463. if (bio && (bio->bi_sector == pd->iosched.last_write))
  464. need_write_seek = 0;
  465. if (need_write_seek && reads_queued) {
  466. if (atomic_read(&pd->cdrw.pending_bios) > 0) {
  467. VPRINTK("pktcdvd: write, waitingn");
  468. break;
  469. }
  470. pkt_flush_cache(pd);
  471. pd->iosched.writing = 0;
  472. }
  473. } else {
  474. if (!reads_queued && writes_queued) {
  475. if (atomic_read(&pd->cdrw.pending_bios) > 0) {
  476. VPRINTK("pktcdvd: read, waitingn");
  477. break;
  478. }
  479. pd->iosched.writing = 1;
  480. }
  481. }
  482. spin_lock(&pd->iosched.lock);
  483. if (pd->iosched.writing) {
  484. bio = pkt_get_list_first(&pd->iosched.write_queue,
  485.  &pd->iosched.write_queue_tail);
  486. } else {
  487. bio = pkt_get_list_first(&pd->iosched.read_queue,
  488.  &pd->iosched.read_queue_tail);
  489. }
  490. spin_unlock(&pd->iosched.lock);
  491. if (!bio)
  492. continue;
  493. if (bio_data_dir(bio) == READ)
  494. pd->iosched.successive_reads += bio->bi_size >> 10;
  495. else {
  496. pd->iosched.successive_reads = 0;
  497. pd->iosched.last_write = bio->bi_sector + bio_sectors(bio);
  498. }
  499. if (pd->iosched.successive_reads >= HI_SPEED_SWITCH) {
  500. if (pd->read_speed == pd->write_speed) {
  501. pd->read_speed = MAX_SPEED;
  502. pkt_set_speed(pd, pd->write_speed, pd->read_speed);
  503. }
  504. } else {
  505. if (pd->read_speed != pd->write_speed) {
  506. pd->read_speed = pd->write_speed;
  507. pkt_set_speed(pd, pd->write_speed, pd->read_speed);
  508. }
  509. }
  510. atomic_inc(&pd->cdrw.pending_bios);
  511. generic_make_request(bio);
  512. }
  513. }
  514. /*
  515.  * Special care is needed if the underlying block device has a small
  516.  * max_phys_segments value.
  517.  */
  518. static int pkt_set_segment_merging(struct pktcdvd_device *pd, request_queue_t *q)
  519. {
  520. if ((pd->settings.size << 9) / CD_FRAMESIZE <= q->max_phys_segments) {
  521. /*
  522.  * The cdrom device can handle one segment/frame
  523.  */
  524. clear_bit(PACKET_MERGE_SEGS, &pd->flags);
  525. return 0;
  526. } else if ((pd->settings.size << 9) / PAGE_SIZE <= q->max_phys_segments) {
  527. /*
  528.  * We can handle this case at the expense of some extra memory
  529.  * copies during write operations
  530.  */
  531. set_bit(PACKET_MERGE_SEGS, &pd->flags);
  532. return 0;
  533. } else {
  534. printk("pktcdvd: cdrom max_phys_segments too smalln");
  535. return -EIO;
  536. }
  537. }
  538. /*
  539.  * Copy CD_FRAMESIZE bytes from src_bio into a destination page
  540.  */
  541. static void pkt_copy_bio_data(struct bio *src_bio, int seg, int offs, struct page *dst_page, int dst_offs)
  542. {
  543. unsigned int copy_size = CD_FRAMESIZE;
  544. while (copy_size > 0) {
  545. struct bio_vec *src_bvl = bio_iovec_idx(src_bio, seg);
  546. void *vfrom = kmap_atomic(src_bvl->bv_page, KM_USER0) +
  547. src_bvl->bv_offset + offs;
  548. void *vto = page_address(dst_page) + dst_offs;
  549. int len = min_t(int, copy_size, src_bvl->bv_len - offs);
  550. BUG_ON(len < 0);
  551. memcpy(vto, vfrom, len);
  552. kunmap_atomic(vfrom, KM_USER0);
  553. seg++;
  554. offs = 0;
  555. dst_offs += len;
  556. copy_size -= len;
  557. }
  558. }
  559. /*
  560.  * Copy all data for this packet to pkt->pages[], so that
  561.  * a) The number of required segments for the write bio is minimized, which
  562.  *    is necessary for some scsi controllers.
  563.  * b) The data can be used as cache to avoid read requests if we receive a
  564.  *    new write request for the same zone.
  565.  */
  566. static void pkt_make_local_copy(struct packet_data *pkt, struct page **pages, int *offsets)
  567. {
  568. int f, p, offs;
  569. /* Copy all data to pkt->pages[] */
  570. p = 0;
  571. offs = 0;
  572. for (f = 0; f < pkt->frames; f++) {
  573. if (pages[f] != pkt->pages[p]) {
  574. void *vfrom = kmap_atomic(pages[f], KM_USER0) + offsets[f];
  575. void *vto = page_address(pkt->pages[p]) + offs;
  576. memcpy(vto, vfrom, CD_FRAMESIZE);
  577. kunmap_atomic(vfrom, KM_USER0);
  578. pages[f] = pkt->pages[p];
  579. offsets[f] = offs;
  580. } else {
  581. BUG_ON(offsets[f] != offs);
  582. }
  583. offs += CD_FRAMESIZE;
  584. if (offs >= PAGE_SIZE) {
  585. offs = 0;
  586. p++;
  587. }
  588. }
  589. }
  590. static int pkt_end_io_read(struct bio *bio, unsigned int bytes_done, int err)
  591. {
  592. struct packet_data *pkt = bio->bi_private;
  593. struct pktcdvd_device *pd = pkt->pd;
  594. BUG_ON(!pd);
  595. if (bio->bi_size)
  596. return 1;
  597. VPRINTK("pkt_end_io_read: bio=%p sec0=%llx sec=%llx err=%dn", bio,
  598. (unsigned long long)pkt->sector, (unsigned long long)bio->bi_sector, err);
  599. if (err)
  600. atomic_inc(&pkt->io_errors);
  601. if (atomic_dec_and_test(&pkt->io_wait)) {
  602. atomic_inc(&pkt->run_sm);
  603. wake_up(&pd->wqueue);
  604. }
  605. pkt_bio_finished(pd);
  606. return 0;
  607. }
  608. static int pkt_end_io_packet_write(struct bio *bio, unsigned int bytes_done, int err)
  609. {
  610. struct packet_data *pkt = bio->bi_private;
  611. struct pktcdvd_device *pd = pkt->pd;
  612. BUG_ON(!pd);
  613. if (bio->bi_size)
  614. return 1;
  615. VPRINTK("pkt_end_io_packet_write: id=%d, err=%dn", pkt->id, err);
  616. pd->stats.pkt_ended++;
  617. pkt_bio_finished(pd);
  618. atomic_dec(&pkt->io_wait);
  619. atomic_inc(&pkt->run_sm);
  620. wake_up(&pd->wqueue);
  621. return 0;
  622. }
  623. /*
  624.  * Schedule reads for the holes in a packet
  625.  */
  626. static void pkt_gather_data(struct pktcdvd_device *pd, struct packet_data *pkt)
  627. {
  628. int frames_read = 0;
  629. struct bio *bio;
  630. int f;
  631. char written[PACKET_MAX_SIZE];
  632. BUG_ON(!pkt->orig_bios);
  633. atomic_set(&pkt->io_wait, 0);
  634. atomic_set(&pkt->io_errors, 0);
  635. /*
  636.  * Figure out which frames we need to read before we can write.
  637.  */
  638. memset(written, 0, sizeof(written));
  639. spin_lock(&pkt->lock);
  640. for (bio = pkt->orig_bios; bio; bio = bio->bi_next) {
  641. int first_frame = (bio->bi_sector - pkt->sector) / (CD_FRAMESIZE >> 9);
  642. int num_frames = bio->bi_size / CD_FRAMESIZE;
  643. pd->stats.secs_w += num_frames * (CD_FRAMESIZE >> 9);
  644. BUG_ON(first_frame < 0);
  645. BUG_ON(first_frame + num_frames > pkt->frames);
  646. for (f = first_frame; f < first_frame + num_frames; f++)
  647. written[f] = 1;
  648. }
  649. spin_unlock(&pkt->lock);
  650. if (pkt->cache_valid) {
  651. VPRINTK("pkt_gather_data: zone %llx cachedn",
  652. (unsigned long long)pkt->sector);
  653. goto out_account;
  654. }
  655. /*
  656.  * Schedule reads for missing parts of the packet.
  657.  */
  658. for (f = 0; f < pkt->frames; f++) {
  659. int p, offset;
  660. if (written[f])
  661. continue;
  662. bio = pkt->r_bios[f];
  663. bio_init(bio);
  664. bio->bi_max_vecs = 1;
  665. bio->bi_sector = pkt->sector + f * (CD_FRAMESIZE >> 9);
  666. bio->bi_bdev = pd->bdev;
  667. bio->bi_end_io = pkt_end_io_read;
  668. bio->bi_private = pkt;
  669. p = (f * CD_FRAMESIZE) / PAGE_SIZE;
  670. offset = (f * CD_FRAMESIZE) % PAGE_SIZE;
  671. VPRINTK("pkt_gather_data: Adding frame %d, page:%p offs:%dn",
  672. f, pkt->pages[p], offset);
  673. if (!bio_add_page(bio, pkt->pages[p], CD_FRAMESIZE, offset))
  674. BUG();
  675. atomic_inc(&pkt->io_wait);
  676. bio->bi_rw = READ;
  677. pkt_queue_bio(pd, bio);
  678. frames_read++;
  679. }
  680. out_account:
  681. VPRINTK("pkt_gather_data: need %d frames for zone %llxn",
  682. frames_read, (unsigned long long)pkt->sector);
  683. pd->stats.pkt_started++;
  684. pd->stats.secs_rg += frames_read * (CD_FRAMESIZE >> 9);
  685. }
  686. /*
  687.  * Find a packet matching zone, or the least recently used packet if
  688.  * there is no match.
  689.  */
  690. static struct packet_data *pkt_get_packet_data(struct pktcdvd_device *pd, int zone)
  691. {
  692. struct packet_data *pkt;
  693. list_for_each_entry(pkt, &pd->cdrw.pkt_free_list, list) {
  694. if (pkt->sector == zone || pkt->list.next == &pd->cdrw.pkt_free_list) {
  695. list_del_init(&pkt->list);
  696. if (pkt->sector != zone)
  697. pkt->cache_valid = 0;
  698. return pkt;
  699. }
  700. }
  701. BUG();
  702. return NULL;
  703. }
  704. static void pkt_put_packet_data(struct pktcdvd_device *pd, struct packet_data *pkt)
  705. {
  706. if (pkt->cache_valid) {
  707. list_add(&pkt->list, &pd->cdrw.pkt_free_list);
  708. } else {
  709. list_add_tail(&pkt->list, &pd->cdrw.pkt_free_list);
  710. }
  711. }
  712. /*
  713.  * recover a failed write, query for relocation if possible
  714.  *
  715.  * returns 1 if recovery is possible, or 0 if not
  716.  *
  717.  */
  718. static int pkt_start_recovery(struct packet_data *pkt)
  719. {
  720. /*
  721.  * FIXME. We need help from the file system to implement
  722.  * recovery handling.
  723.  */
  724. return 0;
  725. #if 0
  726. struct request *rq = pkt->rq;
  727. struct pktcdvd_device *pd = rq->rq_disk->private_data;
  728. struct block_device *pkt_bdev;
  729. struct super_block *sb = NULL;
  730. unsigned long old_block, new_block;
  731. sector_t new_sector;
  732. pkt_bdev = bdget(kdev_t_to_nr(pd->pkt_dev));
  733. if (pkt_bdev) {
  734. sb = get_super(pkt_bdev);
  735. bdput(pkt_bdev);
  736. }
  737. if (!sb)
  738. return 0;
  739. if (!sb->s_op || !sb->s_op->relocate_blocks)
  740. goto out;
  741. old_block = pkt->sector / (CD_FRAMESIZE >> 9);
  742. if (sb->s_op->relocate_blocks(sb, old_block, &new_block))
  743. goto out;
  744. new_sector = new_block * (CD_FRAMESIZE >> 9);
  745. pkt->sector = new_sector;
  746. pkt->bio->bi_sector = new_sector;
  747. pkt->bio->bi_next = NULL;
  748. pkt->bio->bi_flags = 1 << BIO_UPTODATE;
  749. pkt->bio->bi_idx = 0;
  750. BUG_ON(pkt->bio->bi_rw != (1 << BIO_RW));
  751. BUG_ON(pkt->bio->bi_vcnt != pkt->frames);
  752. BUG_ON(pkt->bio->bi_size != pkt->frames * CD_FRAMESIZE);
  753. BUG_ON(pkt->bio->bi_end_io != pkt_end_io_packet_write);
  754. BUG_ON(pkt->bio->bi_private != pkt);
  755. drop_super(sb);
  756. return 1;
  757. out:
  758. drop_super(sb);
  759. return 0;
  760. #endif
  761. }
  762. static inline void pkt_set_state(struct packet_data *pkt, enum packet_data_state state)
  763. {
  764. #if PACKET_DEBUG > 1
  765. static const char *state_name[] = {
  766. "IDLE", "WAITING", "READ_WAIT", "WRITE_WAIT", "RECOVERY", "FINISHED"
  767. };
  768. enum packet_data_state old_state = pkt->state;
  769. VPRINTK("pkt %2d : s=%6llx %s -> %sn", pkt->id, (unsigned long long)pkt->sector,
  770. state_name[old_state], state_name[state]);
  771. #endif
  772. pkt->state = state;
  773. }
  774. /*
  775.  * Scan the work queue to see if we can start a new packet.
  776.  * returns non-zero if any work was done.
  777.  */
  778. static int pkt_handle_queue(struct pktcdvd_device *pd)
  779. {
  780. struct packet_data *pkt, *p;
  781. struct bio *bio = NULL;
  782. sector_t zone = 0; /* Suppress gcc warning */
  783. struct pkt_rb_node *node, *first_node;
  784. struct rb_node *n;
  785. VPRINTK("handle_queuen");
  786. atomic_set(&pd->scan_queue, 0);
  787. if (list_empty(&pd->cdrw.pkt_free_list)) {
  788. VPRINTK("handle_queue: no pktn");
  789. return 0;
  790. }
  791. /*
  792.  * Try to find a zone we are not already working on.
  793.  */
  794. spin_lock(&pd->lock);
  795. first_node = pkt_rbtree_find(pd, pd->current_sector);
  796. if (!first_node) {
  797. n = rb_first(&pd->bio_queue);
  798. if (n)
  799. first_node = rb_entry(n, struct pkt_rb_node, rb_node);
  800. }
  801. node = first_node;
  802. while (node) {
  803. bio = node->bio;
  804. zone = ZONE(bio->bi_sector, pd);
  805. list_for_each_entry(p, &pd->cdrw.pkt_active_list, list) {
  806. if (p->sector == zone) {
  807. bio = NULL;
  808. goto try_next_bio;
  809. }
  810. }
  811. break;
  812. try_next_bio:
  813. node = pkt_rbtree_next(node);
  814. if (!node) {
  815. n = rb_first(&pd->bio_queue);
  816. if (n)
  817. node = rb_entry(n, struct pkt_rb_node, rb_node);
  818. }
  819. if (node == first_node)
  820. node = NULL;
  821. }
  822. spin_unlock(&pd->lock);
  823. if (!bio) {
  824. VPRINTK("handle_queue: no bion");
  825. return 0;
  826. }
  827. pkt = pkt_get_packet_data(pd, zone);
  828. pd->current_sector = zone + pd->settings.size;
  829. pkt->sector = zone;
  830. pkt->frames = pd->settings.size >> 2;
  831. pkt->write_size = 0;
  832. /*
  833.  * Scan work queue for bios in the same zone and link them
  834.  * to this packet.
  835.  */
  836. spin_lock(&pd->lock);
  837. VPRINTK("pkt_handle_queue: looking for zone %llxn", (unsigned long long)zone);
  838. while ((node = pkt_rbtree_find(pd, zone)) != NULL) {
  839. bio = node->bio;
  840. VPRINTK("pkt_handle_queue: found zone=%llxn",
  841. (unsigned long long)ZONE(bio->bi_sector, pd));
  842. if (ZONE(bio->bi_sector, pd) != zone)
  843. break;
  844. pkt_rbtree_erase(pd, node);
  845. spin_lock(&pkt->lock);
  846. pkt_add_list_last(bio, &pkt->orig_bios, &pkt->orig_bios_tail);
  847. pkt->write_size += bio->bi_size / CD_FRAMESIZE;
  848. spin_unlock(&pkt->lock);
  849. }
  850. spin_unlock(&pd->lock);
  851. pkt->sleep_time = max(PACKET_WAIT_TIME, 1);
  852. pkt_set_state(pkt, PACKET_WAITING_STATE);
  853. atomic_set(&pkt->run_sm, 1);
  854. spin_lock(&pd->cdrw.active_list_lock);
  855. list_add(&pkt->list, &pd->cdrw.pkt_active_list);
  856. spin_unlock(&pd->cdrw.active_list_lock);
  857. return 1;
  858. }
  859. /*
  860.  * Assemble a bio to write one packet and queue the bio for processing
  861.  * by the underlying block device.
  862.  */
  863. static void pkt_start_write(struct pktcdvd_device *pd, struct packet_data *pkt)
  864. {
  865. struct bio *bio;
  866. struct page *pages[PACKET_MAX_SIZE];
  867. int offsets[PACKET_MAX_SIZE];
  868. int f;
  869. int frames_write;
  870. for (f = 0; f < pkt->frames; f++) {
  871. pages[f] = pkt->pages[(f * CD_FRAMESIZE) / PAGE_SIZE];
  872. offsets[f] = (f * CD_FRAMESIZE) % PAGE_SIZE;
  873. }
  874. /*
  875.  * Fill-in pages[] and offsets[] with data from orig_bios.
  876.  */
  877. frames_write = 0;
  878. spin_lock(&pkt->lock);
  879. for (bio = pkt->orig_bios; bio; bio = bio->bi_next) {
  880. int segment = bio->bi_idx;
  881. int src_offs = 0;
  882. int first_frame = (bio->bi_sector - pkt->sector) / (CD_FRAMESIZE >> 9);
  883. int num_frames = bio->bi_size / CD_FRAMESIZE;
  884. BUG_ON(first_frame < 0);
  885. BUG_ON(first_frame + num_frames > pkt->frames);
  886. for (f = first_frame; f < first_frame + num_frames; f++) {
  887. struct bio_vec *src_bvl = bio_iovec_idx(bio, segment);
  888. while (src_offs >= src_bvl->bv_len) {
  889. src_offs -= src_bvl->bv_len;
  890. segment++;
  891. BUG_ON(segment >= bio->bi_vcnt);
  892. src_bvl = bio_iovec_idx(bio, segment);
  893. }
  894. if (src_bvl->bv_len - src_offs >= CD_FRAMESIZE) {
  895. pages[f] = src_bvl->bv_page;
  896. offsets[f] = src_bvl->bv_offset + src_offs;
  897. } else {
  898. pkt_copy_bio_data(bio, segment, src_offs,
  899.   pages[f], offsets[f]);
  900. }
  901. src_offs += CD_FRAMESIZE;
  902. frames_write++;
  903. }
  904. }
  905. pkt_set_state(pkt, PACKET_WRITE_WAIT_STATE);
  906. spin_unlock(&pkt->lock);
  907. VPRINTK("pkt_start_write: Writing %d frames for zone %llxn",
  908. frames_write, (unsigned long long)pkt->sector);
  909. BUG_ON(frames_write != pkt->write_size);
  910. if (test_bit(PACKET_MERGE_SEGS, &pd->flags) || (pkt->write_size < pkt->frames)) {
  911. pkt_make_local_copy(pkt, pages, offsets);
  912. pkt->cache_valid = 1;
  913. } else {
  914. pkt->cache_valid = 0;
  915. }
  916. /* Start the write request */
  917. bio_init(pkt->w_bio);
  918. pkt->w_bio->bi_max_vecs = PACKET_MAX_SIZE;
  919. pkt->w_bio->bi_sector = pkt->sector;
  920. pkt->w_bio->bi_bdev = pd->bdev;
  921. pkt->w_bio->bi_end_io = pkt_end_io_packet_write;
  922. pkt->w_bio->bi_private = pkt;
  923. for (f = 0; f < pkt->frames; f++) {
  924. if ((f + 1 < pkt->frames) && (pages[f + 1] == pages[f]) &&
  925.     (offsets[f + 1] = offsets[f] + CD_FRAMESIZE)) {
  926. if (!bio_add_page(pkt->w_bio, pages[f], CD_FRAMESIZE * 2, offsets[f]))
  927. BUG();
  928. f++;
  929. } else {
  930. if (!bio_add_page(pkt->w_bio, pages[f], CD_FRAMESIZE, offsets[f]))
  931. BUG();
  932. }
  933. }
  934. VPRINTK("pktcdvd: vcnt=%dn", pkt->w_bio->bi_vcnt);
  935. atomic_set(&pkt->io_wait, 1);
  936. pkt->w_bio->bi_rw = WRITE;
  937. pkt_queue_bio(pd, pkt->w_bio);
  938. }
  939. static void pkt_finish_packet(struct packet_data *pkt, int uptodate)
  940. {
  941. struct bio *bio, *next;
  942. if (!uptodate)
  943. pkt->cache_valid = 0;
  944. /* Finish all bios corresponding to this packet */
  945. bio = pkt->orig_bios;
  946. while (bio) {
  947. next = bio->bi_next;
  948. bio->bi_next = NULL;
  949. bio_endio(bio, bio->bi_size, uptodate ? 0 : -EIO);
  950. bio = next;
  951. }
  952. pkt->orig_bios = pkt->orig_bios_tail = NULL;
  953. }
  954. static void pkt_run_state_machine(struct pktcdvd_device *pd, struct packet_data *pkt)
  955. {
  956. int uptodate;
  957. VPRINTK("run_state_machine: pkt %dn", pkt->id);
  958. for (;;) {
  959. switch (pkt->state) {
  960. case PACKET_WAITING_STATE:
  961. if ((pkt->write_size < pkt->frames) && (pkt->sleep_time > 0))
  962. return;
  963. pkt->sleep_time = 0;
  964. pkt_gather_data(pd, pkt);
  965. pkt_set_state(pkt, PACKET_READ_WAIT_STATE);
  966. break;
  967. case PACKET_READ_WAIT_STATE:
  968. if (atomic_read(&pkt->io_wait) > 0)
  969. return;
  970. if (atomic_read(&pkt->io_errors) > 0) {
  971. pkt_set_state(pkt, PACKET_RECOVERY_STATE);
  972. } else {
  973. pkt_start_write(pd, pkt);
  974. }
  975. break;
  976. case PACKET_WRITE_WAIT_STATE:
  977. if (atomic_read(&pkt->io_wait) > 0)
  978. return;
  979. if (test_bit(BIO_UPTODATE, &pkt->w_bio->bi_flags)) {
  980. pkt_set_state(pkt, PACKET_FINISHED_STATE);
  981. } else {
  982. pkt_set_state(pkt, PACKET_RECOVERY_STATE);
  983. }
  984. break;
  985. case PACKET_RECOVERY_STATE:
  986. if (pkt_start_recovery(pkt)) {
  987. pkt_start_write(pd, pkt);
  988. } else {
  989. VPRINTK("No recovery possiblen");
  990. pkt_set_state(pkt, PACKET_FINISHED_STATE);
  991. }
  992. break;
  993. case PACKET_FINISHED_STATE:
  994. uptodate = test_bit(BIO_UPTODATE, &pkt->w_bio->bi_flags);
  995. pkt_finish_packet(pkt, uptodate);
  996. return;
  997. default:
  998. BUG();
  999. break;
  1000. }
  1001. }
  1002. }
  1003. static void pkt_handle_packets(struct pktcdvd_device *pd)
  1004. {
  1005. struct packet_data *pkt, *next;
  1006. VPRINTK("pkt_handle_packetsn");
  1007. /*
  1008.  * Run state machine for active packets
  1009.  */
  1010. list_for_each_entry(pkt, &pd->cdrw.pkt_active_list, list) {
  1011. if (atomic_read(&pkt->run_sm) > 0) {
  1012. atomic_set(&pkt->run_sm, 0);
  1013. pkt_run_state_machine(pd, pkt);
  1014. }
  1015. }
  1016. /*
  1017.  * Move no longer active packets to the free list
  1018.  */
  1019. spin_lock(&pd->cdrw.active_list_lock);
  1020. list_for_each_entry_safe(pkt, next, &pd->cdrw.pkt_active_list, list) {
  1021. if (pkt->state == PACKET_FINISHED_STATE) {
  1022. list_del(&pkt->list);
  1023. pkt_put_packet_data(pd, pkt);
  1024. pkt_set_state(pkt, PACKET_IDLE_STATE);
  1025. atomic_set(&pd->scan_queue, 1);
  1026. }
  1027. }
  1028. spin_unlock(&pd->cdrw.active_list_lock);
  1029. }
  1030. static void pkt_count_states(struct pktcdvd_device *pd, int *states)
  1031. {
  1032. struct packet_data *pkt;
  1033. int i;
  1034. for (i = 0; i <= PACKET_NUM_STATES; i++)
  1035. states[i] = 0;
  1036. spin_lock(&pd->cdrw.active_list_lock);
  1037. list_for_each_entry(pkt, &pd->cdrw.pkt_active_list, list) {
  1038. states[pkt->state]++;
  1039. }
  1040. spin_unlock(&pd->cdrw.active_list_lock);
  1041. }
  1042. /*
  1043.  * kcdrwd is woken up when writes have been queued for one of our
  1044.  * registered devices
  1045.  */
  1046. static int kcdrwd(void *foobar)
  1047. {
  1048. struct pktcdvd_device *pd = foobar;
  1049. struct packet_data *pkt;
  1050. long min_sleep_time, residue;
  1051. set_user_nice(current, -20);
  1052. for (;;) {
  1053. DECLARE_WAITQUEUE(wait, current);
  1054. /*
  1055.  * Wait until there is something to do
  1056.  */
  1057. add_wait_queue(&pd->wqueue, &wait);
  1058. for (;;) {
  1059. set_current_state(TASK_INTERRUPTIBLE);
  1060. /* Check if we need to run pkt_handle_queue */
  1061. if (atomic_read(&pd->scan_queue) > 0)
  1062. goto work_to_do;
  1063. /* Check if we need to run the state machine for some packet */
  1064. list_for_each_entry(pkt, &pd->cdrw.pkt_active_list, list) {
  1065. if (atomic_read(&pkt->run_sm) > 0)
  1066. goto work_to_do;
  1067. }
  1068. /* Check if we need to process the iosched queues */
  1069. if (atomic_read(&pd->iosched.attention) != 0)
  1070. goto work_to_do;
  1071. /* Otherwise, go to sleep */
  1072. if (PACKET_DEBUG > 1) {
  1073. int states[PACKET_NUM_STATES];
  1074. pkt_count_states(pd, states);
  1075. VPRINTK("kcdrwd: i:%d ow:%d rw:%d ww:%d rec:%d fin:%dn",
  1076. states[0], states[1], states[2], states[3],
  1077. states[4], states[5]);
  1078. }
  1079. min_sleep_time = MAX_SCHEDULE_TIMEOUT;
  1080. list_for_each_entry(pkt, &pd->cdrw.pkt_active_list, list) {
  1081. if (pkt->sleep_time && pkt->sleep_time < min_sleep_time)
  1082. min_sleep_time = pkt->sleep_time;
  1083. }
  1084. generic_unplug_device(bdev_get_queue(pd->bdev));
  1085. VPRINTK("kcdrwd: sleepingn");
  1086. residue = schedule_timeout(min_sleep_time);
  1087. VPRINTK("kcdrwd: wake upn");
  1088. /* make swsusp happy with our thread */
  1089. try_to_freeze();
  1090. list_for_each_entry(pkt, &pd->cdrw.pkt_active_list, list) {
  1091. if (!pkt->sleep_time)
  1092. continue;
  1093. pkt->sleep_time -= min_sleep_time - residue;
  1094. if (pkt->sleep_time <= 0) {
  1095. pkt->sleep_time = 0;
  1096. atomic_inc(&pkt->run_sm);
  1097. }
  1098. }
  1099. if (signal_pending(current)) {
  1100. flush_signals(current);
  1101. }
  1102. if (kthread_should_stop())
  1103. break;
  1104. }
  1105. work_to_do:
  1106. set_current_state(TASK_RUNNING);
  1107. remove_wait_queue(&pd->wqueue, &wait);
  1108. if (kthread_should_stop())
  1109. break;
  1110. /*
  1111.  * if pkt_handle_queue returns true, we can queue
  1112.  * another request.
  1113.  */
  1114. while (pkt_handle_queue(pd))
  1115. ;
  1116. /*
  1117.  * Handle packet state machine
  1118.  */
  1119. pkt_handle_packets(pd);
  1120. /*
  1121.  * Handle iosched queues
  1122.  */
  1123. pkt_iosched_process_queue(pd);
  1124. }
  1125. return 0;
  1126. }
  1127. static void pkt_print_settings(struct pktcdvd_device *pd)
  1128. {
  1129. printk("pktcdvd: %s packets, ", pd->settings.fp ? "Fixed" : "Variable");
  1130. printk("%u blocks, ", pd->settings.size >> 2);
  1131. printk("Mode-%c discn", pd->settings.block_mode == 8 ? '1' : '2');
  1132. }
  1133. static int pkt_mode_sense(struct pktcdvd_device *pd, struct packet_command *cgc, int page_code, int page_control)
  1134. {
  1135. memset(cgc->cmd, 0, sizeof(cgc->cmd));
  1136. cgc->cmd[0] = GPCMD_MODE_SENSE_10;
  1137. cgc->cmd[2] = page_code | (page_control << 6);
  1138. cgc->cmd[7] = cgc->buflen >> 8;
  1139. cgc->cmd[8] = cgc->buflen & 0xff;
  1140. cgc->data_direction = CGC_DATA_READ;
  1141. return pkt_generic_packet(pd, cgc);
  1142. }
  1143. static int pkt_mode_select(struct pktcdvd_device *pd, struct packet_command *cgc)
  1144. {
  1145. memset(cgc->cmd, 0, sizeof(cgc->cmd));
  1146. memset(cgc->buffer, 0, 2);
  1147. cgc->cmd[0] = GPCMD_MODE_SELECT_10;
  1148. cgc->cmd[1] = 0x10; /* PF */
  1149. cgc->cmd[7] = cgc->buflen >> 8;
  1150. cgc->cmd[8] = cgc->buflen & 0xff;
  1151. cgc->data_direction = CGC_DATA_WRITE;
  1152. return pkt_generic_packet(pd, cgc);
  1153. }
  1154. static int pkt_get_disc_info(struct pktcdvd_device *pd, disc_information *di)
  1155. {
  1156. struct packet_command cgc;
  1157. int ret;
  1158. /* set up command and get the disc info */
  1159. init_cdrom_command(&cgc, di, sizeof(*di), CGC_DATA_READ);
  1160. cgc.cmd[0] = GPCMD_READ_DISC_INFO;
  1161. cgc.cmd[8] = cgc.buflen = 2;
  1162. cgc.quiet = 1;
  1163. if ((ret = pkt_generic_packet(pd, &cgc)))
  1164. return ret;
  1165. /* not all drives have the same disc_info length, so requeue
  1166.  * packet with the length the drive tells us it can supply
  1167.  */
  1168. cgc.buflen = be16_to_cpu(di->disc_information_length) +
  1169.      sizeof(di->disc_information_length);
  1170. if (cgc.buflen > sizeof(disc_information))
  1171. cgc.buflen = sizeof(disc_information);
  1172. cgc.cmd[8] = cgc.buflen;
  1173. return pkt_generic_packet(pd, &cgc);
  1174. }
  1175. static int pkt_get_track_info(struct pktcdvd_device *pd, __u16 track, __u8 type, track_information *ti)
  1176. {
  1177. struct packet_command cgc;
  1178. int ret;
  1179. init_cdrom_command(&cgc, ti, 8, CGC_DATA_READ);
  1180. cgc.cmd[0] = GPCMD_READ_TRACK_RZONE_INFO;
  1181. cgc.cmd[1] = type & 3;
  1182. cgc.cmd[4] = (track & 0xff00) >> 8;
  1183. cgc.cmd[5] = track & 0xff;
  1184. cgc.cmd[8] = 8;
  1185. cgc.quiet = 1;
  1186. if ((ret = pkt_generic_packet(pd, &cgc)))
  1187. return ret;
  1188. cgc.buflen = be16_to_cpu(ti->track_information_length) +
  1189.      sizeof(ti->track_information_length);
  1190. if (cgc.buflen > sizeof(track_information))
  1191. cgc.buflen = sizeof(track_information);
  1192. cgc.cmd[8] = cgc.buflen;
  1193. return pkt_generic_packet(pd, &cgc);
  1194. }
  1195. static int pkt_get_last_written(struct pktcdvd_device *pd, long *last_written)
  1196. {
  1197. disc_information di;
  1198. track_information ti;
  1199. __u32 last_track;
  1200. int ret = -1;
  1201. if ((ret = pkt_get_disc_info(pd, &di)))
  1202. return ret;
  1203. last_track = (di.last_track_msb << 8) | di.last_track_lsb;
  1204. if ((ret = pkt_get_track_info(pd, last_track, 1, &ti)))
  1205. return ret;
  1206. /* if this track is blank, try the previous. */
  1207. if (ti.blank) {
  1208. last_track--;
  1209. if ((ret = pkt_get_track_info(pd, last_track, 1, &ti)))
  1210. return ret;
  1211. }
  1212. /* if last recorded field is valid, return it. */
  1213. if (ti.lra_v) {
  1214. *last_written = be32_to_cpu(ti.last_rec_address);
  1215. } else {
  1216. /* make it up instead */
  1217. *last_written = be32_to_cpu(ti.track_start) +
  1218. be32_to_cpu(ti.track_size);
  1219. if (ti.free_blocks)
  1220. *last_written -= (be32_to_cpu(ti.free_blocks) + 7);
  1221. }
  1222. return 0;
  1223. }
  1224. /*
  1225.  * write mode select package based on pd->settings
  1226.  */
  1227. static int pkt_set_write_settings(struct pktcdvd_device *pd)
  1228. {
  1229. struct packet_command cgc;
  1230. struct request_sense sense;
  1231. write_param_page *wp;
  1232. char buffer[128];
  1233. int ret, size;
  1234. /* doesn't apply to DVD+RW or DVD-RAM */
  1235. if ((pd->mmc3_profile == 0x1a) || (pd->mmc3_profile == 0x12))
  1236. return 0;
  1237. memset(buffer, 0, sizeof(buffer));
  1238. init_cdrom_command(&cgc, buffer, sizeof(*wp), CGC_DATA_READ);
  1239. cgc.sense = &sense;
  1240. if ((ret = pkt_mode_sense(pd, &cgc, GPMODE_WRITE_PARMS_PAGE, 0))) {
  1241. pkt_dump_sense(&cgc);
  1242. return ret;
  1243. }
  1244. size = 2 + ((buffer[0] << 8) | (buffer[1] & 0xff));
  1245. pd->mode_offset = (buffer[6] << 8) | (buffer[7] & 0xff);
  1246. if (size > sizeof(buffer))
  1247. size = sizeof(buffer);
  1248. /*
  1249.  * now get it all
  1250.  */
  1251. init_cdrom_command(&cgc, buffer, size, CGC_DATA_READ);
  1252. cgc.sense = &sense;
  1253. if ((ret = pkt_mode_sense(pd, &cgc, GPMODE_WRITE_PARMS_PAGE, 0))) {
  1254. pkt_dump_sense(&cgc);
  1255. return ret;
  1256. }
  1257. /*
  1258.  * write page is offset header + block descriptor length
  1259.  */
  1260. wp = (write_param_page *) &buffer[sizeof(struct mode_page_header) + pd->mode_offset];
  1261. wp->fp = pd->settings.fp;
  1262. wp->track_mode = pd->settings.track_mode;
  1263. wp->write_type = pd->settings.write_type;
  1264. wp->data_block_type = pd->settings.block_mode;
  1265. wp->multi_session = 0;
  1266. #ifdef PACKET_USE_LS
  1267. wp->link_size = 7;
  1268. wp->ls_v = 1;
  1269. #endif
  1270. if (wp->data_block_type == PACKET_BLOCK_MODE1) {
  1271. wp->session_format = 0;
  1272. wp->subhdr2 = 0x20;
  1273. } else if (wp->data_block_type == PACKET_BLOCK_MODE2) {
  1274. wp->session_format = 0x20;
  1275. wp->subhdr2 = 8;
  1276. #if 0
  1277. wp->mcn[0] = 0x80;
  1278. memcpy(&wp->mcn[1], PACKET_MCN, sizeof(wp->mcn) - 1);
  1279. #endif
  1280. } else {
  1281. /*
  1282.  * paranoia
  1283.  */
  1284. printk("pktcdvd: write mode wrong %dn", wp->data_block_type);
  1285. return 1;
  1286. }
  1287. wp->packet_size = cpu_to_be32(pd->settings.size >> 2);
  1288. cgc.buflen = cgc.cmd[8] = size;
  1289. if ((ret = pkt_mode_select(pd, &cgc))) {
  1290. pkt_dump_sense(&cgc);
  1291. return ret;
  1292. }
  1293. pkt_print_settings(pd);
  1294. return 0;
  1295. }
  1296. /*
  1297.  * 0 -- we can write to this track, 1 -- we can't
  1298.  */
  1299. static int pkt_good_track(track_information *ti)
  1300. {
  1301. /*
  1302.  * only good for CD-RW at the moment, not DVD-RW
  1303.  */
  1304. /*
  1305.  * FIXME: only for FP
  1306.  */
  1307. if (ti->fp == 0)
  1308. return 0;
  1309. /*
  1310.  * "good" settings as per Mt Fuji.
  1311.  */
  1312. if (ti->rt == 0 && ti->blank == 0 && ti->packet == 1)
  1313. return 0;
  1314. if (ti->rt == 0 && ti->blank == 1 && ti->packet == 1)
  1315. return 0;
  1316. if (ti->rt == 1 && ti->blank == 0 && ti->packet == 1)
  1317. return 0;
  1318. printk("pktcdvd: bad state %d-%d-%dn", ti->rt, ti->blank, ti->packet);
  1319. return 1;
  1320. }
  1321. /*
  1322.  * 0 -- we can write to this disc, 1 -- we can't
  1323.  */
  1324. static int pkt_good_disc(struct pktcdvd_device *pd, disc_information *di)
  1325. {
  1326. switch (pd->mmc3_profile) {
  1327. case 0x0a: /* CD-RW */
  1328. case 0xffff: /* MMC3 not supported */
  1329. break;
  1330. case 0x1a: /* DVD+RW */
  1331. case 0x13: /* DVD-RW */
  1332. case 0x12: /* DVD-RAM */
  1333. return 0;
  1334. default:
  1335. printk("pktcdvd: Wrong disc profile (%x)n", pd->mmc3_profile);
  1336. return 1;
  1337. }
  1338. /*
  1339.  * for disc type 0xff we should probably reserve a new track.
  1340.  * but i'm not sure, should we leave this to user apps? probably.
  1341.  */
  1342. if (di->disc_type == 0xff) {
  1343. printk("pktcdvd: Unknown disc. No track?n");
  1344. return 1;
  1345. }
  1346. if (di->disc_type != 0x20 && di->disc_type != 0) {
  1347. printk("pktcdvd: Wrong disc type (%x)n", di->disc_type);
  1348. return 1;
  1349. }
  1350. if (di->erasable == 0) {
  1351. printk("pktcdvd: Disc not erasablen");
  1352. return 1;
  1353. }
  1354. if (di->border_status == PACKET_SESSION_RESERVED) {
  1355. printk("pktcdvd: Can't write to last track (reserved)n");
  1356. return 1;
  1357. }
  1358. return 0;
  1359. }
  1360. static int pkt_probe_settings(struct pktcdvd_device *pd)
  1361. {
  1362. struct packet_command cgc;
  1363. unsigned char buf[12];
  1364. disc_information di;
  1365. track_information ti;
  1366. int ret, track;
  1367. init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_READ);
  1368. cgc.cmd[0] = GPCMD_GET_CONFIGURATION;
  1369. cgc.cmd[8] = 8;
  1370. ret = pkt_generic_packet(pd, &cgc);
  1371. pd->mmc3_profile = ret ? 0xffff : buf[6] << 8 | buf[7];
  1372. memset(&di, 0, sizeof(disc_information));
  1373. memset(&ti, 0, sizeof(track_information));
  1374. if ((ret = pkt_get_disc_info(pd, &di))) {
  1375. printk("failed get_discn");
  1376. return ret;
  1377. }
  1378. if (pkt_good_disc(pd, &di))
  1379. return -ENXIO;
  1380. switch (pd->mmc3_profile) {
  1381. case 0x1a: /* DVD+RW */
  1382. printk("pktcdvd: inserted media is DVD+RWn");
  1383. break;
  1384. case 0x13: /* DVD-RW */
  1385. printk("pktcdvd: inserted media is DVD-RWn");
  1386. break;
  1387. case 0x12: /* DVD-RAM */
  1388. printk("pktcdvd: inserted media is DVD-RAMn");
  1389. break;
  1390. default:
  1391. printk("pktcdvd: inserted media is CD-R%sn", di.erasable ? "W" : "");
  1392. break;
  1393. }
  1394. pd->type = di.erasable ? PACKET_CDRW : PACKET_CDR;
  1395. track = 1; /* (di.last_track_msb << 8) | di.last_track_lsb; */
  1396. if ((ret = pkt_get_track_info(pd, track, 1, &ti))) {
  1397. printk("pktcdvd: failed get_trackn");
  1398. return ret;
  1399. }
  1400. if (pkt_good_track(&ti)) {
  1401. printk("pktcdvd: can't write to this trackn");
  1402. return -ENXIO;
  1403. }
  1404. /*
  1405.  * we keep packet size in 512 byte units, makes it easier to
  1406.  * deal with request calculations.
  1407.  */
  1408. pd->settings.size = be32_to_cpu(ti.fixed_packet_size) << 2;
  1409. if (pd->settings.size == 0) {
  1410. printk("pktcdvd: detected zero packet size!n");
  1411. pd->settings.size = 128;
  1412. }
  1413. if (pd->settings.size > PACKET_MAX_SECTORS) {
  1414. printk("pktcdvd: packet size is too bign");
  1415. return -ENXIO;
  1416. }
  1417. pd->settings.fp = ti.fp;
  1418. pd->offset = (be32_to_cpu(ti.track_start) << 2) & (pd->settings.size - 1);
  1419. if (ti.nwa_v) {
  1420. pd->nwa = be32_to_cpu(ti.next_writable);
  1421. set_bit(PACKET_NWA_VALID, &pd->flags);
  1422. }
  1423. /*
  1424.  * in theory we could use lra on -RW media as well and just zero
  1425.  * blocks that haven't been written yet, but in practice that
  1426.  * is just a no-go. we'll use that for -R, naturally.
  1427.  */
  1428. if (ti.lra_v) {
  1429. pd->lra = be32_to_cpu(ti.last_rec_address);
  1430. set_bit(PACKET_LRA_VALID, &pd->flags);
  1431. } else {
  1432. pd->lra = 0xffffffff;
  1433. set_bit(PACKET_LRA_VALID, &pd->flags);
  1434. }
  1435. /*
  1436.  * fine for now
  1437.  */
  1438. pd->settings.link_loss = 7;
  1439. pd->settings.write_type = 0; /* packet */
  1440. pd->settings.track_mode = ti.track_mode;
  1441. /*
  1442.  * mode1 or mode2 disc
  1443.  */
  1444. switch (ti.data_mode) {
  1445. case PACKET_MODE1:
  1446. pd->settings.block_mode = PACKET_BLOCK_MODE1;
  1447. break;
  1448. case PACKET_MODE2:
  1449. pd->settings.block_mode = PACKET_BLOCK_MODE2;
  1450. break;
  1451. default:
  1452. printk("pktcdvd: unknown data moden");
  1453. return 1;
  1454. }
  1455. return 0;
  1456. }
  1457. /*
  1458.  * enable/disable write caching on drive
  1459.  */
  1460. static int pkt_write_caching(struct pktcdvd_device *pd, int set)
  1461. {
  1462. struct packet_command cgc;
  1463. struct request_sense sense;
  1464. unsigned char buf[64];
  1465. int ret;
  1466. memset(buf, 0, sizeof(buf));
  1467. init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_READ);
  1468. cgc.sense = &sense;
  1469. cgc.buflen = pd->mode_offset + 12;
  1470. /*
  1471.  * caching mode page might not be there, so quiet this command
  1472.  */
  1473. cgc.quiet = 1;
  1474. if ((ret = pkt_mode_sense(pd, &cgc, GPMODE_WCACHING_PAGE, 0)))
  1475. return ret;
  1476. buf[pd->mode_offset + 10] |= (!!set << 2);
  1477. cgc.buflen = cgc.cmd[8] = 2 + ((buf[0] << 8) | (buf[1] & 0xff));
  1478. ret = pkt_mode_select(pd, &cgc);
  1479. if (ret) {
  1480. printk("pktcdvd: write caching control failedn");
  1481. pkt_dump_sense(&cgc);
  1482. } else if (!ret && set)
  1483. printk("pktcdvd: enabled write caching on %sn", pd->name);
  1484. return ret;
  1485. }
  1486. static int pkt_lock_door(struct pktcdvd_device *pd, int lockflag)
  1487. {
  1488. struct packet_command cgc;
  1489. init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
  1490. cgc.cmd[0] = GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL;
  1491. cgc.cmd[4] = lockflag ? 1 : 0;
  1492. return pkt_generic_packet(pd, &cgc);
  1493. }
  1494. /*
  1495.  * Returns drive maximum write speed
  1496.  */
  1497. static int pkt_get_max_speed(struct pktcdvd_device *pd, unsigned *write_speed)
  1498. {
  1499. struct packet_command cgc;
  1500. struct request_sense sense;
  1501. unsigned char buf[256+18];
  1502. unsigned char *cap_buf;
  1503. int ret, offset;
  1504. memset(buf, 0, sizeof(buf));
  1505. cap_buf = &buf[sizeof(struct mode_page_header) + pd->mode_offset];
  1506. init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_UNKNOWN);
  1507. cgc.sense = &sense;
  1508. ret = pkt_mode_sense(pd, &cgc, GPMODE_CAPABILITIES_PAGE, 0);
  1509. if (ret) {
  1510. cgc.buflen = pd->mode_offset + cap_buf[1] + 2 +
  1511.      sizeof(struct mode_page_header);
  1512. ret = pkt_mode_sense(pd, &cgc, GPMODE_CAPABILITIES_PAGE, 0);
  1513. if (ret) {
  1514. pkt_dump_sense(&cgc);
  1515. return ret;
  1516. }
  1517. }
  1518. offset = 20;     /* Obsoleted field, used by older drives */
  1519. if (cap_buf[1] >= 28)
  1520. offset = 28;     /* Current write speed selected */
  1521. if (cap_buf[1] >= 30) {
  1522. /* If the drive reports at least one "Logical Unit Write
  1523.  * Speed Performance Descriptor Block", use the information
  1524.  * in the first block. (contains the highest speed)
  1525.  */
  1526. int num_spdb = (cap_buf[30] << 8) + cap_buf[31];
  1527. if (num_spdb > 0)
  1528. offset = 34;
  1529. }
  1530. *write_speed = (cap_buf[offset] << 8) | cap_buf[offset + 1];
  1531. return 0;
  1532. }
  1533. /* These tables from cdrecord - I don't have orange book */
  1534. /* standard speed CD-RW (1-4x) */
  1535. static char clv_to_speed[16] = {
  1536. /* 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 */
  1537.    0, 2, 4, 6, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  1538. };
  1539. /* high speed CD-RW (-10x) */
  1540. static char hs_clv_to_speed[16] = {
  1541. /* 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 */
  1542.    0, 2, 4, 6, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  1543. };
  1544. /* ultra high speed CD-RW */
  1545. static char us_clv_to_speed[16] = {
  1546. /* 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 */
  1547.    0, 2, 4, 8, 0, 0,16, 0,24,32,40,48, 0, 0, 0, 0
  1548. };
  1549. /*
  1550.  * reads the maximum media speed from ATIP
  1551.  */
  1552. static int pkt_media_speed(struct pktcdvd_device *pd, unsigned *speed)
  1553. {
  1554. struct packet_command cgc;
  1555. struct request_sense sense;
  1556. unsigned char buf[64];
  1557. unsigned int size, st, sp;
  1558. int ret;
  1559. init_cdrom_command(&cgc, buf, 2, CGC_DATA_READ);
  1560. cgc.sense = &sense;
  1561. cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP;
  1562. cgc.cmd[1] = 2;
  1563. cgc.cmd[2] = 4; /* READ ATIP */
  1564. cgc.cmd[8] = 2;
  1565. ret = pkt_generic_packet(pd, &cgc);
  1566. if (ret) {
  1567. pkt_dump_sense(&cgc);
  1568. return ret;
  1569. }
  1570. size = ((unsigned int) buf[0]<<8) + buf[1] + 2;
  1571. if (size > sizeof(buf))
  1572. size = sizeof(buf);
  1573. init_cdrom_command(&cgc, buf, size, CGC_DATA_READ);
  1574. cgc.sense = &sense;
  1575. cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP;
  1576. cgc.cmd[1] = 2;
  1577. cgc.cmd[2] = 4;
  1578. cgc.cmd[8] = size;
  1579. ret = pkt_generic_packet(pd, &cgc);
  1580. if (ret) {
  1581. pkt_dump_sense(&cgc);
  1582. return ret;
  1583. }
  1584. if (!buf[6] & 0x40) {
  1585. printk("pktcdvd: Disc type is not CD-RWn");
  1586. return 1;
  1587. }
  1588. if (!buf[6] & 0x4) {
  1589. printk("pktcdvd: A1 values on media are not valid, maybe not CDRW?n");
  1590. return 1;
  1591. }
  1592. st = (buf[6] >> 3) & 0x7; /* disc sub-type */
  1593. sp = buf[16] & 0xf; /* max speed from ATIP A1 field */
  1594. /* Info from cdrecord */
  1595. switch (st) {
  1596. case 0: /* standard speed */
  1597. *speed = clv_to_speed[sp];
  1598. break;
  1599. case 1: /* high speed */
  1600. *speed = hs_clv_to_speed[sp];
  1601. break;
  1602. case 2: /* ultra high speed */
  1603. *speed = us_clv_to_speed[sp];
  1604. break;
  1605. default:
  1606. printk("pktcdvd: Unknown disc sub-type %dn",st);
  1607. return 1;
  1608. }
  1609. if (*speed) {
  1610. printk("pktcdvd: Max. media speed: %dn",*speed);
  1611. return 0;
  1612. } else {
  1613. printk("pktcdvd: Unknown speed %d for sub-type %dn",sp,st);
  1614. return 1;
  1615. }
  1616. }
  1617. static int pkt_perform_opc(struct pktcdvd_device *pd)
  1618. {
  1619. struct packet_command cgc;
  1620. struct request_sense sense;
  1621. int ret;
  1622. VPRINTK("pktcdvd: Performing OPCn");
  1623. init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
  1624. cgc.sense = &sense;
  1625. cgc.timeout = 60*HZ;
  1626. cgc.cmd[0] = GPCMD_SEND_OPC;
  1627. cgc.cmd[1] = 1;
  1628. if ((ret = pkt_generic_packet(pd, &cgc)))
  1629. pkt_dump_sense(&cgc);
  1630. return ret;
  1631. }
  1632. static int pkt_open_write(struct pktcdvd_device *pd)
  1633. {
  1634. int ret;
  1635. unsigned int write_speed, media_write_speed, read_speed;
  1636. if ((ret = pkt_probe_settings(pd))) {
  1637. DPRINTK("pktcdvd: %s failed proben", pd->name);
  1638. return -EIO;
  1639. }
  1640. if ((ret = pkt_set_write_settings(pd))) {
  1641. DPRINTK("pktcdvd: %s failed saving write settingsn", pd->name);
  1642. return -EIO;
  1643. }
  1644. pkt_write_caching(pd, USE_WCACHING);
  1645. if ((ret = pkt_get_max_speed(pd, &write_speed)))
  1646. write_speed = 16 * 177;
  1647. switch (pd->mmc3_profile) {
  1648. case 0x13: /* DVD-RW */
  1649. case 0x1a: /* DVD+RW */
  1650. case 0x12: /* DVD-RAM */
  1651. DPRINTK("pktcdvd: write speed %ukB/sn", write_speed);
  1652. break;
  1653. default:
  1654. if ((ret = pkt_media_speed(pd, &media_write_speed)))
  1655. media_write_speed = 16;
  1656. write_speed = min(write_speed, media_write_speed * 177);
  1657. DPRINTK("pktcdvd: write speed %uxn", write_speed / 176);
  1658. break;
  1659. }
  1660. read_speed = write_speed;
  1661. if ((ret = pkt_set_speed(pd, write_speed, read_speed))) {
  1662. DPRINTK("pktcdvd: %s couldn't set write speedn", pd->name);
  1663. return -EIO;
  1664. }
  1665. pd->write_speed = write_speed;
  1666. pd->read_speed = read_speed;
  1667. if ((ret = pkt_perform_opc(pd))) {
  1668. DPRINTK("pktcdvd: %s Optimum Power Calibration failedn", pd->name);
  1669. }
  1670. return 0;
  1671. }
  1672. /*
  1673.  * called at open time.
  1674.  */
  1675. static int pkt_open_dev(struct pktcdvd_device *pd, int write)
  1676. {
  1677. int ret;
  1678. long lba;
  1679. request_queue_t *q;
  1680. /*
  1681.  * We need to re-open the cdrom device without O_NONBLOCK to be able
  1682.  * to read/write from/to it. It is already opened in O_NONBLOCK mode
  1683.  * so bdget() can't fail.
  1684.  */
  1685. bdget(pd->bdev->bd_dev);
  1686. if ((ret = blkdev_get(pd->bdev, FMODE_READ, O_RDONLY)))
  1687. goto out;
  1688. if ((ret = pkt_get_last_written(pd, &lba))) {
  1689. printk("pktcdvd: pkt_get_last_written failedn");
  1690. goto out_putdev;
  1691. }
  1692. set_capacity(pd->disk, lba << 2);
  1693. set_capacity(pd->bdev->bd_disk, lba << 2);
  1694. bd_set_size(pd->bdev, (loff_t)lba << 11);
  1695. q = bdev_get_queue(pd->bdev);
  1696. if (write) {
  1697. if ((ret = pkt_open_write(pd)))
  1698. goto out_putdev;
  1699. /*
  1700.  * Some CDRW drives can not handle writes larger than one packet,
  1701.  * even if the size is a multiple of the packet size.
  1702.  */
  1703. spin_lock_irq(q->queue_lock);
  1704. blk_queue_max_sectors(q, pd->settings.size);
  1705. spin_unlock_irq(q->queue_lock);
  1706. set_bit(PACKET_WRITABLE, &pd->flags);
  1707. } else {
  1708. pkt_set_speed(pd, MAX_SPEED, MAX_SPEED);
  1709. clear_bit(PACKET_WRITABLE, &pd->flags);
  1710. }
  1711. if ((ret = pkt_set_segment_merging(pd, q)))
  1712. goto out_putdev;
  1713. if (write)
  1714. printk("pktcdvd: %lukB available on discn", lba << 1);
  1715. return 0;
  1716. out_putdev:
  1717. blkdev_put(pd->bdev);
  1718. out:
  1719. return ret;
  1720. }
  1721. /*
  1722.  * called when the device is closed. makes sure that the device flushes
  1723.  * the internal cache before we close.
  1724.  */
  1725. static void pkt_release_dev(struct pktcdvd_device *pd, int flush)
  1726. {
  1727. if (flush && pkt_flush_cache(pd))
  1728. DPRINTK("pktcdvd: %s not flushing cachen", pd->name);
  1729. pkt_lock_door(pd, 0);
  1730. pkt_set_speed(pd, MAX_SPEED, MAX_SPEED);
  1731. blkdev_put(pd->bdev);
  1732. }
  1733. static struct pktcdvd_device *pkt_find_dev_from_minor(int dev_minor)
  1734. {
  1735. if (dev_minor >= MAX_WRITERS)
  1736. return NULL;
  1737. return pkt_devs[dev_minor];
  1738. }
  1739. static int pkt_open(struct inode *inode, struct file *file)
  1740. {
  1741. struct pktcdvd_device *pd = NULL;
  1742. int ret;
  1743. VPRINTK("pktcdvd: entering openn");
  1744. down(&ctl_mutex);
  1745. pd = pkt_find_dev_from_minor(iminor(inode));
  1746. if (!pd) {
  1747. ret = -ENODEV;
  1748. goto out;
  1749. }
  1750. BUG_ON(pd->refcnt < 0);
  1751. pd->refcnt++;
  1752. if (pd->refcnt > 1) {
  1753. if ((file->f_mode & FMODE_WRITE) &&
  1754.     !test_bit(PACKET_WRITABLE, &pd->flags)) {
  1755. ret = -EBUSY;
  1756. goto out_dec;
  1757. }
  1758. } else {
  1759. if (pkt_open_dev(pd, file->f_mode & FMODE_WRITE)) {
  1760. ret = -EIO;
  1761. goto out_dec;
  1762. }
  1763. /*
  1764.  * needed here as well, since ext2 (among others) may change
  1765.  * the blocksize at mount time
  1766.  */
  1767. set_blocksize(inode->i_bdev, CD_FRAMESIZE);
  1768. }
  1769. up(&ctl_mutex);
  1770. return 0;
  1771. out_dec:
  1772. pd->refcnt--;
  1773. out:
  1774. VPRINTK("pktcdvd: failed open (%d)n", ret);
  1775. up(&ctl_mutex);
  1776. return ret;
  1777. }
  1778. static int pkt_close(struct inode *inode, struct file *file)
  1779. {
  1780. struct pktcdvd_device *pd = inode->i_bdev->bd_disk->private_data;
  1781. int ret = 0;
  1782. down(&ctl_mutex);
  1783. pd->refcnt--;
  1784. BUG_ON(pd->refcnt < 0);
  1785. if (pd->refcnt == 0) {
  1786. int flush = test_bit(PACKET_WRITABLE, &pd->flags);
  1787. pkt_release_dev(pd, flush);
  1788. }
  1789. up(&ctl_mutex);
  1790. return ret;
  1791. }
  1792. static void *psd_pool_alloc(gfp_t gfp_mask, void *data)
  1793. {
  1794. return kmalloc(sizeof(struct packet_stacked_data), gfp_mask);
  1795. }
  1796. static void psd_pool_free(void *ptr, void *data)
  1797. {
  1798. kfree(ptr);
  1799. }
  1800. static int pkt_end_io_read_cloned(struct bio *bio, unsigned int bytes_done, int err)
  1801. {
  1802. struct packet_stacked_data *psd = bio->bi_private;
  1803. struct pktcdvd_device *pd = psd->pd;
  1804. if (bio->bi_size)
  1805. return 1;
  1806. bio_put(bio);
  1807. bio_endio(psd->bio, psd->bio->bi_size, err);
  1808. mempool_free(psd, psd_pool);
  1809. pkt_bio_finished(pd);
  1810. return 0;
  1811. }
  1812. static int pkt_make_request(request_queue_t *q, struct bio *bio)
  1813. {
  1814. struct pktcdvd_device *pd;
  1815. char b[BDEVNAME_SIZE];
  1816. sector_t zone;
  1817. struct packet_data *pkt;
  1818. int was_empty, blocked_bio;
  1819. struct pkt_rb_node *node;
  1820. pd = q->queuedata;
  1821. if (!pd) {
  1822. printk("pktcdvd: %s incorrect request queuen", bdevname(bio->bi_bdev, b));
  1823. goto end_io;
  1824. }
  1825. /*
  1826.  * Clone READ bios so we can have our own bi_end_io callback.
  1827.  */
  1828. if (bio_data_dir(bio) == READ) {
  1829. struct bio *cloned_bio = bio_clone(bio, GFP_NOIO);
  1830. struct packet_stacked_data *psd = mempool_alloc(psd_pool, GFP_NOIO);
  1831. psd->pd = pd;
  1832. psd->bio = bio;
  1833. cloned_bio->bi_bdev = pd->bdev;
  1834. cloned_bio->bi_private = psd;
  1835. cloned_bio->bi_end_io = pkt_end_io_read_cloned;
  1836. pd->stats.secs_r += bio->bi_size >> 9;
  1837. pkt_queue_bio(pd, cloned_bio);
  1838. return 0;
  1839. }
  1840. if (!test_bit(PACKET_WRITABLE, &pd->flags)) {
  1841. printk("pktcdvd: WRITE for ro device %s (%llu)n",
  1842. pd->name, (unsigned long long)bio->bi_sector);
  1843. goto end_io;
  1844. }
  1845. if (!bio->bi_size || (bio->bi_size % CD_FRAMESIZE)) {
  1846. printk("pktcdvd: wrong bio sizen");
  1847. goto end_io;
  1848. }
  1849. blk_queue_bounce(q, &bio);
  1850. zone = ZONE(bio->bi_sector, pd);
  1851. VPRINTK("pkt_make_request: start = %6llx stop = %6llxn",
  1852. (unsigned long long)bio->bi_sector,
  1853. (unsigned long long)(bio->bi_sector + bio_sectors(bio)));
  1854. /* Check if we have to split the bio */
  1855. {
  1856. struct bio_pair *bp;
  1857. sector_t last_zone;
  1858. int first_sectors;
  1859. last_zone = ZONE(bio->bi_sector + bio_sectors(bio) - 1, pd);
  1860. if (last_zone != zone) {
  1861. BUG_ON(last_zone != zone + pd->settings.size);
  1862. first_sectors = last_zone - bio->bi_sector;
  1863. bp = bio_split(bio, bio_split_pool, first_sectors);
  1864. BUG_ON(!bp);
  1865. pkt_make_request(q, &bp->bio1);
  1866. pkt_make_request(q, &bp->bio2);
  1867. bio_pair_release(bp);
  1868. return 0;
  1869. }
  1870. }
  1871. /*
  1872.  * If we find a matching packet in state WAITING or READ_WAIT, we can
  1873.  * just append this bio to that packet.
  1874.  */
  1875. spin_lock(&pd->cdrw.active_list_lock);
  1876. blocked_bio = 0;
  1877. list_for_each_entry(pkt, &pd->cdrw.pkt_active_list, list) {
  1878. if (pkt->sector == zone) {
  1879. spin_lock(&pkt->lock);
  1880. if ((pkt->state == PACKET_WAITING_STATE) ||
  1881.     (pkt->state == PACKET_READ_WAIT_STATE)) {
  1882. pkt_add_list_last(bio, &pkt->orig_bios,
  1883.   &pkt->orig_bios_tail);
  1884. pkt->write_size += bio->bi_size / CD_FRAMESIZE;
  1885. if ((pkt->write_size >= pkt->frames) &&
  1886.     (pkt->state == PACKET_WAITING_STATE)) {
  1887. atomic_inc(&pkt->run_sm);
  1888. wake_up(&pd->wqueue);
  1889. }
  1890. spin_unlock(&pkt->lock);
  1891. spin_unlock(&pd->cdrw.active_list_lock);
  1892. return 0;
  1893. } else {
  1894. blocked_bio = 1;
  1895. }
  1896. spin_unlock(&pkt->lock);
  1897. }
  1898. }
  1899. spin_unlock(&pd->cdrw.active_list_lock);
  1900. /*
  1901.  * No matching packet found. Store the bio in the work queue.
  1902.  */
  1903. node = mempool_alloc(pd->rb_pool, GFP_NOIO);
  1904. node->bio = bio;
  1905. spin_lock(&pd->lock);
  1906. BUG_ON(pd->bio_queue_size < 0);
  1907. was_empty = (pd->bio_queue_size == 0);
  1908. pkt_rbtree_insert(pd, node);
  1909. spin_unlock(&pd->lock);
  1910. /*
  1911.  * Wake up the worker thread.
  1912.  */
  1913. atomic_set(&pd->scan_queue, 1);
  1914. if (was_empty) {
  1915. /* This wake_up is required for correct operation */
  1916. wake_up(&pd->wqueue);
  1917. } else if (!list_empty(&pd->cdrw.pkt_free_list) && !blocked_bio) {
  1918. /*
  1919.  * This wake up is not required for correct operation,
  1920.  * but improves performance in some cases.
  1921.  */
  1922. wake_up(&pd->wqueue);
  1923. }
  1924. return 0;
  1925. end_io:
  1926. bio_io_error(bio, bio->bi_size);
  1927. return 0;
  1928. }
  1929. static int pkt_merge_bvec(request_queue_t *q, struct bio *bio, struct bio_vec *bvec)
  1930. {
  1931. struct pktcdvd_device *pd = q->queuedata;
  1932. sector_t zone = ZONE(bio->bi_sector, pd);
  1933. int used = ((bio->bi_sector - zone) << 9) + bio->bi_size;
  1934. int remaining = (pd->settings.size << 9) - used;
  1935. int remaining2;
  1936. /*
  1937.  * A bio <= PAGE_SIZE must be allowed. If it crosses a packet
  1938.  * boundary, pkt_make_request() will split the bio.
  1939.  */
  1940. remaining2 = PAGE_SIZE - bio->bi_size;
  1941. remaining = max(remaining, remaining2);
  1942. BUG_ON(remaining < 0);
  1943. return remaining;
  1944. }
  1945. static void pkt_init_queue(struct pktcdvd_device *pd)
  1946. {
  1947. request_queue_t *q = pd->disk->queue;
  1948. blk_queue_make_request(q, pkt_make_request);
  1949. blk_queue_hardsect_size(q, CD_FRAMESIZE);
  1950. blk_queue_max_sectors(q, PACKET_MAX_SECTORS);
  1951. blk_queue_merge_bvec(q, pkt_merge_bvec);
  1952. q->queuedata = pd;
  1953. }
  1954. static int pkt_seq_show(struct seq_file *m, void *p)
  1955. {
  1956. struct pktcdvd_device *pd = m->private;
  1957. char *msg;
  1958. char bdev_buf[BDEVNAME_SIZE];
  1959. int states[PACKET_NUM_STATES];
  1960. seq_printf(m, "Writer %s mapped to %s:n", pd->name,
  1961.    bdevname(pd->bdev, bdev_buf));
  1962. seq_printf(m, "nSettings:n");
  1963. seq_printf(m, "tpacket size:tt%dkBn", pd->settings.size / 2);
  1964. if (pd->settings.write_type == 0)
  1965. msg = "Packet";
  1966. else
  1967. msg = "Unknown";
  1968. seq_printf(m, "twrite type:tt%sn", msg);
  1969. seq_printf(m, "tpacket type:tt%sn", pd->settings.fp ? "Fixed" : "Variable");
  1970. seq_printf(m, "tlink loss:tt%dn", pd->settings.link_loss);
  1971. seq_printf(m, "ttrack mode:tt%dn", pd->settings.track_mode);
  1972. if (pd->settings.block_mode == PACKET_BLOCK_MODE1)
  1973. msg = "Mode 1";
  1974. else if (pd->settings.block_mode == PACKET_BLOCK_MODE2)
  1975. msg = "Mode 2";
  1976. else
  1977. msg = "Unknown";
  1978. seq_printf(m, "tblock mode:tt%sn", msg);
  1979. seq_printf(m, "nStatistics:n");
  1980. seq_printf(m, "tpackets started:t%lun", pd->stats.pkt_started);
  1981. seq_printf(m, "tpackets ended:tt%lun", pd->stats.pkt_ended);
  1982. seq_printf(m, "twritten:tt%lukBn", pd->stats.secs_w >> 1);
  1983. seq_printf(m, "tread gather:tt%lukBn", pd->stats.secs_rg >> 1);
  1984. seq_printf(m, "tread:ttt%lukBn", pd->stats.secs_r >> 1);
  1985. seq_printf(m, "nMisc:n");
  1986. seq_printf(m, "treference count:t%dn", pd->refcnt);
  1987. seq_printf(m, "tflags:ttt0x%lxn", pd->flags);
  1988. seq_printf(m, "tread speed:tt%ukB/sn", pd->read_speed);
  1989. seq_printf(m, "twrite speed:tt%ukB/sn", pd->write_speed);
  1990. seq_printf(m, "tstart offset:tt%lun", pd->offset);
  1991. seq_printf(m, "tmode page offset:t%un", pd->mode_offset);
  1992. seq_printf(m, "nQueue state:n");
  1993. seq_printf(m, "tbios queued:tt%dn", pd->bio_queue_size);
  1994. seq_printf(m, "tbios pending:tt%dn", atomic_read(&pd->cdrw.pending_bios));
  1995. seq_printf(m, "tcurrent sector:tt0x%llxn", (unsigned long long)pd->current_sector);
  1996. pkt_count_states(pd, states);
  1997. seq_printf(m, "tstate:ttti:%d ow:%d rw:%d ww:%d rec:%d fin:%dn",
  1998.    states[0], states[1], states[2], states[3], states[4], states[5]);
  1999. return 0;
  2000. }
  2001. static int pkt_seq_open(struct inode *inode, struct file *file)
  2002. {
  2003. return single_open(file, pkt_seq_show, PDE(inode)->data);
  2004. }
  2005. static struct file_operations pkt_proc_fops = {
  2006. .open = pkt_seq_open,
  2007. .read = seq_read,
  2008. .llseek = seq_lseek,
  2009. .release = single_release
  2010. };
  2011. static int pkt_new_dev(struct pktcdvd_device *pd, dev_t dev)
  2012. {
  2013. int i;
  2014. int ret = 0;
  2015. char b[BDEVNAME_SIZE];
  2016. struct proc_dir_entry *proc;
  2017. struct block_device *bdev;
  2018. if (pd->pkt_dev == dev) {
  2019. printk("pktcdvd: Recursive setup not allowedn");
  2020. return -EBUSY;
  2021. }
  2022. for (i = 0; i < MAX_WRITERS; i++) {
  2023. struct pktcdvd_device *pd2 = pkt_devs[i];
  2024. if (!pd2)
  2025. continue;
  2026. if (pd2->bdev->bd_dev == dev) {
  2027. printk("pktcdvd: %s already setupn", bdevname(pd2->bdev, b));
  2028. return -EBUSY;
  2029. }
  2030. if (pd2->pkt_dev == dev) {
  2031. printk("pktcdvd: Can't chain pktcdvd devicesn");
  2032. return -EBUSY;
  2033. }
  2034. }
  2035. bdev = bdget(dev);
  2036. if (!bdev)
  2037. return -ENOMEM;
  2038. ret = blkdev_get(bdev, FMODE_READ, O_RDONLY | O_NONBLOCK);
  2039. if (ret)
  2040. return ret;
  2041. /* This is safe, since we have a reference from open(). */
  2042. __module_get(THIS_MODULE);
  2043. if (!pkt_grow_pktlist(pd, CONFIG_CDROM_PKTCDVD_BUFFERS)) {
  2044. printk("pktcdvd: not enough memory for buffersn");
  2045. ret = -ENOMEM;
  2046. goto out_mem;
  2047. }
  2048. pd->bdev = bdev;
  2049. set_blocksize(bdev, CD_FRAMESIZE);
  2050. pkt_init_queue(pd);
  2051. atomic_set(&pd->cdrw.pending_bios, 0);
  2052. pd->cdrw.thread = kthread_run(kcdrwd, pd, "%s", pd->name);
  2053. if (IS_ERR(pd->cdrw.thread)) {
  2054. printk("pktcdvd: can't start kernel threadn");
  2055. ret = -ENOMEM;
  2056. goto out_thread;
  2057. }
  2058. proc = create_proc_entry(pd->name, 0, pkt_proc);
  2059. if (proc) {
  2060. proc->data = pd;
  2061. proc->proc_fops = &pkt_proc_fops;
  2062. }
  2063. DPRINTK("pktcdvd: writer %s mapped to %sn", pd->name, bdevname(bdev, b));
  2064. return 0;
  2065. out_thread:
  2066. pkt_shrink_pktlist(pd);
  2067. out_mem:
  2068. blkdev_put(bdev);
  2069. /* This is safe: open() is still holding a reference. */
  2070. module_put(THIS_MODULE);
  2071. return ret;
  2072. }
  2073. static int pkt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
  2074. {
  2075. struct pktcdvd_device *pd = inode->i_bdev->bd_disk->private_data;
  2076. VPRINTK("pkt_ioctl: cmd %x, dev %d:%dn", cmd, imajor(inode), iminor(inode));
  2077. switch (cmd) {
  2078. /*
  2079.  * forward selected CDROM ioctls to CD-ROM, for UDF
  2080.  */
  2081. case CDROMMULTISESSION:
  2082. case CDROMREADTOCENTRY:
  2083. case CDROM_LAST_WRITTEN:
  2084. case CDROM_SEND_PACKET:
  2085. case SCSI_IOCTL_SEND_COMMAND:
  2086. return blkdev_ioctl(pd->bdev->bd_inode, file, cmd, arg);
  2087. case CDROMEJECT:
  2088. /*
  2089.  * The door gets locked when the device is opened, so we
  2090.  * have to unlock it or else the eject command fails.
  2091.  */
  2092. pkt_lock_door(pd, 0);
  2093. return blkdev_ioctl(pd->bdev->bd_inode, file, cmd, arg);
  2094. default:
  2095. printk("pktcdvd: Unknown ioctl for %s (%x)n", pd->name, cmd);
  2096. return -ENOTTY;
  2097. }
  2098. return 0;
  2099. }
  2100. static int pkt_media_changed(struct gendisk *disk)
  2101. {
  2102. struct pktcdvd_device *pd = disk->private_data;
  2103. struct gendisk *attached_disk;
  2104. if (!pd)
  2105. return 0;
  2106. if (!pd->bdev)
  2107. return 0;
  2108. attached_disk = pd->bdev->bd_disk;
  2109. if (!attached_disk)
  2110. return 0;
  2111. return attached_disk->fops->media_changed(attached_disk);
  2112. }
  2113. static struct block_device_operations pktcdvd_ops = {
  2114. .owner = THIS_MODULE,
  2115. .open = pkt_open,
  2116. .release = pkt_close,
  2117. .ioctl = pkt_ioctl,
  2118. .media_changed = pkt_media_changed,
  2119. };
  2120. /*
  2121.  * Set up mapping from pktcdvd device to CD-ROM device.
  2122.  */
  2123. static int pkt_setup_dev(struct pkt_ctrl_command *ctrl_cmd)
  2124. {
  2125. int idx;
  2126. int ret = -ENOMEM;
  2127. struct pktcdvd_device *pd;
  2128. struct gendisk *disk;
  2129. dev_t dev = new_decode_dev(ctrl_cmd->dev);
  2130. for (idx = 0; idx < MAX_WRITERS; idx++)
  2131. if (!pkt_devs[idx])
  2132. break;
  2133. if (idx == MAX_WRITERS) {
  2134. printk("pktcdvd: max %d writers supportedn", MAX_WRITERS);
  2135. return -EBUSY;
  2136. }
  2137. pd = kzalloc(sizeof(struct pktcdvd_device), GFP_KERNEL);
  2138. if (!pd)
  2139. return ret;
  2140. pd->rb_pool = mempool_create(PKT_RB_POOL_SIZE, pkt_rb_alloc, pkt_rb_free, NULL);
  2141. if (!pd->rb_pool)
  2142. goto out_mem;
  2143. disk = alloc_disk(1);
  2144. if (!disk)
  2145. goto out_mem;
  2146. pd->disk = disk;
  2147. spin_lock_init(&pd->lock);
  2148. spin_lock_init(&pd->iosched.lock);
  2149. sprintf(pd->name, "pktcdvd%d", idx);
  2150. init_waitqueue_head(&pd->wqueue);
  2151. pd->bio_queue = RB_ROOT;
  2152. disk->major = pkt_major;
  2153. disk->first_minor = idx;
  2154. disk->fops = &pktcdvd_ops;
  2155. disk->flags = GENHD_FL_REMOVABLE;
  2156. sprintf(disk->disk_name, "pktcdvd%d", idx);
  2157. disk->private_data = pd;
  2158. disk->queue = blk_alloc_queue(GFP_KERNEL);
  2159. if (!disk->queue)
  2160. goto out_mem2;
  2161. pd->pkt_dev = MKDEV(disk->major, disk->first_minor);
  2162. ret = pkt_new_dev(pd, dev);
  2163. if (ret)
  2164. goto out_new_dev;
  2165. add_disk(disk);
  2166. pkt_devs[idx] = pd;
  2167. ctrl_cmd->pkt_dev = new_encode_dev(pd->pkt_dev);
  2168. return 0;
  2169. out_new_dev:
  2170. blk_put_queue(disk->queue);
  2171. out_mem2:
  2172. put_disk(disk);
  2173. out_mem:
  2174. if (pd->rb_pool)
  2175. mempool_destroy(pd->rb_pool);
  2176. kfree(pd);
  2177. return ret;
  2178. }
  2179. /*
  2180.  * Tear down mapping from pktcdvd device to CD-ROM device.
  2181.  */
  2182. static int pkt_remove_dev(struct pkt_ctrl_command *ctrl_cmd)
  2183. {
  2184. struct pktcdvd_device *pd;
  2185. int idx;
  2186. dev_t pkt_dev = new_decode_dev(ctrl_cmd->pkt_dev);
  2187. for (idx = 0; idx < MAX_WRITERS; idx++) {
  2188. pd = pkt_devs[idx];
  2189. if (pd && (pd->pkt_dev == pkt_dev))
  2190. break;
  2191. }
  2192. if (idx == MAX_WRITERS) {
  2193. DPRINTK("pktcdvd: dev not setupn");
  2194. return -ENXIO;
  2195. }
  2196. if (pd->refcnt > 0)
  2197. return -EBUSY;
  2198. if (!IS_ERR(pd->cdrw.thread))
  2199. kthread_stop(pd->cdrw.thread);
  2200. blkdev_put(pd->bdev);
  2201. pkt_shrink_pktlist(pd);
  2202. remove_proc_entry(pd->name, pkt_proc);
  2203. DPRINTK("pktcdvd: writer %s unmappedn", pd->name);
  2204. del_gendisk(pd->disk);
  2205. blk_put_queue(pd->disk->queue);
  2206. put_disk(pd->disk);
  2207. pkt_devs[idx] = NULL;
  2208. mempool_destroy(pd->rb_pool);
  2209. kfree(pd);
  2210. /* This is safe: open() is still holding a reference. */
  2211. module_put(THIS_MODULE);
  2212. return 0;
  2213. }
  2214. static void pkt_get_status(struct pkt_ctrl_command *ctrl_cmd)
  2215. {
  2216. struct pktcdvd_device *pd = pkt_find_dev_from_minor(ctrl_cmd->dev_index);
  2217. if (pd) {
  2218. ctrl_cmd->dev = new_encode_dev(pd->bdev->bd_dev);
  2219. ctrl_cmd->pkt_dev = new_encode_dev(pd->pkt_dev);
  2220. } else {
  2221. ctrl_cmd->dev = 0;
  2222. ctrl_cmd->pkt_dev = 0;
  2223. }
  2224. ctrl_cmd->num_devices = MAX_WRITERS;
  2225. }
  2226. static int pkt_ctl_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
  2227. {
  2228. void __user *argp = (void __user *)arg;
  2229. struct pkt_ctrl_command ctrl_cmd;
  2230. int ret = 0;
  2231. if (cmd != PACKET_CTRL_CMD)
  2232. return -ENOTTY;
  2233. if (copy_from_user(&ctrl_cmd, argp, sizeof(struct pkt_ctrl_command)))
  2234. return -EFAULT;
  2235. switch (ctrl_cmd.command) {
  2236. case PKT_CTRL_CMD_SETUP:
  2237. if (!capable(CAP_SYS_ADMIN))
  2238. return -EPERM;
  2239. down(&ctl_mutex);
  2240. ret = pkt_setup_dev(&ctrl_cmd);
  2241. up(&ctl_mutex);
  2242. break;
  2243. case PKT_CTRL_CMD_TEARDOWN:
  2244. if (!capable(CAP_SYS_ADMIN))
  2245. return -EPERM;
  2246. down(&ctl_mutex);
  2247. ret = pkt_remove_dev(&ctrl_cmd);
  2248. up(&ctl_mutex);
  2249. break;
  2250. case PKT_CTRL_CMD_STATUS:
  2251. down(&ctl_mutex);
  2252. pkt_get_status(&ctrl_cmd);
  2253. up(&ctl_mutex);
  2254. break;
  2255. default:
  2256. return -ENOTTY;
  2257. }
  2258. if (copy_to_user(argp, &ctrl_cmd, sizeof(struct pkt_ctrl_command)))
  2259. return -EFAULT;
  2260. return ret;
  2261. }
  2262. static struct file_operations pkt_ctl_fops = {
  2263. .ioctl  = pkt_ctl_ioctl,
  2264. .owner  = THIS_MODULE,
  2265. };
  2266. static struct miscdevice pkt_misc = {
  2267. .minor  = MISC_DYNAMIC_MINOR,
  2268. .name   = "pktcdvd",
  2269. .devfs_name  = "pktcdvd/control",
  2270. .fops   = &pkt_ctl_fops
  2271. };
  2272. static int __init pkt_init(void)
  2273. {
  2274. int ret;
  2275. psd_pool = mempool_create(PSD_POOL_SIZE, psd_pool_alloc, psd_pool_free, NULL);
  2276. if (!psd_pool)
  2277. return -ENOMEM;
  2278. ret = register_blkdev(pkt_major, "pktcdvd");
  2279. if (ret < 0) {
  2280. printk("pktcdvd: Unable to register block devicen");
  2281. goto out2;
  2282. }
  2283. if (!pkt_major)
  2284. pkt_major = ret;
  2285. ret = misc_register(&pkt_misc);
  2286. if (ret) {
  2287. printk("pktcdvd: Unable to register misc devicen");
  2288. goto out;
  2289. }
  2290. init_MUTEX(&ctl_mutex);
  2291. pkt_proc = proc_mkdir("pktcdvd", proc_root_driver);
  2292. DPRINTK("pktcdvd: %sn", VERSION_CODE);
  2293. return 0;
  2294. out:
  2295. unregister_blkdev(pkt_major, "pktcdvd");
  2296. out2:
  2297. mempool_destroy(psd_pool);
  2298. return ret;
  2299. }
  2300. static void __exit pkt_exit(void)
  2301. {
  2302. remove_proc_entry("pktcdvd", proc_root_driver);
  2303. misc_deregister(&pkt_misc);
  2304. unregister_blkdev(pkt_major, "pktcdvd");
  2305. mempool_destroy(psd_pool);
  2306. }
  2307. MODULE_DESCRIPTION("Packet writing layer for CD/DVD drives");
  2308. MODULE_AUTHOR("Jens Axboe <axboe@suse.de>");
  2309. MODULE_LICENSE("GPL");
  2310. module_init(pkt_init);
  2311. module_exit(pkt_exit);