diff options
author | Alan Cox <alan@lxorguk.ukuu.org.uk> | 2008-07-25 04:48:14 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-25 13:53:43 -0400 |
commit | 909d145f0decbc4f17955e1fc4122a669a51fbc0 (patch) | |
tree | fbda85c9ecb7e75684e94ef5a070ffcaf7a6ccde /drivers/char/mwave | |
parent | 47be36a24defbd19aea1354c416ec99f291c7ab8 (diff) |
mwave: ioctl BKL pushdown
Push the BKL down to the point it wraps the actual mwave method handlers
Signed-off-by: Alan Cox <alan@redhat.com>
Cc: Eric Sesterhenn <snakebyte@gmx.de>
Cc: Yani Ioannou <yani.ioannou@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/char/mwave')
-rw-r--r-- | drivers/char/mwave/mwavedd.c | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/drivers/char/mwave/mwavedd.c b/drivers/char/mwave/mwavedd.c index 50243fcd87e8..4f8d67fed292 100644 --- a/drivers/char/mwave/mwavedd.c +++ b/drivers/char/mwave/mwavedd.c | |||
@@ -86,8 +86,8 @@ module_param(mwave_uart_io, int, 0); | |||
86 | 86 | ||
87 | static int mwave_open(struct inode *inode, struct file *file); | 87 | static int mwave_open(struct inode *inode, struct file *file); |
88 | static int mwave_close(struct inode *inode, struct file *file); | 88 | static int mwave_close(struct inode *inode, struct file *file); |
89 | static int mwave_ioctl(struct inode *inode, struct file *filp, | 89 | static long mwave_ioctl(struct file *filp, unsigned int iocmd, |
90 | unsigned int iocmd, unsigned long ioarg); | 90 | unsigned long ioarg); |
91 | 91 | ||
92 | MWAVE_DEVICE_DATA mwave_s_mdd; | 92 | MWAVE_DEVICE_DATA mwave_s_mdd; |
93 | 93 | ||
@@ -119,16 +119,16 @@ static int mwave_close(struct inode *inode, struct file *file) | |||
119 | return retval; | 119 | return retval; |
120 | } | 120 | } |
121 | 121 | ||
122 | static int mwave_ioctl(struct inode *inode, struct file *file, | 122 | static long mwave_ioctl(struct file *file, unsigned int iocmd, |
123 | unsigned int iocmd, unsigned long ioarg) | 123 | unsigned long ioarg) |
124 | { | 124 | { |
125 | unsigned int retval = 0; | 125 | unsigned int retval = 0; |
126 | pMWAVE_DEVICE_DATA pDrvData = &mwave_s_mdd; | 126 | pMWAVE_DEVICE_DATA pDrvData = &mwave_s_mdd; |
127 | void __user *arg = (void __user *)ioarg; | 127 | void __user *arg = (void __user *)ioarg; |
128 | 128 | ||
129 | PRINTK_5(TRACE_MWAVE, | 129 | PRINTK_4(TRACE_MWAVE, |
130 | "mwavedd::mwave_ioctl, entry inode %p file %p cmd %x arg %x\n", | 130 | "mwavedd::mwave_ioctl, entry file %p cmd %x arg %x\n", |
131 | inode, file, iocmd, (int) ioarg); | 131 | file, iocmd, (int) ioarg); |
132 | 132 | ||
133 | switch (iocmd) { | 133 | switch (iocmd) { |
134 | 134 | ||
@@ -136,7 +136,9 @@ static int mwave_ioctl(struct inode *inode, struct file *file, | |||
136 | PRINTK_1(TRACE_MWAVE, | 136 | PRINTK_1(TRACE_MWAVE, |
137 | "mwavedd::mwave_ioctl, IOCTL_MW_RESET" | 137 | "mwavedd::mwave_ioctl, IOCTL_MW_RESET" |
138 | " calling tp3780I_ResetDSP\n"); | 138 | " calling tp3780I_ResetDSP\n"); |
139 | lock_kernel(); | ||
139 | retval = tp3780I_ResetDSP(&pDrvData->rBDData); | 140 | retval = tp3780I_ResetDSP(&pDrvData->rBDData); |
141 | unlock_kernel(); | ||
140 | PRINTK_2(TRACE_MWAVE, | 142 | PRINTK_2(TRACE_MWAVE, |
141 | "mwavedd::mwave_ioctl, IOCTL_MW_RESET" | 143 | "mwavedd::mwave_ioctl, IOCTL_MW_RESET" |
142 | " retval %x from tp3780I_ResetDSP\n", | 144 | " retval %x from tp3780I_ResetDSP\n", |
@@ -147,7 +149,9 @@ static int mwave_ioctl(struct inode *inode, struct file *file, | |||
147 | PRINTK_1(TRACE_MWAVE, | 149 | PRINTK_1(TRACE_MWAVE, |
148 | "mwavedd::mwave_ioctl, IOCTL_MW_RUN" | 150 | "mwavedd::mwave_ioctl, IOCTL_MW_RUN" |
149 | " calling tp3780I_StartDSP\n"); | 151 | " calling tp3780I_StartDSP\n"); |
152 | lock_kernel(); | ||
150 | retval = tp3780I_StartDSP(&pDrvData->rBDData); | 153 | retval = tp3780I_StartDSP(&pDrvData->rBDData); |
154 | unlock_kernel(); | ||
151 | PRINTK_2(TRACE_MWAVE, | 155 | PRINTK_2(TRACE_MWAVE, |
152 | "mwavedd::mwave_ioctl, IOCTL_MW_RUN" | 156 | "mwavedd::mwave_ioctl, IOCTL_MW_RUN" |
153 | " retval %x from tp3780I_StartDSP\n", | 157 | " retval %x from tp3780I_StartDSP\n", |
@@ -161,8 +165,10 @@ static int mwave_ioctl(struct inode *inode, struct file *file, | |||
161 | "mwavedd::mwave_ioctl," | 165 | "mwavedd::mwave_ioctl," |
162 | " IOCTL_MW_DSP_ABILITIES calling" | 166 | " IOCTL_MW_DSP_ABILITIES calling" |
163 | " tp3780I_QueryAbilities\n"); | 167 | " tp3780I_QueryAbilities\n"); |
168 | lock_kernel(); | ||
164 | retval = tp3780I_QueryAbilities(&pDrvData->rBDData, | 169 | retval = tp3780I_QueryAbilities(&pDrvData->rBDData, |
165 | &rAbilities); | 170 | &rAbilities); |
171 | unlock_kernel(); | ||
166 | PRINTK_2(TRACE_MWAVE, | 172 | PRINTK_2(TRACE_MWAVE, |
167 | "mwavedd::mwave_ioctl, IOCTL_MW_DSP_ABILITIES" | 173 | "mwavedd::mwave_ioctl, IOCTL_MW_DSP_ABILITIES" |
168 | " retval %x from tp3780I_QueryAbilities\n", | 174 | " retval %x from tp3780I_QueryAbilities\n", |
@@ -193,11 +199,13 @@ static int mwave_ioctl(struct inode *inode, struct file *file, | |||
193 | "mwavedd::mwave_ioctl IOCTL_MW_READ_DATA," | 199 | "mwavedd::mwave_ioctl IOCTL_MW_READ_DATA," |
194 | " size %lx, ioarg %lx pusBuffer %p\n", | 200 | " size %lx, ioarg %lx pusBuffer %p\n", |
195 | rReadData.ulDataLength, ioarg, pusBuffer); | 201 | rReadData.ulDataLength, ioarg, pusBuffer); |
202 | lock_kernel(); | ||
196 | retval = tp3780I_ReadWriteDspDStore(&pDrvData->rBDData, | 203 | retval = tp3780I_ReadWriteDspDStore(&pDrvData->rBDData, |
197 | iocmd, | 204 | iocmd, |
198 | pusBuffer, | 205 | pusBuffer, |
199 | rReadData.ulDataLength, | 206 | rReadData.ulDataLength, |
200 | rReadData.usDspAddress); | 207 | rReadData.usDspAddress); |
208 | unlock_kernel(); | ||
201 | } | 209 | } |
202 | break; | 210 | break; |
203 | 211 | ||
@@ -215,10 +223,12 @@ static int mwave_ioctl(struct inode *inode, struct file *file, | |||
215 | " size %lx, ioarg %lx pusBuffer %p\n", | 223 | " size %lx, ioarg %lx pusBuffer %p\n", |
216 | rReadData.ulDataLength / 2, ioarg, | 224 | rReadData.ulDataLength / 2, ioarg, |
217 | pusBuffer); | 225 | pusBuffer); |
226 | lock_kernel(); | ||
218 | retval = tp3780I_ReadWriteDspDStore(&pDrvData->rBDData, | 227 | retval = tp3780I_ReadWriteDspDStore(&pDrvData->rBDData, |
219 | iocmd, pusBuffer, | 228 | iocmd, pusBuffer, |
220 | rReadData.ulDataLength / 2, | 229 | rReadData.ulDataLength / 2, |
221 | rReadData.usDspAddress); | 230 | rReadData.usDspAddress); |
231 | unlock_kernel(); | ||
222 | } | 232 | } |
223 | break; | 233 | break; |
224 | 234 | ||
@@ -236,10 +246,12 @@ static int mwave_ioctl(struct inode *inode, struct file *file, | |||
236 | " size %lx, ioarg %lx pusBuffer %p\n", | 246 | " size %lx, ioarg %lx pusBuffer %p\n", |
237 | rWriteData.ulDataLength, ioarg, | 247 | rWriteData.ulDataLength, ioarg, |
238 | pusBuffer); | 248 | pusBuffer); |
249 | lock_kernel(); | ||
239 | retval = tp3780I_ReadWriteDspDStore(&pDrvData->rBDData, | 250 | retval = tp3780I_ReadWriteDspDStore(&pDrvData->rBDData, |
240 | iocmd, pusBuffer, | 251 | iocmd, pusBuffer, |
241 | rWriteData.ulDataLength, | 252 | rWriteData.ulDataLength, |
242 | rWriteData.usDspAddress); | 253 | rWriteData.usDspAddress); |
254 | unlock_kernel(); | ||
243 | } | 255 | } |
244 | break; | 256 | break; |
245 | 257 | ||
@@ -257,10 +269,12 @@ static int mwave_ioctl(struct inode *inode, struct file *file, | |||
257 | " size %lx, ioarg %lx pusBuffer %p\n", | 269 | " size %lx, ioarg %lx pusBuffer %p\n", |
258 | rWriteData.ulDataLength, ioarg, | 270 | rWriteData.ulDataLength, ioarg, |
259 | pusBuffer); | 271 | pusBuffer); |
272 | lock_kernel(); | ||
260 | retval = tp3780I_ReadWriteDspIStore(&pDrvData->rBDData, | 273 | retval = tp3780I_ReadWriteDspIStore(&pDrvData->rBDData, |
261 | iocmd, pusBuffer, | 274 | iocmd, pusBuffer, |
262 | rWriteData.ulDataLength, | 275 | rWriteData.ulDataLength, |
263 | rWriteData.usDspAddress); | 276 | rWriteData.usDspAddress); |
277 | unlock_kernel(); | ||
264 | } | 278 | } |
265 | break; | 279 | break; |
266 | 280 | ||
@@ -281,8 +295,10 @@ static int mwave_ioctl(struct inode *inode, struct file *file, | |||
281 | ipcnum); | 295 | ipcnum); |
282 | return -EINVAL; | 296 | return -EINVAL; |
283 | } | 297 | } |
298 | lock_kernel(); | ||
284 | pDrvData->IPCs[ipcnum].bIsHere = FALSE; | 299 | pDrvData->IPCs[ipcnum].bIsHere = FALSE; |
285 | pDrvData->IPCs[ipcnum].bIsEnabled = TRUE; | 300 | pDrvData->IPCs[ipcnum].bIsEnabled = TRUE; |
301 | unlock_kernel(); | ||
286 | 302 | ||
287 | PRINTK_2(TRACE_MWAVE, | 303 | PRINTK_2(TRACE_MWAVE, |
288 | "mwavedd::mwave_ioctl IOCTL_MW_REGISTER_IPC" | 304 | "mwavedd::mwave_ioctl IOCTL_MW_REGISTER_IPC" |
@@ -307,6 +323,7 @@ static int mwave_ioctl(struct inode *inode, struct file *file, | |||
307 | return -EINVAL; | 323 | return -EINVAL; |
308 | } | 324 | } |
309 | 325 | ||
326 | lock_kernel(); | ||
310 | if (pDrvData->IPCs[ipcnum].bIsEnabled == TRUE) { | 327 | if (pDrvData->IPCs[ipcnum].bIsEnabled == TRUE) { |
311 | DECLARE_WAITQUEUE(wait, current); | 328 | DECLARE_WAITQUEUE(wait, current); |
312 | 329 | ||
@@ -347,6 +364,7 @@ static int mwave_ioctl(struct inode *inode, struct file *file, | |||
347 | " processing\n", | 364 | " processing\n", |
348 | ipcnum); | 365 | ipcnum); |
349 | } | 366 | } |
367 | unlock_kernel(); | ||
350 | } | 368 | } |
351 | break; | 369 | break; |
352 | 370 | ||
@@ -365,19 +383,18 @@ static int mwave_ioctl(struct inode *inode, struct file *file, | |||
365 | ipcnum); | 383 | ipcnum); |
366 | return -EINVAL; | 384 | return -EINVAL; |
367 | } | 385 | } |
386 | lock_kernel(); | ||
368 | if (pDrvData->IPCs[ipcnum].bIsEnabled == TRUE) { | 387 | if (pDrvData->IPCs[ipcnum].bIsEnabled == TRUE) { |
369 | pDrvData->IPCs[ipcnum].bIsEnabled = FALSE; | 388 | pDrvData->IPCs[ipcnum].bIsEnabled = FALSE; |
370 | if (pDrvData->IPCs[ipcnum].bIsHere == TRUE) { | 389 | if (pDrvData->IPCs[ipcnum].bIsHere == TRUE) { |
371 | wake_up_interruptible(&pDrvData->IPCs[ipcnum].ipc_wait_queue); | 390 | wake_up_interruptible(&pDrvData->IPCs[ipcnum].ipc_wait_queue); |
372 | } | 391 | } |
373 | } | 392 | } |
393 | unlock_kernel(); | ||
374 | } | 394 | } |
375 | break; | 395 | break; |
376 | 396 | ||
377 | default: | 397 | default: |
378 | PRINTK_ERROR(KERN_ERR_MWAVE "mwavedd::mwave_ioctl:" | ||
379 | " Error: Unrecognized iocmd %x\n", | ||
380 | iocmd); | ||
381 | return -ENOTTY; | 398 | return -ENOTTY; |
382 | break; | 399 | break; |
383 | } /* switch */ | 400 | } /* switch */ |
@@ -460,7 +477,7 @@ static const struct file_operations mwave_fops = { | |||
460 | .owner = THIS_MODULE, | 477 | .owner = THIS_MODULE, |
461 | .read = mwave_read, | 478 | .read = mwave_read, |
462 | .write = mwave_write, | 479 | .write = mwave_write, |
463 | .ioctl = mwave_ioctl, | 480 | .unlocked_ioctl = mwave_ioctl, |
464 | .open = mwave_open, | 481 | .open = mwave_open, |
465 | .release = mwave_close | 482 | .release = mwave_close |
466 | }; | 483 | }; |