@@ -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+
620644static int nbd_dev_dbg_init (struct nbd_device * nbd );
621645static 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