aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/drivers/ubd_kern.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/um/drivers/ubd_kern.c')
-rw-r--r--arch/um/drivers/ubd_kern.c41
1 files changed, 26 insertions, 15 deletions
diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c
index 5ef47b73ce99..9200a457eb98 100644
--- a/arch/um/drivers/ubd_kern.c
+++ b/arch/um/drivers/ubd_kern.c
@@ -503,7 +503,7 @@ static LIST_HEAD(restart);
503/* Called without dev->lock held, and only in interrupt context. */ 503/* Called without dev->lock held, and only in interrupt context. */
504static void ubd_handler(void) 504static void ubd_handler(void)
505{ 505{
506 struct io_thread_req req; 506 struct io_thread_req *req;
507 struct request *rq; 507 struct request *rq;
508 struct ubd *ubd; 508 struct ubd *ubd;
509 struct list_head *list, *next_ele; 509 struct list_head *list, *next_ele;
@@ -511,7 +511,8 @@ static void ubd_handler(void)
511 int n; 511 int n;
512 512
513 while(1){ 513 while(1){
514 n = os_read_file_k(thread_fd, &req, sizeof(req)); 514 n = os_read_file_k(thread_fd, &req,
515 sizeof(struct io_thread_req *));
515 if(n != sizeof(req)){ 516 if(n != sizeof(req)){
516 if(n == -EAGAIN) 517 if(n == -EAGAIN)
517 break; 518 break;
@@ -520,10 +521,11 @@ static void ubd_handler(void)
520 return; 521 return;
521 } 522 }
522 523
523 rq = req.req; 524 rq = req->req;
524 rq->nr_sectors -= req.length >> 9; 525 rq->nr_sectors -= req->length >> 9;
525 if(rq->nr_sectors == 0) 526 if(rq->nr_sectors == 0)
526 ubd_finish(rq, rq->hard_nr_sectors << 9); 527 ubd_finish(rq, rq->hard_nr_sectors << 9);
528 kfree(req);
527 } 529 }
528 reactivate_fd(thread_fd, UBD_IRQ); 530 reactivate_fd(thread_fd, UBD_IRQ);
529 531
@@ -1078,7 +1080,7 @@ static void prepare_request(struct request *req, struct io_thread_req *io_req,
1078/* Called with dev->lock held */ 1080/* Called with dev->lock held */
1079static void do_ubd_request(request_queue_t *q) 1081static void do_ubd_request(request_queue_t *q)
1080{ 1082{
1081 struct io_thread_req io_req; 1083 struct io_thread_req *io_req;
1082 struct request *req; 1084 struct request *req;
1083 int n; 1085 int n;
1084 1086
@@ -1099,13 +1101,20 @@ static void do_ubd_request(request_queue_t *q)
1099 while(dev->start_sg < dev->end_sg){ 1101 while(dev->start_sg < dev->end_sg){
1100 struct scatterlist *sg = &dev->sg[dev->start_sg]; 1102 struct scatterlist *sg = &dev->sg[dev->start_sg];
1101 1103
1102 prepare_request(req, &io_req, 1104 io_req = kmalloc(sizeof(struct io_thread_req),
1105 GFP_KERNEL | GFP_ATOMIC);
1106 if(io_req == NULL){
1107 if(list_empty(&dev->restart))
1108 list_add(&dev->restart, &restart);
1109 return;
1110 }
1111 prepare_request(req, io_req,
1103 (unsigned long long) req->sector << 9, 1112 (unsigned long long) req->sector << 9,
1104 sg->offset, sg->length, sg->page); 1113 sg->offset, sg->length, sg->page);
1105 1114
1106 n = os_write_file_k(thread_fd, (char *) &io_req, 1115 n = os_write_file_k(thread_fd, &io_req,
1107 sizeof(io_req)); 1116 sizeof(struct io_thread_req *));
1108 if(n != sizeof(io_req)){ 1117 if(n != sizeof(struct io_thread_req *)){
1109 if(n != -EAGAIN) 1118 if(n != -EAGAIN)
1110 printk("write to io thread failed, " 1119 printk("write to io thread failed, "
1111 "errno = %d\n", -n); 1120 "errno = %d\n", -n);
@@ -1437,13 +1446,14 @@ static int io_count = 0;
1437 1446
1438int io_thread(void *arg) 1447int io_thread(void *arg)
1439{ 1448{
1440 struct io_thread_req req; 1449 struct io_thread_req *req;
1441 int n; 1450 int n;
1442 1451
1443 ignore_sigwinch_sig(); 1452 ignore_sigwinch_sig();
1444 while(1){ 1453 while(1){
1445 n = os_read_file_k(kernel_fd, &req, sizeof(req)); 1454 n = os_read_file_k(kernel_fd, &req,
1446 if(n != sizeof(req)){ 1455 sizeof(struct io_thread_req *));
1456 if(n != sizeof(struct io_thread_req *)){
1447 if(n < 0) 1457 if(n < 0)
1448 printk("io_thread - read failed, fd = %d, " 1458 printk("io_thread - read failed, fd = %d, "
1449 "err = %d\n", kernel_fd, -n); 1459 "err = %d\n", kernel_fd, -n);
@@ -1454,9 +1464,10 @@ int io_thread(void *arg)
1454 continue; 1464 continue;
1455 } 1465 }
1456 io_count++; 1466 io_count++;
1457 do_io(&req); 1467 do_io(req);
1458 n = os_write_file_k(kernel_fd, &req, sizeof(req)); 1468 n = os_write_file_k(kernel_fd, &req,
1459 if(n != sizeof(req)) 1469 sizeof(struct io_thread_req *));
1470 if(n != sizeof(struct io_thread_req *))
1460 printk("io_thread - write failed, fd = %d, err = %d\n", 1471 printk("io_thread - write failed, fd = %d, err = %d\n",
1461 kernel_fd, -n); 1472 kernel_fd, -n);
1462 } 1473 }