|
@@ -63,21 +63,6 @@ struct nbd_device {
|
|
|
|
|
|
#define NBD_MAGIC 0x68797548
|
|
#define NBD_MAGIC 0x68797548
|
|
|
|
|
|
-#ifdef NDEBUG
|
|
|
|
-#define dprintk(flags, fmt...)
|
|
|
|
-#else /* NDEBUG */
|
|
|
|
-#define dprintk(flags, fmt...) do { \
|
|
|
|
- if (debugflags & (flags)) printk(KERN_DEBUG fmt); \
|
|
|
|
-} while (0)
|
|
|
|
-#define DBG_IOCTL 0x0004
|
|
|
|
-#define DBG_INIT 0x0010
|
|
|
|
-#define DBG_EXIT 0x0020
|
|
|
|
-#define DBG_BLKDEV 0x0100
|
|
|
|
-#define DBG_RX 0x0200
|
|
|
|
-#define DBG_TX 0x0400
|
|
|
|
-static unsigned int debugflags;
|
|
|
|
-#endif /* NDEBUG */
|
|
|
|
-
|
|
|
|
static unsigned int nbds_max = 16;
|
|
static unsigned int nbds_max = 16;
|
|
static struct nbd_device *nbd_dev;
|
|
static struct nbd_device *nbd_dev;
|
|
static int max_part;
|
|
static int max_part;
|
|
@@ -94,25 +79,9 @@ static int max_part;
|
|
*/
|
|
*/
|
|
static DEFINE_SPINLOCK(nbd_lock);
|
|
static DEFINE_SPINLOCK(nbd_lock);
|
|
|
|
|
|
-#ifndef NDEBUG
|
|
|
|
-static const char *ioctl_cmd_to_ascii(int cmd)
|
|
|
|
|
|
+static inline struct device *nbd_to_dev(struct nbd_device *nbd)
|
|
{
|
|
{
|
|
- switch (cmd) {
|
|
|
|
- case NBD_SET_SOCK: return "set-sock";
|
|
|
|
- case NBD_SET_BLKSIZE: return "set-blksize";
|
|
|
|
- case NBD_SET_SIZE: return "set-size";
|
|
|
|
- case NBD_SET_TIMEOUT: return "set-timeout";
|
|
|
|
- case NBD_SET_FLAGS: return "set-flags";
|
|
|
|
- case NBD_DO_IT: return "do-it";
|
|
|
|
- case NBD_CLEAR_SOCK: return "clear-sock";
|
|
|
|
- case NBD_CLEAR_QUE: return "clear-que";
|
|
|
|
- case NBD_PRINT_DEBUG: return "print-debug";
|
|
|
|
- case NBD_SET_SIZE_BLOCKS: return "set-size-blocks";
|
|
|
|
- case NBD_DISCONNECT: return "disconnect";
|
|
|
|
- case BLKROSET: return "set-read-only";
|
|
|
|
- case BLKFLSBUF: return "flush-buffer-cache";
|
|
|
|
- }
|
|
|
|
- return "unknown";
|
|
|
|
|
|
+ return disk_to_dev(nbd->disk);
|
|
}
|
|
}
|
|
|
|
|
|
static const char *nbdcmd_to_ascii(int cmd)
|
|
static const char *nbdcmd_to_ascii(int cmd)
|
|
@@ -126,16 +95,15 @@ static const char *nbdcmd_to_ascii(int cmd)
|
|
}
|
|
}
|
|
return "invalid";
|
|
return "invalid";
|
|
}
|
|
}
|
|
-#endif /* NDEBUG */
|
|
|
|
|
|
|
|
-static void nbd_end_request(struct request *req)
|
|
|
|
|
|
+static void nbd_end_request(struct nbd_device *nbd, struct request *req)
|
|
{
|
|
{
|
|
int error = req->errors ? -EIO : 0;
|
|
int error = req->errors ? -EIO : 0;
|
|
struct request_queue *q = req->q;
|
|
struct request_queue *q = req->q;
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
|
|
|
|
- dprintk(DBG_BLKDEV, "%s: request %p: %s\n", req->rq_disk->disk_name,
|
|
|
|
- req, error ? "failed" : "done");
|
|
|
|
|
|
+ dev_dbg(nbd_to_dev(nbd), "request %p: %s\n", req,
|
|
|
|
+ error ? "failed" : "done");
|
|
|
|
|
|
spin_lock_irqsave(q->queue_lock, flags);
|
|
spin_lock_irqsave(q->queue_lock, flags);
|
|
__blk_end_request_all(req, error);
|
|
__blk_end_request_all(req, error);
|
|
@@ -276,11 +244,9 @@ static int nbd_send_req(struct nbd_device *nbd, struct request *req)
|
|
}
|
|
}
|
|
memcpy(request.handle, &req, sizeof(req));
|
|
memcpy(request.handle, &req, sizeof(req));
|
|
|
|
|
|
- dprintk(DBG_TX, "%s: request %p: sending control (%s@%llu,%uB)\n",
|
|
|
|
- nbd->disk->disk_name, req,
|
|
|
|
- nbdcmd_to_ascii(nbd_cmd(req)),
|
|
|
|
- (unsigned long long)blk_rq_pos(req) << 9,
|
|
|
|
- blk_rq_bytes(req));
|
|
|
|
|
|
+ dev_dbg(nbd_to_dev(nbd), "request %p: sending control (%s@%llu,%uB)\n",
|
|
|
|
+ req, nbdcmd_to_ascii(nbd_cmd(req)),
|
|
|
|
+ (unsigned long long)blk_rq_pos(req) << 9, blk_rq_bytes(req));
|
|
result = sock_xmit(nbd, 1, &request, sizeof(request),
|
|
result = sock_xmit(nbd, 1, &request, sizeof(request),
|
|
(nbd_cmd(req) == NBD_CMD_WRITE) ? MSG_MORE : 0);
|
|
(nbd_cmd(req) == NBD_CMD_WRITE) ? MSG_MORE : 0);
|
|
if (result <= 0) {
|
|
if (result <= 0) {
|
|
@@ -300,8 +266,8 @@ static int nbd_send_req(struct nbd_device *nbd, struct request *req)
|
|
flags = 0;
|
|
flags = 0;
|
|
if (!rq_iter_last(bvec, iter))
|
|
if (!rq_iter_last(bvec, iter))
|
|
flags = MSG_MORE;
|
|
flags = MSG_MORE;
|
|
- dprintk(DBG_TX, "%s: request %p: sending %d bytes data\n",
|
|
|
|
- nbd->disk->disk_name, req, bvec.bv_len);
|
|
|
|
|
|
+ dev_dbg(nbd_to_dev(nbd), "request %p: sending %d bytes data\n",
|
|
|
|
+ req, bvec.bv_len);
|
|
result = sock_send_bvec(nbd, &bvec, flags);
|
|
result = sock_send_bvec(nbd, &bvec, flags);
|
|
if (result <= 0) {
|
|
if (result <= 0) {
|
|
dev_err(disk_to_dev(nbd->disk),
|
|
dev_err(disk_to_dev(nbd->disk),
|
|
@@ -394,8 +360,7 @@ static struct request *nbd_read_stat(struct nbd_device *nbd)
|
|
return req;
|
|
return req;
|
|
}
|
|
}
|
|
|
|
|
|
- dprintk(DBG_RX, "%s: request %p: got reply\n",
|
|
|
|
- nbd->disk->disk_name, req);
|
|
|
|
|
|
+ dev_dbg(nbd_to_dev(nbd), "request %p: got reply\n", req);
|
|
if (nbd_cmd(req) == NBD_CMD_READ) {
|
|
if (nbd_cmd(req) == NBD_CMD_READ) {
|
|
struct req_iterator iter;
|
|
struct req_iterator iter;
|
|
struct bio_vec bvec;
|
|
struct bio_vec bvec;
|
|
@@ -408,8 +373,8 @@ static struct request *nbd_read_stat(struct nbd_device *nbd)
|
|
req->errors++;
|
|
req->errors++;
|
|
return req;
|
|
return req;
|
|
}
|
|
}
|
|
- dprintk(DBG_RX, "%s: request %p: got %d bytes data\n",
|
|
|
|
- nbd->disk->disk_name, req, bvec.bv_len);
|
|
|
|
|
|
+ dev_dbg(nbd_to_dev(nbd), "request %p: got %d bytes data\n",
|
|
|
|
+ req, bvec.bv_len);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return req;
|
|
return req;
|
|
@@ -449,7 +414,7 @@ static int nbd_do_it(struct nbd_device *nbd)
|
|
}
|
|
}
|
|
|
|
|
|
while ((req = nbd_read_stat(nbd)) != NULL)
|
|
while ((req = nbd_read_stat(nbd)) != NULL)
|
|
- nbd_end_request(req);
|
|
|
|
|
|
+ nbd_end_request(nbd, req);
|
|
|
|
|
|
device_remove_file(disk_to_dev(nbd->disk), &pid_attr);
|
|
device_remove_file(disk_to_dev(nbd->disk), &pid_attr);
|
|
nbd->pid = 0;
|
|
nbd->pid = 0;
|
|
@@ -478,7 +443,7 @@ static void nbd_clear_que(struct nbd_device *nbd)
|
|
queuelist);
|
|
queuelist);
|
|
list_del_init(&req->queuelist);
|
|
list_del_init(&req->queuelist);
|
|
req->errors++;
|
|
req->errors++;
|
|
- nbd_end_request(req);
|
|
|
|
|
|
+ nbd_end_request(nbd, req);
|
|
}
|
|
}
|
|
|
|
|
|
while (!list_empty(&nbd->waiting_queue)) {
|
|
while (!list_empty(&nbd->waiting_queue)) {
|
|
@@ -486,7 +451,7 @@ static void nbd_clear_que(struct nbd_device *nbd)
|
|
queuelist);
|
|
queuelist);
|
|
list_del_init(&req->queuelist);
|
|
list_del_init(&req->queuelist);
|
|
req->errors++;
|
|
req->errors++;
|
|
- nbd_end_request(req);
|
|
|
|
|
|
+ nbd_end_request(nbd, req);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -530,7 +495,7 @@ static void nbd_handle_req(struct nbd_device *nbd, struct request *req)
|
|
if (nbd_send_req(nbd, req) != 0) {
|
|
if (nbd_send_req(nbd, req) != 0) {
|
|
dev_err(disk_to_dev(nbd->disk), "Request send failed\n");
|
|
dev_err(disk_to_dev(nbd->disk), "Request send failed\n");
|
|
req->errors++;
|
|
req->errors++;
|
|
- nbd_end_request(req);
|
|
|
|
|
|
+ nbd_end_request(nbd, req);
|
|
} else {
|
|
} else {
|
|
spin_lock(&nbd->queue_lock);
|
|
spin_lock(&nbd->queue_lock);
|
|
list_add_tail(&req->queuelist, &nbd->queue_head);
|
|
list_add_tail(&req->queuelist, &nbd->queue_head);
|
|
@@ -545,7 +510,7 @@ static void nbd_handle_req(struct nbd_device *nbd, struct request *req)
|
|
|
|
|
|
error_out:
|
|
error_out:
|
|
req->errors++;
|
|
req->errors++;
|
|
- nbd_end_request(req);
|
|
|
|
|
|
+ nbd_end_request(nbd, req);
|
|
}
|
|
}
|
|
|
|
|
|
static int nbd_thread(void *data)
|
|
static int nbd_thread(void *data)
|
|
@@ -593,18 +558,18 @@ static void do_nbd_request(struct request_queue *q)
|
|
|
|
|
|
spin_unlock_irq(q->queue_lock);
|
|
spin_unlock_irq(q->queue_lock);
|
|
|
|
|
|
- dprintk(DBG_BLKDEV, "%s: request %p: dequeued (flags=%x)\n",
|
|
|
|
- req->rq_disk->disk_name, req, req->cmd_type);
|
|
|
|
-
|
|
|
|
nbd = req->rq_disk->private_data;
|
|
nbd = req->rq_disk->private_data;
|
|
|
|
|
|
BUG_ON(nbd->magic != NBD_MAGIC);
|
|
BUG_ON(nbd->magic != NBD_MAGIC);
|
|
|
|
|
|
|
|
+ dev_dbg(nbd_to_dev(nbd), "request %p: dequeued (flags=%x)\n",
|
|
|
|
+ req, req->cmd_type);
|
|
|
|
+
|
|
if (unlikely(!nbd->sock)) {
|
|
if (unlikely(!nbd->sock)) {
|
|
dev_err(disk_to_dev(nbd->disk),
|
|
dev_err(disk_to_dev(nbd->disk),
|
|
"Attempted send on closed socket\n");
|
|
"Attempted send on closed socket\n");
|
|
req->errors++;
|
|
req->errors++;
|
|
- nbd_end_request(req);
|
|
|
|
|
|
+ nbd_end_request(nbd, req);
|
|
spin_lock_irq(q->queue_lock);
|
|
spin_lock_irq(q->queue_lock);
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
@@ -791,10 +756,6 @@ static int nbd_ioctl(struct block_device *bdev, fmode_t mode,
|
|
|
|
|
|
BUG_ON(nbd->magic != NBD_MAGIC);
|
|
BUG_ON(nbd->magic != NBD_MAGIC);
|
|
|
|
|
|
- /* Anyone capable of this syscall can do *real bad* things */
|
|
|
|
- dprintk(DBG_IOCTL, "%s: nbd_ioctl cmd=%s(0x%x) arg=%lu\n",
|
|
|
|
- nbd->disk->disk_name, ioctl_cmd_to_ascii(cmd), cmd, arg);
|
|
|
|
-
|
|
|
|
mutex_lock(&nbd->tx_lock);
|
|
mutex_lock(&nbd->tx_lock);
|
|
error = __nbd_ioctl(bdev, nbd, cmd, arg);
|
|
error = __nbd_ioctl(bdev, nbd, cmd, arg);
|
|
mutex_unlock(&nbd->tx_lock);
|
|
mutex_unlock(&nbd->tx_lock);
|
|
@@ -884,7 +845,6 @@ static int __init nbd_init(void)
|
|
}
|
|
}
|
|
|
|
|
|
printk(KERN_INFO "nbd: registered device at major %d\n", NBD_MAJOR);
|
|
printk(KERN_INFO "nbd: registered device at major %d\n", NBD_MAJOR);
|
|
- dprintk(DBG_INIT, "nbd: debugflags=0x%x\n", debugflags);
|
|
|
|
|
|
|
|
for (i = 0; i < nbds_max; i++) {
|
|
for (i = 0; i < nbds_max; i++) {
|
|
struct gendisk *disk = nbd_dev[i].disk;
|
|
struct gendisk *disk = nbd_dev[i].disk;
|
|
@@ -943,7 +903,3 @@ module_param(nbds_max, int, 0444);
|
|
MODULE_PARM_DESC(nbds_max, "number of network block devices to initialize (default: 16)");
|
|
MODULE_PARM_DESC(nbds_max, "number of network block devices to initialize (default: 16)");
|
|
module_param(max_part, int, 0444);
|
|
module_param(max_part, int, 0444);
|
|
MODULE_PARM_DESC(max_part, "number of partitions per device (default: 0)");
|
|
MODULE_PARM_DESC(max_part, "number of partitions per device (default: 0)");
|
|
-#ifndef NDEBUG
|
|
|
|
-module_param(debugflags, int, 0644);
|
|
|
|
-MODULE_PARM_DESC(debugflags, "flags for controlling debug output");
|
|
|
|
-#endif
|
|
|