History

Revert "pktcdvd: remove driver."

This reverts commit f40eb99897af665f11858dd7b56edcb62c3f3c67. There are apparently still users out there of this driver. While we'd love to remove it to ease the maintenance burden, let's reinstate it for now until better (userspace) solutions can be developed.

Jens Axboe committed 3 years ago

Commit 4b83e991 parent 050a4f38 files · +3419 −0Browse files

Showing the changes to include/linux (1 of 8 files). Show all

Unified · Split

include/linux/pktcdvd.h+197−0
@@ -0,0 +1,197 @@
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-R, CD-RW, DVD-R, and
9 * DVD-RW devices.
10 *
11 */
12#ifndef __PKTCDVD_H
13#define __PKTCDVD_H
14
15#include <linux/blkdev.h>
16#include <linux/completion.h>
17#include <linux/cdrom.h>
18#include <linux/kobject.h>
19#include <linux/sysfs.h>
20#include <linux/mempool.h>
21#include <uapi/linux/pktcdvd.h>
22
23/* default bio write queue congestion marks */
24#define PKT_WRITE_CONGESTION_ON 10000
25#define PKT_WRITE_CONGESTION_OFF 9000
26
27
28struct packet_settings
29{
30 __u32 size; /* packet size in (512 byte) sectors */
31 __u8 fp; /* fixed packets */
32 __u8 link_loss; /* the rest is specified
33 * as per Mt Fuji */
34 __u8 write_type;
35 __u8 track_mode;
36 __u8 block_mode;
37};
38
39/*
40 * Very crude stats for now
41 */
42struct packet_stats
43{
44 unsigned long pkt_started;
45 unsigned long pkt_ended;
46 unsigned long secs_w;
47 unsigned long secs_rg;
48 unsigned long secs_r;
49};
50
51struct packet_cdrw
52{
53 struct list_head pkt_free_list;
54 struct list_head pkt_active_list;
55 spinlock_t active_list_lock; /* Serialize access to pkt_active_list */
56 struct task_struct *thread;
57 atomic_t pending_bios;
58};
59
60/*
61 * Switch to high speed reading after reading this many kilobytes
62 * with no interspersed writes.
63 */
64#define HI_SPEED_SWITCH 512
65
66struct packet_iosched
67{
68 atomic_t attention; /* Set to non-zero when queue processing is needed */
69 int writing; /* Non-zero when writing, zero when reading */
70 spinlock_t lock; /* Protecting read/write queue manipulations */
71 struct bio_list read_queue;
72 struct bio_list write_queue;
73 sector_t last_write; /* The sector where the last write ended */
74 int successive_reads;
75};
76
77/*
78 * 32 buffers of 2048 bytes
79 */
80#if (PAGE_SIZE % CD_FRAMESIZE) != 0
81#error "PAGE_SIZE must be a multiple of CD_FRAMESIZE"
82#endif
83#define PACKET_MAX_SIZE 128
84#define FRAMES_PER_PAGE (PAGE_SIZE / CD_FRAMESIZE)
85#define PACKET_MAX_SECTORS (PACKET_MAX_SIZE * CD_FRAMESIZE >> 9)
86
87enum packet_data_state {
88 PACKET_IDLE_STATE, /* Not used at the moment */
89 PACKET_WAITING_STATE, /* Waiting for more bios to arrive, so */
90 /* we don't have to do as much */
91 /* data gathering */
92 PACKET_READ_WAIT_STATE, /* Waiting for reads to fill in holes */
93 PACKET_WRITE_WAIT_STATE, /* Waiting for the write to complete */
94 PACKET_RECOVERY_STATE, /* Recover after read/write errors */
95 PACKET_FINISHED_STATE, /* After write has finished */
96
97 PACKET_NUM_STATES /* Number of possible states */
98};
99
100/*
101 * Information needed for writing a single packet
102 */
103struct pktcdvd_device;
104
105struct packet_data
106{
107 struct list_head list;
108
109 spinlock_t lock; /* Lock protecting state transitions and */
110 /* orig_bios list */
111
112 struct bio_list orig_bios; /* Original bios passed to pkt_make_request */
113 /* that will be handled by this packet */
114 int write_size; /* Total size of all bios in the orig_bios */
115 /* list, measured in number of frames */
116
117 struct bio *w_bio; /* The bio we will send to the real CD */
118 /* device once we have all data for the */
119 /* packet we are going to write */
120 sector_t sector; /* First sector in this packet */
121 int frames; /* Number of frames in this packet */
122
123 enum packet_data_state state; /* Current state */
124 atomic_t run_sm; /* Incremented whenever the state */
125 /* machine needs to be run */
126 long sleep_time; /* Set this to non-zero to make the state */
127 /* machine run after this many jiffies. */
128
129 atomic_t io_wait; /* Number of pending IO operations */
130 atomic_t io_errors; /* Number of read/write errors during IO */
131
132 struct bio *r_bios[PACKET_MAX_SIZE]; /* bios to use during data gathering */
133 struct page *pages[PACKET_MAX_SIZE / FRAMES_PER_PAGE];
134
135 int cache_valid; /* If non-zero, the data for the zone defined */
136 /* by the sector variable is completely cached */
137 /* in the pages[] vector. */
138
139 int id; /* ID number for debugging */
140 struct pktcdvd_device *pd;
141};
142
143struct pkt_rb_node {
144 struct rb_node rb_node;
145 struct bio *bio;
146};
147
148struct packet_stacked_data
149{
150 struct bio *bio; /* Original read request bio */
151 struct pktcdvd_device *pd;
152};
153#define PSD_POOL_SIZE 64
154
155struct pktcdvd_device
156{
157 struct block_device *bdev; /* dev attached */
158 dev_t pkt_dev; /* our dev */
159 char name[20];
160 struct packet_settings settings;
161 struct packet_stats stats;
162 int refcnt; /* Open count */
163 int write_speed; /* current write speed, kB/s */
164 int read_speed; /* current read speed, kB/s */
165 unsigned long offset; /* start offset */
166 __u8 mode_offset; /* 0 / 8 */
167 __u8 type;
168 unsigned long flags;
169 __u16 mmc3_profile;
170 __u32 nwa; /* next writable address */
171 __u32 lra; /* last recorded address */
172 struct packet_cdrw cdrw;
173 wait_queue_head_t wqueue;
174
175 spinlock_t lock; /* Serialize access to bio_queue */
176 struct rb_root bio_queue; /* Work queue of bios we need to handle */
177 int bio_queue_size; /* Number of nodes in bio_queue */
178 bool congested; /* Someone is waiting for bio_queue_size
179 * to drop. */
180 sector_t current_sector; /* Keep track of where the elevator is */
181 atomic_t scan_queue; /* Set to non-zero when pkt_handle_queue */
182 /* needs to be run. */
183 mempool_t rb_pool; /* mempool for pkt_rb_node allocations */
184
185 struct packet_iosched iosched;
186 struct gendisk *disk;
187
188 int write_congestion_off;
189 int write_congestion_on;
190
191 struct device *dev; /* sysfs pktcdvd[0-7] dev */
192
193 struct dentry *dfs_d_root; /* debugfs: devname directory */
194 struct dentry *dfs_f_info; /* debugfs: info file */
195};
196
197#endif /* __PKTCDVD_H */