Skip to content

Commit 0e4f0f6

Browse files
author
Markus Pargmann
committed
nbd: Cleanup reset of nbd and bdev after a disconnect
Group all variables that are reset after a disconnect into reset functions. This patch adds two of these functions, nbd_reset() and nbd_bdev_reset(). Signed-off-by: Markus Pargmann <[email protected]>
1 parent 1f7b5cf commit 0e4f0f6

File tree

1 file changed

+29
-11
lines changed

1 file changed

+29
-11
lines changed

drivers/block/nbd.c

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -617,6 +617,30 @@ static int nbd_set_socket(struct nbd_device *nbd, struct socket *sock)
617617
return ret;
618618
}
619619

620+
/* Reset all properties of an NBD device */
621+
static void nbd_reset(struct nbd_device *nbd)
622+
{
623+
nbd->disconnect = false;
624+
nbd->timedout = false;
625+
nbd->blksize = 1024;
626+
nbd->bytesize = 0;
627+
set_capacity(nbd->disk, 0);
628+
nbd->flags = 0;
629+
nbd->xmit_timeout = 0;
630+
queue_flag_clear_unlocked(QUEUE_FLAG_DISCARD, nbd->disk->queue);
631+
del_timer_sync(&nbd->timeout_timer);
632+
}
633+
634+
static void nbd_bdev_reset(struct block_device *bdev)
635+
{
636+
set_device_ro(bdev, false);
637+
bdev->bd_inode->i_size = 0;
638+
if (max_part > 0) {
639+
blkdev_reread_part(bdev);
640+
bdev->bd_invalidated = 1;
641+
}
642+
}
643+
620644
static int nbd_dev_dbg_init(struct nbd_device *nbd);
621645
static void nbd_dev_dbg_close(struct nbd_device *nbd);
622646

@@ -745,19 +769,15 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd,
745769
sock_shutdown(nbd);
746770
nbd_clear_que(nbd);
747771
kill_bdev(bdev);
748-
queue_flag_clear_unlocked(QUEUE_FLAG_DISCARD, nbd->disk->queue);
749-
set_device_ro(bdev, false);
750-
nbd->flags = 0;
751-
nbd->bytesize = 0;
752-
bdev->bd_inode->i_size = 0;
753-
set_capacity(nbd->disk, 0);
754-
if (max_part > 0)
755-
blkdev_reread_part(bdev);
772+
nbd_bdev_reset(bdev);
773+
756774
if (nbd->disconnect) /* user requested, ignore socket errors */
757775
error = 0;
758776
if (nbd->timedout)
759777
error = -ETIMEDOUT;
760778

779+
nbd_reset(nbd);
780+
761781
return error;
762782
}
763783

@@ -1023,14 +1043,12 @@ static int __init nbd_init(void)
10231043
nbd_dev[i].timeout_timer.data = (unsigned long)&nbd_dev[i];
10241044
init_waitqueue_head(&nbd_dev[i].active_wq);
10251045
init_waitqueue_head(&nbd_dev[i].waiting_wq);
1026-
nbd_dev[i].blksize = 1024;
1027-
nbd_dev[i].bytesize = 0;
10281046
disk->major = NBD_MAJOR;
10291047
disk->first_minor = i << part_shift;
10301048
disk->fops = &nbd_fops;
10311049
disk->private_data = &nbd_dev[i];
10321050
sprintf(disk->disk_name, "nbd%d", i);
1033-
set_capacity(disk, 0);
1051+
nbd_reset(&nbd_dev[i]);
10341052
add_disk(disk);
10351053
}
10361054

0 commit comments

Comments
 (0)