/[debburn]/mods-archive/27_scsi_buffer_size.dpatch
ViewVC logotype

Contents of /mods-archive/27_scsi_buffer_size.dpatch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 224 - (show annotations) (download)
Tue Sep 5 19:18:45 2006 UTC (6 years, 8 months ago) by blade
File size: 12285 byte(s)
Parked the mods archive outside of the trunk
1 #! /bin/sh /usr/share/dpatch/dpatch-run
2 ## 27_scsi_buffer_size.dpatch by Steve McIntyre <steve@einval.com>
3 ##
4 ## All lines beginning with `## DP:' are a description of the patch.
5 ## DP: If we can't get a buffer as big as we would like, shrink the desired
6 ## size until it works. Bug #330371
7
8 @DPATCH@
9 diff -urNad cdrtools-2.01.01~/cdda2wav/interface.c cdrtools-2.01.01/cdda2wav/interface.c
10 --- cdrtools-2.01.01~/cdda2wav/interface.c 2006-03-19 21:18:39.000000000 +0100
11 +++ cdrtools-2.01.01/cdda2wav/interface.c 2006-03-19 21:23:59.733517440 +0100
12 @@ -512,6 +512,7 @@
13 {
14 int retval = 0;
15 struct stat fstatstruct;
16 + long bufsize = 0;
17
18 /* The device (given by pdevname) can be:
19 a. an SCSI device specified with a /dev/xxx name,
20 @@ -586,17 +587,24 @@
21 scgp->silent = global.scsi_silent;
22 scgp->verbose = global.scsi_verbose;
23
24 - if (global.nsectors > (unsigned) scg_bufsize(scgp, 3*1024*1024)/CD_FRAMESIZE_RAW)
25 - global.nsectors = scg_bufsize(scgp, 3*1024*1024)/CD_FRAMESIZE_RAW;
26 - if (global.overlap >= global.nsectors)
27 - global.overlap = global.nsectors-1;
28 + if (global.nsectors > (unsigned) scg_bufsize(scgp, 3*1024*1024)/CD_FRAMESIZE_RAW)
29 + global.nsectors = scg_bufsize(scgp, 3*1024*1024)/CD_FRAMESIZE_RAW;
30 + bufsize = global.nsectors * CD_FRAMESIZE_RAW;
31
32 - /*
33 - * Newer versions of Linux seem to introduce an incompatible change
34 - * and require root privileges or limit RLIMIT_MEMLOCK infinity
35 - * in order to get a SCSI buffer in case we did call mlockall(MCL_FUTURE).
36 - */
37 - init_scsibuf(scgp, global.nsectors*CD_FRAMESIZE_RAW);
38 + /*
39 + * Newer versions of Linux seem to introduce an incompatible change
40 + * and require root privileges or limit RLIMIT_MEMLOCK infinity
41 + * in order to get a SCSI buffer in case we did call mlockall(MCL_FUTURE).
42 + */
43 +
44 + /*
45 + * EB: whoever wrote the scsi-buffer patch, test the change or throw it away
46 + * because of beeing no longer required.
47 + */
48 + init_scsibuf(scgp, global.nsectors*CD_FRAMESIZE_RAW);
49 + global.nsectors = bufsize / CD_FRAMESIZE_RAW;
50 + if (global.overlap >= global.nsectors)
51 + global.overlap = global.nsectors-1;
52 priv_off();
53 dontneedgroup();
54 dontneedroot();
55 diff -urNad cdrtools-2.01.01~/cdda2wav/scsi_cmds.c cdrtools-2.01.01/cdda2wav/scsi_cmds.c
56 --- cdrtools-2.01.01~/cdda2wav/scsi_cmds.c 2006-03-19 21:18:39.000000000 +0100
57 +++ cdrtools-2.01.01/cdda2wav/scsi_cmds.c 2006-03-19 21:18:46.457142688 +0100
58 @@ -1780,11 +1780,11 @@
59
60 static caddr_t scsibuffer; /* page aligned scsi transfer buffer */
61
62 -void init_scsibuf __PR((SCSI *, unsigned));
63 +void init_scsibuf __PR((SCSI *, long *));
64
65 void init_scsibuf(scgp, amt)
66 SCSI *scgp;
67 - unsigned amt;
68 + long *amt;
69 {
70 if (scsibuffer != NULL) {
71 fprintf(stderr, "the SCSI transfer buffer has already been allocated!\n");
72 diff -urNad cdrtools-2.01.01~/cdda2wav/scsi_cmds.h cdrtools-2.01.01/cdda2wav/scsi_cmds.h
73 --- cdrtools-2.01.01~/cdda2wav/scsi_cmds.h 2006-03-19 21:18:39.000000000 +0100
74 +++ cdrtools-2.01.01/cdda2wav/scsi_cmds.h 2006-03-19 21:18:46.457142688 +0100
75 @@ -40,7 +40,7 @@
76 get_orig_sectorsize __PR((SCSI *scgp, unsigned char *m4, unsigned char *m10,
77 unsigned char *m11));
78 int heiko_mmc __PR(( SCSI *scgp ));
79 -void init_scsibuf __PR(( SCSI *scgp, unsigned amt ));
80 +void init_scsibuf __PR(( SCSI *scgp, long *amt ));
81 int myscsierr __PR(( SCSI *scgp ));
82
83 extern int accepts_fua_bit;
84 diff -urNad cdrtools-2.01.01~/cdrecord/cdrecord.c cdrtools-2.01.01/cdrecord/cdrecord.c
85 --- cdrtools-2.01.01~/cdrecord/cdrecord.c 2006-03-19 21:18:46.078200296 +0100
86 +++ cdrtools-2.01.01/cdrecord/cdrecord.c 2006-03-19 21:18:46.458142536 +0100
87 @@ -284,6 +284,7 @@
88 char errstr[80];
89 BOOL gracedone = FALSE;
90 char *suf = '\0';
91 + size_t wanted_bufsize = 0;
92
93 /* cut the Debian specific suffix from the executable filename */
94 suf = strstr(av[0], ".mmap");
95 @@ -612,12 +613,18 @@
96 if (lverbose && driveropts)
97 printf("Driveropts: '%s'\n", driveropts);
98
99 -/* bufsize = scg_bufsize(scgp, CDR_BUF_SIZE);*/
100 bufsize = scg_bufsize(scgp, bufsize);
101 if (lverbose || debug)
102 error("SCSI buffer size: %ld\n", bufsize);
103 - if ((buf = scg_getbuf(scgp, bufsize)) == NULL)
104 - comerr("Cannot get SCSI I/O buffer.\n");
105 +
106 + wanted_bufsize = bufsize;
107 + buf = scg_getbuf(scgp, &bufsize);
108 +
109 + if (NULL == buf)
110 + comerr("Cannot get SCSI I/O buffer of size %d bytes.\n", bufsize);
111 +
112 + if ((lverbose || debug) && (bufsize != wanted_bufsize))
113 + errmsgno(EX_BAD, "Asked for SCSI I/O buffer size %d bytes, could only get %d.\n", wanted_bufsize, bufsize);
114
115 if ((flags & F_SCANBUS) != 0) {
116 select_target(scgp, stdout);
117 diff -urNad cdrtools-2.01.01~/libscg/scg/scsitransp.h cdrtools-2.01.01/libscg/scg/scsitransp.h
118 --- cdrtools-2.01.01~/libscg/scg/scsitransp.h 2006-03-19 21:18:39.000000000 +0100
119 +++ cdrtools-2.01.01/libscg/scg/scsitransp.h 2006-03-19 21:18:46.459142384 +0100
120 @@ -144,7 +144,7 @@
121 extern int scg_initiator_id __PR((SCSI *scgp));
122 extern int scg_isatapi __PR((SCSI *scgp));
123 extern int scg_reset __PR((SCSI *scgp, int what));
124 -extern void *scg_getbuf __PR((SCSI *scgp, long));
125 +extern void *scg_getbuf __PR((SCSI *scgp, long *amt));
126 extern void scg_freebuf __PR((SCSI *scgp));
127 extern long scg_bufsize __PR((SCSI *scgp, long));
128 extern void scg_setnonstderrs __PR((SCSI *scgp, const char **));
129 diff -urNad cdrtools-2.01.01~/libscg/scsitransp.c cdrtools-2.01.01/libscg/scsitransp.c
130 --- cdrtools-2.01.01~/libscg/scsitransp.c 2006-03-19 21:18:46.036206680 +0100
131 +++ cdrtools-2.01.01/libscg/scsitransp.c 2006-03-19 21:18:46.459142384 +0100
132 @@ -51,8 +51,8 @@
133 * Choose your name instead of "schily" and make clear that the version
134 * string is related to a modified source.
135 */
136 -LOCAL char _scg_version[] = "0.8ubuntu1"; /* The global libscg version */
137 -LOCAL char _scg_auth_ubuntu[] = "ubuntu"; /* The author for this module */
138 +LOCAL char _scg_version[] = "0.8debian3"; /* The global libscg version */
139 +LOCAL char _scg_auth_debian[] = "debian"; /* The author for this module */
140
141 #define DEFTIMEOUT 20 /* Default timeout for SCSI command transport */
142
143 @@ -63,7 +63,7 @@
144 EXPORT int scg_initiator_id __PR((SCSI *scgp));
145 EXPORT int scg_isatapi __PR((SCSI *scgp));
146 EXPORT int scg_reset __PR((SCSI *scgp, int what));
147 -EXPORT void *scg_getbuf __PR((SCSI *scgp, long));
148 +EXPORT void *scg_getbuf __PR((SCSI *scgp, long *amt));
149 EXPORT void scg_freebuf __PR((SCSI *scgp));
150 EXPORT long scg_bufsize __PR((SCSI *scgp, long));
151 EXPORT void scg_setnonstderrs __PR((SCSI *scgp, const char **));
152 @@ -136,7 +136,7 @@
153 * return "schily" for the SCG_AUTHOR request.
154 */
155 case SCG_AUTHOR:
156 - return (_scg_auth_ubuntu);
157 + return (_scg_auth_debian);
158 case SCG_SCCS_ID:
159 return (sccsid);
160 default:
161 @@ -233,14 +233,23 @@
162 EXPORT void *
163 scg_getbuf(scgp, amt)
164 SCSI *scgp;
165 - long amt;
166 + long *amt;
167 {
168 - void *buf;
169 + void *buf = NULL;
170 + size_t pagesize = getpagesize();
171 + long bufsize = *amt;
172
173 - if (amt <= 0 || amt > scg_bufsize(scgp, amt))
174 + if (bufsize <= 0 || bufsize > scg_bufsize(scgp, bufsize))
175 return ((void *)0);
176
177 - buf = SCGO_GETBUF(scgp, amt);
178 + while (bufsize >= pagesize) {
179 + buf = SCGO_GETBUF(scgp, bufsize);
180 + if (buf)
181 + break;
182 + bufsize -= pagesize;
183 + }
184 +
185 + *amt = bufsize;
186 scgp->bufptr = buf;
187 return (buf);
188 }
189 diff -urNad cdrtools-2.01.01~/mkisofs/scsi.c cdrtools-2.01.01/mkisofs/scsi.c
190 --- cdrtools-2.01.01~/mkisofs/scsi.c 2006-03-19 21:18:39.000000000 +0100
191 +++ cdrtools-2.01.01/mkisofs/scsi.c 2006-03-19 21:18:46.459142384 +0100
192 @@ -156,7 +156,7 @@
193 }
194
195 bufsize = scg_bufsize(scgp, BUF_SIZE);
196 - if ((buf = scg_getbuf(scgp, bufsize)) == NULL) {
197 + if ((buf = scg_getbuf(scgp, &bufsize)) == NULL) {
198 errmsg("Cannot get SCSI I/O buffer.\n");
199 scg_close(scgp);
200 return (-1);
201 diff -urNad cdrtools-2.01.01~/readcd/readcd.c cdrtools-2.01.01/readcd/readcd.c
202 --- cdrtools-2.01.01~/readcd/readcd.c 2006-03-19 21:18:39.000000000 +0100
203 +++ cdrtools-2.01.01/readcd/readcd.c 2006-03-19 21:18:46.460142232 +0100
204 @@ -398,7 +398,7 @@
205 if (Sbufsize == 0)
206 Sbufsize = 256*1024L;
207 Sbufsize = scg_bufsize(scgp, Sbufsize);
208 - if ((Sbuf = scg_getbuf(scgp, Sbufsize)) == NULL)
209 + if ((Sbuf = scg_getbuf(scgp, &Sbufsize)) == NULL)
210 comerr("Cannot get SCSI I/O buffer.\n");
211
212 #ifdef HAVE_PRIV_SET
213 diff -urNad cdrtools-2.01.01~/rscsi/rscsi.c cdrtools-2.01.01/rscsi/rscsi.c
214 --- cdrtools-2.01.01~/rscsi/rscsi.c 2006-03-19 21:18:46.049204704 +0100
215 +++ cdrtools-2.01.01/rscsi/rscsi.c 2006-03-19 21:18:46.461142080 +0100
216 @@ -86,7 +86,7 @@
217 LOCAL void readbuf __PR((char *buf, int n));
218 LOCAL void voidarg __PR((int n));
219 LOCAL void readarg __PR((char *buf, int n));
220 -LOCAL char * preparebuffer __PR((int size));
221 +LOCAL char * preparebuffer __PR((long *size));
222 LOCAL int checkscsi __PR((char *decive));
223 LOCAL void rscsirespond __PR((int ret, int err));
224 LOCAL void rscsireply __PR((int ret));
225 @@ -584,7 +584,7 @@
226 LOCAL void
227 getbuf()
228 {
229 - int ret = 0;
230 + long ret = 0;
231 char amt[CMD_SIZE];
232
233 readarg(amt, sizeof(amt));
234 @@ -594,7 +594,7 @@
235 return;
236 }
237 ret = scg_bufsize(scsi_ptr, atol(amt));
238 - if (preparebuffer(ret) == NULL)
239 + if (preparebuffer(&ret) == NULL)
240 ret = -1;
241 rscsirespond(ret, geterrno());
242 }
243 @@ -929,26 +929,26 @@
244
245 LOCAL char *
246 preparebuffer(size)
247 - int size;
248 + long *size;
249 {
250 - Sbufsize = size;
251 - if ((Sbuf = scg_getbuf(scsi_ptr, Sbufsize)) == NULL) {
252 + Sbufsize = *size;
253 + if ((Sbuf = scg_getbuf(scsi_ptr, &Sbufsize)) == NULL) {
254 Sbufsize = 0L;
255 return (Sbuf);
256 }
257 - size = Sbufsize + 1024; /* Add protocol overhead */
258 + *size = Sbufsize + 1024; /* Add protocol overhead */
259
260 #ifdef SO_SNDBUF
261 - while (size > 512 &&
262 - setsockopt(STDOUT_FILENO, SOL_SOCKET, SO_SNDBUF, (char *)&size, sizeof (size)) < 0)
263 - size -= 512;
264 - DEBUG1("rscsid: sndsize: %d\n", size);
265 + while (*size > 512 &&
266 + setsockopt(STDOUT_FILENO, SOL_SOCKET, SO_SNDBUF, (char *)size, sizeof (*size)) < 0)
267 + *size -= 512;
268 + DEBUG1("rscsid: sndsize: %d\n", *size);
269 #endif
270 #ifdef SO_RCVBUF
271 - while (size > 512 &&
272 - setsockopt(STDIN_FILENO, SOL_SOCKET, SO_RCVBUF, (char *)&size, sizeof (size)) < 0)
273 - size -= 512;
274 - DEBUG1("rscsid: rcvsize: %d\n", size);
275 + while (*size > 512 &&
276 + setsockopt(STDIN_FILENO, SOL_SOCKET, SO_RCVBUF, (char *)size, sizeof (*size)) < 0)
277 + *size -= 512;
278 + DEBUG1("rscsid: rcvsize: %d\n", *size);
279 #endif
280 return (Sbuf);
281 }
282 diff -urNad cdrtools-2.01.01~/scgcheck/scgcheck.c cdrtools-2.01.01/scgcheck/scgcheck.c
283 --- cdrtools-2.01.01~/scgcheck/scgcheck.c 2006-03-19 21:18:39.000000000 +0100
284 +++ cdrtools-2.01.01/scgcheck/scgcheck.c 2006-03-19 21:18:46.461142080 +0100
285 @@ -460,23 +460,31 @@
286 getbuf(scgp)
287 SCSI *scgp;
288 {
289 + long wanted_size = 0;
290 +
291 bufsize = scg_bufsize(scgp, MAX_BUF_SIZE);
292 printf("Max DMA buffer size: %ld\n", bufsize);
293 fprintf(logfile, "Max DMA buffer size: %ld\n", bufsize);
294 seterrno(0);
295 - if ((buf = scg_getbuf(scgp, bufsize)) == NULL) {
296 + wanted_size = bufsize;
297 + if ((buf = scg_getbuf(scgp, &bufsize)) == NULL) {
298 errmsg("Cannot get SCSI buffer (%ld bytes).\n", bufsize);
299 fprintf(logfile, "%s. Cannot get SCSI buffer (%ld bytes).\n",
300 errmsgstr(geterrno()), bufsize);
301 } else {
302 + if (wanted_size != bufsize)
303 + fprintf(logfile, "Max buffer available: %ld but wanted %ld\n", bufsize, wanted_size);
304 scg_freebuf(scgp);
305 }
306
307 bufsize = scg_bufsize(scgp, BUF_SIZE);
308 + wanted_size = bufsize;
309 if (debug)
310 error("SCSI buffer size: %ld\n", bufsize);
311 - if ((buf = scg_getbuf(scgp, bufsize)) == NULL)
312 + if ((buf = scg_getbuf(scgp, &bufsize)) == NULL)
313 comerr("Cannot get SCSI I/O buffer.\n");
314 + if (wanted_size != bufsize)
315 + fprintf(logfile, "Max buffer available: %ld but wanted %ld\n", bufsize, wanted_size);
316 }
317
318 EXPORT void
319 diff -urNad cdrtools-2.01.01~/scgskeleton/skel.c cdrtools-2.01.01/scgskeleton/skel.c
320 --- cdrtools-2.01.01~/scgskeleton/skel.c 2006-03-19 21:18:39.000000000 +0100
321 +++ cdrtools-2.01.01/scgskeleton/skel.c 2006-03-19 21:18:46.461142080 +0100
322 @@ -254,7 +254,7 @@
323 if (Sbufsize == 0)
324 Sbufsize = 256*1024L;
325 Sbufsize = scg_bufsize(scgp, Sbufsize);
326 - if ((Sbuf = scg_getbuf(scgp, Sbufsize)) == NULL)
327 + if ((Sbuf = scg_getbuf(scgp, &Sbufsize)) == NULL)
328 comerr("Cannot get SCSI I/O buffer.\n");
329
330 #ifdef HAVE_PRIV_SET

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.5