printk(KERN_ERR "nbd: %s - sock=%p at buf=%p, size=%d returned %d.\n",
send? "send": "receive", sock, buf, size, result);
#endif
+ if (result == 0)
+ result = -EPIPE; /* short read */
break;
}
size -= result;
up(&lo->tx_lock);
return;
- error_out:
+error_out:
up(&lo->tx_lock);
req->errors++;
}
if (result <= 0) {
printk(KERN_ERR "%s: Receive control failed (result %d)\n",
lo->disk->disk_name, result);
- lo->harderror = result;
- return NULL;
+ goto harderror;
}
req = nbd_find_request(lo, reply.handle);
if (req == NULL) {
printk(KERN_ERR "%s: Unexpected reply (%p)\n",
lo->disk->disk_name, reply.handle);
- lo->harderror = result;
- return NULL;
+ result = -EBADR;
+ goto harderror;
}
if (ntohl(reply.magic) != NBD_REPLY_MAGIC) {
printk(KERN_ERR "%s: Wrong magic (0x%lx)\n",
lo->disk->disk_name,
(unsigned long)ntohl(reply.magic));
- lo->harderror = result;
- return NULL;
+ result = -EPROTO;
+ goto harderror;
}
if (ntohl(reply.error)) {
printk(KERN_ERR "%s: Other side returned error (%d)\n",
printk(KERN_ERR "%s: Receive data failed (result %d)\n",
lo->disk->disk_name,
result);
- lo->harderror = result;
- return NULL;
+ goto harderror;
}
dprintk(DBG_RX, "%s: request %p: got %d bytes data\n",
lo->disk->disk_name, req, bvec->bv_len);
}
}
return req;
+harderror:
+ lo->harderror = result;
+ return NULL;
}
void nbd_do_it(struct nbd_device *lo)
#endif
while ((req = nbd_read_stat(lo)) != NULL)
nbd_end_request(req);
- printk(KERN_NOTICE "%s: req should never be null\n",
- lo->disk->disk_name);
return;
}
return 0;
out:
while (i--) {
- if (nbd_dev[i].disk->queue)
- blk_cleanup_queue(nbd_dev[i].disk->queue);
+ blk_cleanup_queue(nbd_dev[i].disk->queue);
put_disk(nbd_dev[i].disk);
}
return err;
for (i = 0; i < MAX_NBD; i++) {
struct gendisk *disk = nbd_dev[i].disk;
if (disk) {
- if (disk->queue)
- blk_cleanup_queue(disk->queue);
del_gendisk(disk);
+ blk_cleanup_queue(disk->queue);
put_disk(disk);
}
}