aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/block/nbd.c88
1 files changed, 22 insertions, 66 deletions
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
index 7139c8aae7a1..9e553a753410 100644
--- a/drivers/block/nbd.c
+++ b/drivers/block/nbd.c
@@ -63,21 +63,6 @@ struct nbd_device {
63 63
64#define NBD_MAGIC 0x68797548 64#define NBD_MAGIC 0x68797548
65 65
66#ifdef NDEBUG
67#define dprintk(flags, fmt...)
68#else /* NDEBUG */
69#define dprintk(flags, fmt...) do { \
70 if (debugflags & (flags)) printk(KERN_DEBUG fmt); \
71} while (0)
72#define DBG_IOCTL 0x0004
73#define DBG_INIT 0x0010
74#define DBG_EXIT 0x0020
75#define DBG_BLKDEV 0x0100
76#define DBG_RX 0x0200
77#define DBG_TX 0x0400
78static unsigned int debugflags;
79#endif /* NDEBUG */
80
81static unsigned int nbds_max = 16; 66static unsigned int nbds_max = 16;
82static struct nbd_device *nbd_dev; 67static struct nbd_device *nbd_dev;
83static int max_part; 68static int max_part;
@@ -94,25 +79,9 @@ static int max_part;
94 */ 79 */
95static DEFINE_SPINLOCK(nbd_lock); 80static DEFINE_SPINLOCK(nbd_lock);
96 81
97#ifndef NDEBUG 82static inline struct device *nbd_to_dev(struct nbd_device *nbd)
98static const char *ioctl_cmd_to_ascii(int cmd)
99{ 83{
100 switch (cmd) { 84 return disk_to_dev(nbd->disk);
101 case NBD_SET_SOCK: return "set-sock";
102 case NBD_SET_BLKSIZE: return "set-blksize";
103 case NBD_SET_SIZE: return "set-size";
104 case NBD_SET_TIMEOUT: return "set-timeout";
105 case NBD_SET_FLAGS: return "set-flags";
106 case NBD_DO_IT: return "do-it";
107 case NBD_CLEAR_SOCK: return "clear-sock";
108 case NBD_CLEAR_QUE: return "clear-que";
109 case NBD_PRINT_DEBUG: return "print-debug";
110 case NBD_SET_SIZE_BLOCKS: return "set-size-blocks";
111 case NBD_DISCONNECT: return "disconnect";
112 case BLKROSET: return "set-read-only";
113 case BLKFLSBUF: return "flush-buffer-cache";
114 }
115 return "unknown";
116} 85}
117 86
118static const char *nbdcmd_to_ascii(int cmd) 87static const char *nbdcmd_to_ascii(int cmd)
@@ -126,16 +95,15 @@ static const char *nbdcmd_to_ascii(int cmd)
126 } 95 }
127 return "invalid"; 96 return "invalid";
128} 97}
129#endif /* NDEBUG */
130 98
131static void nbd_end_request(struct request *req) 99static void nbd_end_request(struct nbd_device *nbd, struct request *req)
132{ 100{
133 int error = req->errors ? -EIO : 0; 101 int error = req->errors ? -EIO : 0;
134 struct request_queue *q = req->q; 102 struct request_queue *q = req->q;
135 unsigned long flags; 103 unsigned long flags;
136 104
137 dprintk(DBG_BLKDEV, "%s: request %p: %s\n", req->rq_disk->disk_name, 105 dev_dbg(nbd_to_dev(nbd), "request %p: %s\n", req,
138 req, error ? "failed" : "done"); 106 error ? "failed" : "done");
139 107
140 spin_lock_irqsave(q->queue_lock, flags); 108 spin_lock_irqsave(q->queue_lock, flags);
141 __blk_end_request_all(req, error); 109 __blk_end_request_all(req, error);
@@ -276,11 +244,9 @@ static int nbd_send_req(struct nbd_device *nbd, struct request *req)
276 } 244 }
277 memcpy(request.handle, &req, sizeof(req)); 245 memcpy(request.handle, &req, sizeof(req));
278 246
279 dprintk(DBG_TX, "%s: request %p: sending control (%s@%llu,%uB)\n", 247 dev_dbg(nbd_to_dev(nbd), "request %p: sending control (%s@%llu,%uB)\n",
280 nbd->disk->disk_name, req, 248 req, nbdcmd_to_ascii(nbd_cmd(req)),
281 nbdcmd_to_ascii(nbd_cmd(req)), 249 (unsigned long long)blk_rq_pos(req) << 9, blk_rq_bytes(req));
282 (unsigned long long)blk_rq_pos(req) << 9,
283 blk_rq_bytes(req));
284 result = sock_xmit(nbd, 1, &request, sizeof(request), 250 result = sock_xmit(nbd, 1, &request, sizeof(request),
285 (nbd_cmd(req) == NBD_CMD_WRITE) ? MSG_MORE : 0); 251 (nbd_cmd(req) == NBD_CMD_WRITE) ? MSG_MORE : 0);
286 if (result <= 0) { 252 if (result <= 0) {
@@ -300,8 +266,8 @@ static int nbd_send_req(struct nbd_device *nbd, struct request *req)
300 flags = 0; 266 flags = 0;
301 if (!rq_iter_last(bvec, iter)) 267 if (!rq_iter_last(bvec, iter))
302 flags = MSG_MORE; 268 flags = MSG_MORE;
303 dprintk(DBG_TX, "%s: request %p: sending %d bytes data\n", 269 dev_dbg(nbd_to_dev(nbd), "request %p: sending %d bytes data\n",
304 nbd->disk->disk_name, req, bvec.bv_len); 270 req, bvec.bv_len);
305 result = sock_send_bvec(nbd, &bvec, flags); 271 result = sock_send_bvec(nbd, &bvec, flags);
306 if (result <= 0) { 272 if (result <= 0) {
307 dev_err(disk_to_dev(nbd->disk), 273 dev_err(disk_to_dev(nbd->disk),
@@ -394,8 +360,7 @@ static struct request *nbd_read_stat(struct nbd_device *nbd)
394 return req; 360 return req;
395 } 361 }
396 362
397 dprintk(DBG_RX, "%s: request %p: got reply\n", 363 dev_dbg(nbd_to_dev(nbd), "request %p: got reply\n", req);
398 nbd->disk->disk_name, req);
399 if (nbd_cmd(req) == NBD_CMD_READ) { 364 if (nbd_cmd(req) == NBD_CMD_READ) {
400 struct req_iterator iter; 365 struct req_iterator iter;
401 struct bio_vec bvec; 366 struct bio_vec bvec;
@@ -408,8 +373,8 @@ static struct request *nbd_read_stat(struct nbd_device *nbd)
408 req->errors++; 373 req->errors++;
409 return req; 374 return req;
410 } 375 }
411 dprintk(DBG_RX, "%s: request %p: got %d bytes data\n", 376 dev_dbg(nbd_to_dev(nbd), "request %p: got %d bytes data\n",
412 nbd->disk->disk_name, req, bvec.bv_len); 377 req, bvec.bv_len);
413 } 378 }
414 } 379 }
415 return req; 380 return req;
@@ -449,7 +414,7 @@ static int nbd_do_it(struct nbd_device *nbd)
449 } 414 }
450 415
451 while ((req = nbd_read_stat(nbd)) != NULL) 416 while ((req = nbd_read_stat(nbd)) != NULL)
452 nbd_end_request(req); 417 nbd_end_request(nbd, req);
453 418
454 device_remove_file(disk_to_dev(nbd->disk), &pid_attr); 419 device_remove_file(disk_to_dev(nbd->disk), &pid_attr);
455 nbd->pid = 0; 420 nbd->pid = 0;
@@ -478,7 +443,7 @@ static void nbd_clear_que(struct nbd_device *nbd)
478 queuelist); 443 queuelist);
479 list_del_init(&req->queuelist); 444 list_del_init(&req->queuelist);
480 req->errors++; 445 req->errors++;
481 nbd_end_request(req); 446 nbd_end_request(nbd, req);
482 } 447 }
483 448
484 while (!list_empty(&nbd->waiting_queue)) { 449 while (!list_empty(&nbd->waiting_queue)) {
@@ -486,7 +451,7 @@ static void nbd_clear_que(struct nbd_device *nbd)
486 queuelist); 451 queuelist);
487 list_del_init(&req->queuelist); 452 list_del_init(&req->queuelist);
488 req->errors++; 453 req->errors++;
489 nbd_end_request(req); 454 nbd_end_request(nbd, req);
490 } 455 }
491} 456}
492 457
@@ -530,7 +495,7 @@ static void nbd_handle_req(struct nbd_device *nbd, struct request *req)
530 if (nbd_send_req(nbd, req) != 0) { 495 if (nbd_send_req(nbd, req) != 0) {
531 dev_err(disk_to_dev(nbd->disk), "Request send failed\n"); 496 dev_err(disk_to_dev(nbd->disk), "Request send failed\n");
532 req->errors++; 497 req->errors++;
533 nbd_end_request(req); 498 nbd_end_request(nbd, req);
534 } else { 499 } else {
535 spin_lock(&nbd->queue_lock); 500 spin_lock(&nbd->queue_lock);
536 list_add_tail(&req->queuelist, &nbd->queue_head); 501 list_add_tail(&req->queuelist, &nbd->queue_head);
@@ -545,7 +510,7 @@ static void nbd_handle_req(struct nbd_device *nbd, struct request *req)
545 510
546error_out: 511error_out:
547 req->errors++; 512 req->errors++;
548 nbd_end_request(req); 513 nbd_end_request(nbd, req);
549} 514}
550 515
551static int nbd_thread(void *data) 516static int nbd_thread(void *data)
@@ -593,18 +558,18 @@ static void do_nbd_request(struct request_queue *q)
593 558
594 spin_unlock_irq(q->queue_lock); 559 spin_unlock_irq(q->queue_lock);
595 560
596 dprintk(DBG_BLKDEV, "%s: request %p: dequeued (flags=%x)\n",
597 req->rq_disk->disk_name, req, req->cmd_type);
598
599 nbd = req->rq_disk->private_data; 561 nbd = req->rq_disk->private_data;
600 562
601 BUG_ON(nbd->magic != NBD_MAGIC); 563 BUG_ON(nbd->magic != NBD_MAGIC);
602 564
565 dev_dbg(nbd_to_dev(nbd), "request %p: dequeued (flags=%x)\n",
566 req, req->cmd_type);
567
603 if (unlikely(!nbd->sock)) { 568 if (unlikely(!nbd->sock)) {
604 dev_err(disk_to_dev(nbd->disk), 569 dev_err(disk_to_dev(nbd->disk),
605 "Attempted send on closed socket\n"); 570 "Attempted send on closed socket\n");
606 req->errors++; 571 req->errors++;
607 nbd_end_request(req); 572 nbd_end_request(nbd, req);
608 spin_lock_irq(q->queue_lock); 573 spin_lock_irq(q->queue_lock);
609 continue; 574 continue;
610 } 575 }
@@ -791,10 +756,6 @@ static int nbd_ioctl(struct block_device *bdev, fmode_t mode,
791 756
792 BUG_ON(nbd->magic != NBD_MAGIC); 757 BUG_ON(nbd->magic != NBD_MAGIC);
793 758
794 /* Anyone capable of this syscall can do *real bad* things */
795 dprintk(DBG_IOCTL, "%s: nbd_ioctl cmd=%s(0x%x) arg=%lu\n",
796 nbd->disk->disk_name, ioctl_cmd_to_ascii(cmd), cmd, arg);
797
798 mutex_lock(&nbd->tx_lock); 759 mutex_lock(&nbd->tx_lock);
799 error = __nbd_ioctl(bdev, nbd, cmd, arg); 760 error = __nbd_ioctl(bdev, nbd, cmd, arg);
800 mutex_unlock(&nbd->tx_lock); 761 mutex_unlock(&nbd->tx_lock);
@@ -884,7 +845,6 @@ static int __init nbd_init(void)
884 } 845 }
885 846
886 printk(KERN_INFO "nbd: registered device at major %d\n", NBD_MAJOR); 847 printk(KERN_INFO "nbd: registered device at major %d\n", NBD_MAJOR);
887 dprintk(DBG_INIT, "nbd: debugflags=0x%x\n", debugflags);
888 848
889 for (i = 0; i < nbds_max; i++) { 849 for (i = 0; i < nbds_max; i++) {
890 struct gendisk *disk = nbd_dev[i].disk; 850 struct gendisk *disk = nbd_dev[i].disk;
@@ -943,7 +903,3 @@ module_param(nbds_max, int, 0444);
943MODULE_PARM_DESC(nbds_max, "number of network block devices to initialize (default: 16)"); 903MODULE_PARM_DESC(nbds_max, "number of network block devices to initialize (default: 16)");
944module_param(max_part, int, 0444); 904module_param(max_part, int, 0444);
945MODULE_PARM_DESC(max_part, "number of partitions per device (default: 0)"); 905MODULE_PARM_DESC(max_part, "number of partitions per device (default: 0)");
946#ifndef NDEBUG
947module_param(debugflags, int, 0644);
948MODULE_PARM_DESC(debugflags, "flags for controlling debug output");
949#endif