diff options
| author | Yoshihisa Abe <yoshiabe@cs.cmu.edu> | 2010-10-25 02:03:46 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-25 11:02:40 -0400 |
| commit | da47c19e5c746829042933c8f945a71e2b62d6fc (patch) | |
| tree | 54110db260f57c01745e1ace343ec72b7eec6c69 /fs/coda/psdev.c | |
| parent | f7cc02b8715618e179242ba9cc10bdc5146ae565 (diff) | |
Coda: replace BKL with mutex
Replace the BKL with a mutex to protect the venus_comm structure which
binds the mountpoint with the character device and holds the upcall
queues.
Signed-off-by: Yoshihisa Abe <yoshiabe@cs.cmu.edu>
Signed-off-by: Jan Harkes <jaharkes@cs.cmu.edu>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/coda/psdev.c')
| -rw-r--r-- | fs/coda/psdev.c | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/fs/coda/psdev.c b/fs/coda/psdev.c index 9a9248e632c6..62647a8595e4 100644 --- a/fs/coda/psdev.c +++ b/fs/coda/psdev.c | |||
| @@ -35,7 +35,7 @@ | |||
| 35 | #include <linux/poll.h> | 35 | #include <linux/poll.h> |
| 36 | #include <linux/init.h> | 36 | #include <linux/init.h> |
| 37 | #include <linux/list.h> | 37 | #include <linux/list.h> |
| 38 | #include <linux/smp_lock.h> | 38 | #include <linux/mutex.h> |
| 39 | #include <linux/device.h> | 39 | #include <linux/device.h> |
| 40 | #include <asm/io.h> | 40 | #include <asm/io.h> |
| 41 | #include <asm/system.h> | 41 | #include <asm/system.h> |
| @@ -67,8 +67,10 @@ static unsigned int coda_psdev_poll(struct file *file, poll_table * wait) | |||
| 67 | unsigned int mask = POLLOUT | POLLWRNORM; | 67 | unsigned int mask = POLLOUT | POLLWRNORM; |
| 68 | 68 | ||
| 69 | poll_wait(file, &vcp->vc_waitq, wait); | 69 | poll_wait(file, &vcp->vc_waitq, wait); |
| 70 | mutex_lock(&vcp->vc_mutex); | ||
| 70 | if (!list_empty(&vcp->vc_pending)) | 71 | if (!list_empty(&vcp->vc_pending)) |
| 71 | mask |= POLLIN | POLLRDNORM; | 72 | mask |= POLLIN | POLLRDNORM; |
| 73 | mutex_unlock(&vcp->vc_mutex); | ||
| 72 | 74 | ||
| 73 | return mask; | 75 | return mask; |
| 74 | } | 76 | } |
| @@ -143,7 +145,7 @@ static ssize_t coda_psdev_write(struct file *file, const char __user *buf, | |||
| 143 | } | 145 | } |
| 144 | 146 | ||
| 145 | /* Look for the message on the processing queue. */ | 147 | /* Look for the message on the processing queue. */ |
| 146 | lock_kernel(); | 148 | mutex_lock(&vcp->vc_mutex); |
| 147 | list_for_each(lh, &vcp->vc_processing) { | 149 | list_for_each(lh, &vcp->vc_processing) { |
| 148 | tmp = list_entry(lh, struct upc_req , uc_chain); | 150 | tmp = list_entry(lh, struct upc_req , uc_chain); |
| 149 | if (tmp->uc_unique == hdr.unique) { | 151 | if (tmp->uc_unique == hdr.unique) { |
| @@ -152,7 +154,7 @@ static ssize_t coda_psdev_write(struct file *file, const char __user *buf, | |||
| 152 | break; | 154 | break; |
| 153 | } | 155 | } |
| 154 | } | 156 | } |
| 155 | unlock_kernel(); | 157 | mutex_unlock(&vcp->vc_mutex); |
| 156 | 158 | ||
| 157 | if (!req) { | 159 | if (!req) { |
| 158 | printk("psdev_write: msg (%d, %d) not found\n", | 160 | printk("psdev_write: msg (%d, %d) not found\n", |
| @@ -207,7 +209,7 @@ static ssize_t coda_psdev_read(struct file * file, char __user * buf, | |||
| 207 | if (nbytes == 0) | 209 | if (nbytes == 0) |
| 208 | return 0; | 210 | return 0; |
| 209 | 211 | ||
| 210 | lock_kernel(); | 212 | mutex_lock(&vcp->vc_mutex); |
| 211 | 213 | ||
| 212 | add_wait_queue(&vcp->vc_waitq, &wait); | 214 | add_wait_queue(&vcp->vc_waitq, &wait); |
| 213 | set_current_state(TASK_INTERRUPTIBLE); | 215 | set_current_state(TASK_INTERRUPTIBLE); |
| @@ -221,7 +223,9 @@ static ssize_t coda_psdev_read(struct file * file, char __user * buf, | |||
| 221 | retval = -ERESTARTSYS; | 223 | retval = -ERESTARTSYS; |
| 222 | break; | 224 | break; |
| 223 | } | 225 | } |
| 226 | mutex_unlock(&vcp->vc_mutex); | ||
| 224 | schedule(); | 227 | schedule(); |
| 228 | mutex_lock(&vcp->vc_mutex); | ||
| 225 | } | 229 | } |
| 226 | 230 | ||
| 227 | set_current_state(TASK_RUNNING); | 231 | set_current_state(TASK_RUNNING); |
| @@ -254,7 +258,7 @@ static ssize_t coda_psdev_read(struct file * file, char __user * buf, | |||
| 254 | CODA_FREE(req->uc_data, sizeof(struct coda_in_hdr)); | 258 | CODA_FREE(req->uc_data, sizeof(struct coda_in_hdr)); |
| 255 | kfree(req); | 259 | kfree(req); |
| 256 | out: | 260 | out: |
| 257 | unlock_kernel(); | 261 | mutex_unlock(&vcp->vc_mutex); |
| 258 | return (count ? count : retval); | 262 | return (count ? count : retval); |
| 259 | } | 263 | } |
| 260 | 264 | ||
| @@ -267,10 +271,10 @@ static int coda_psdev_open(struct inode * inode, struct file * file) | |||
| 267 | if (idx < 0 || idx >= MAX_CODADEVS) | 271 | if (idx < 0 || idx >= MAX_CODADEVS) |
| 268 | return -ENODEV; | 272 | return -ENODEV; |
| 269 | 273 | ||
| 270 | lock_kernel(); | ||
| 271 | |||
| 272 | err = -EBUSY; | 274 | err = -EBUSY; |
| 273 | vcp = &coda_comms[idx]; | 275 | vcp = &coda_comms[idx]; |
| 276 | mutex_lock(&vcp->vc_mutex); | ||
| 277 | |||
| 274 | if (!vcp->vc_inuse) { | 278 | if (!vcp->vc_inuse) { |
| 275 | vcp->vc_inuse++; | 279 | vcp->vc_inuse++; |
| 276 | 280 | ||
| @@ -284,7 +288,7 @@ static int coda_psdev_open(struct inode * inode, struct file * file) | |||
| 284 | err = 0; | 288 | err = 0; |
| 285 | } | 289 | } |
| 286 | 290 | ||
| 287 | unlock_kernel(); | 291 | mutex_unlock(&vcp->vc_mutex); |
| 288 | return err; | 292 | return err; |
| 289 | } | 293 | } |
| 290 | 294 | ||
| @@ -299,7 +303,7 @@ static int coda_psdev_release(struct inode * inode, struct file * file) | |||
| 299 | return -1; | 303 | return -1; |
| 300 | } | 304 | } |
| 301 | 305 | ||
| 302 | lock_kernel(); | 306 | mutex_lock(&vcp->vc_mutex); |
| 303 | 307 | ||
| 304 | /* Wakeup clients so they can return. */ | 308 | /* Wakeup clients so they can return. */ |
| 305 | list_for_each_entry_safe(req, tmp, &vcp->vc_pending, uc_chain) { | 309 | list_for_each_entry_safe(req, tmp, &vcp->vc_pending, uc_chain) { |
| @@ -324,7 +328,7 @@ static int coda_psdev_release(struct inode * inode, struct file * file) | |||
| 324 | 328 | ||
| 325 | file->private_data = NULL; | 329 | file->private_data = NULL; |
| 326 | vcp->vc_inuse--; | 330 | vcp->vc_inuse--; |
| 327 | unlock_kernel(); | 331 | mutex_unlock(&vcp->vc_mutex); |
| 328 | return 0; | 332 | return 0; |
| 329 | } | 333 | } |
| 330 | 334 | ||
| @@ -353,9 +357,11 @@ static int init_coda_psdev(void) | |||
| 353 | err = PTR_ERR(coda_psdev_class); | 357 | err = PTR_ERR(coda_psdev_class); |
| 354 | goto out_chrdev; | 358 | goto out_chrdev; |
| 355 | } | 359 | } |
| 356 | for (i = 0; i < MAX_CODADEVS; i++) | 360 | for (i = 0; i < MAX_CODADEVS; i++) { |
| 361 | mutex_init(&(&coda_comms[i])->vc_mutex); | ||
| 357 | device_create(coda_psdev_class, NULL, | 362 | device_create(coda_psdev_class, NULL, |
| 358 | MKDEV(CODA_PSDEV_MAJOR, i), NULL, "cfs%d", i); | 363 | MKDEV(CODA_PSDEV_MAJOR, i), NULL, "cfs%d", i); |
| 364 | } | ||
| 359 | coda_sysctl_init(); | 365 | coda_sysctl_init(); |
| 360 | goto out; | 366 | goto out; |
| 361 | 367 | ||
