diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/um/drivers/ubd_kern.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c index f98d26e51381..8bd9204ac1ab 100644 --- a/arch/um/drivers/ubd_kern.c +++ b/arch/um/drivers/ubd_kern.c | |||
@@ -109,10 +109,6 @@ static inline void ubd_set_bit(__u64 bit, unsigned char *data) | |||
109 | 109 | ||
110 | static DEFINE_MUTEX(ubd_lock); | 110 | static DEFINE_MUTEX(ubd_lock); |
111 | 111 | ||
112 | /* XXX - this made sense in 2.4 days, now it's only used as a boolean, and | ||
113 | * probably it doesn't make sense even for that. */ | ||
114 | static int do_ubd; | ||
115 | |||
116 | static int ubd_open(struct inode * inode, struct file * filp); | 112 | static int ubd_open(struct inode * inode, struct file * filp); |
117 | static int ubd_release(struct inode * inode, struct file * file); | 113 | static int ubd_release(struct inode * inode, struct file * file); |
118 | static int ubd_ioctl(struct inode * inode, struct file * file, | 114 | static int ubd_ioctl(struct inode * inode, struct file * file, |
@@ -169,6 +165,7 @@ struct ubd { | |||
169 | struct platform_device pdev; | 165 | struct platform_device pdev; |
170 | struct request_queue *queue; | 166 | struct request_queue *queue; |
171 | spinlock_t lock; | 167 | spinlock_t lock; |
168 | int active; | ||
172 | }; | 169 | }; |
173 | 170 | ||
174 | #define DEFAULT_COW { \ | 171 | #define DEFAULT_COW { \ |
@@ -190,6 +187,7 @@ struct ubd { | |||
190 | .shared = 0, \ | 187 | .shared = 0, \ |
191 | .cow = DEFAULT_COW, \ | 188 | .cow = DEFAULT_COW, \ |
192 | .lock = SPIN_LOCK_UNLOCKED, \ | 189 | .lock = SPIN_LOCK_UNLOCKED, \ |
190 | .active = 0, \ | ||
193 | } | 191 | } |
194 | 192 | ||
195 | /* Protected by ubd_lock */ | 193 | /* Protected by ubd_lock */ |
@@ -507,7 +505,6 @@ static void ubd_handler(void) | |||
507 | struct ubd *dev; | 505 | struct ubd *dev; |
508 | int n; | 506 | int n; |
509 | 507 | ||
510 | do_ubd = 0; | ||
511 | n = os_read_file(thread_fd, &req, sizeof(req)); | 508 | n = os_read_file(thread_fd, &req, sizeof(req)); |
512 | if(n != sizeof(req)){ | 509 | if(n != sizeof(req)){ |
513 | printk(KERN_ERR "Pid %d - spurious interrupt in ubd_handler, " | 510 | printk(KERN_ERR "Pid %d - spurious interrupt in ubd_handler, " |
@@ -517,6 +514,7 @@ static void ubd_handler(void) | |||
517 | 514 | ||
518 | rq = req.req; | 515 | rq = req.req; |
519 | dev = rq->rq_disk->private_data; | 516 | dev = rq->rq_disk->private_data; |
517 | dev->active = 0; | ||
520 | 518 | ||
521 | ubd_finish(rq, req.error); | 519 | ubd_finish(rq, req.error); |
522 | reactivate_fd(thread_fd, UBD_IRQ); | 520 | reactivate_fd(thread_fd, UBD_IRQ); |
@@ -1081,11 +1079,12 @@ static void do_ubd_request(request_queue_t *q) | |||
1081 | } | 1079 | } |
1082 | } | 1080 | } |
1083 | else { | 1081 | else { |
1084 | if(do_ubd || (req = elv_next_request(q)) == NULL) | 1082 | struct ubd *dev = q->queuedata; |
1083 | if(dev->active || (req = elv_next_request(q)) == NULL) | ||
1085 | return; | 1084 | return; |
1086 | err = prepare_request(req, &io_req); | 1085 | err = prepare_request(req, &io_req); |
1087 | if(!err){ | 1086 | if(!err){ |
1088 | do_ubd = 1; | 1087 | dev->active = 1; |
1089 | n = os_write_file(thread_fd, (char *) &io_req, | 1088 | n = os_write_file(thread_fd, (char *) &io_req, |
1090 | sizeof(io_req)); | 1089 | sizeof(io_req)); |
1091 | if(n != sizeof(io_req)) | 1090 | if(n != sizeof(io_req)) |