@@ -570,6 +570,55 @@ static int tapdisk_vbd_add_dirty_log(td_vbd_t *vbd)
570570 return err ;
571571}
572572
573+ static int tapdisk_vbd_add_rated (td_vbd_t * vbd )
574+ {
575+ int err ;
576+ td_driver_t * driver ;
577+ td_image_t * valve , * parent ;
578+
579+ driver = NULL ;
580+ valve = NULL ;
581+
582+ DPRINTF ("VALVE:tapdisk_vbd_add_rated called for %s with %s\n" ,
583+ vbd -> name , vbd -> rated_sockpath );
584+
585+ parent = tapdisk_vbd_first_image (vbd );
586+
587+ if (!parent )
588+ return - EINVAL ;
589+
590+ valve = tapdisk_image_allocate (vbd -> rated_sockpath ,
591+ DISK_TYPE_VALVE ,
592+ parent -> flags );
593+
594+ if (!valve )
595+ return - ENOMEM ;
596+
597+ driver = tapdisk_driver_allocate (valve -> type ,
598+ valve -> name ,
599+ valve -> flags );
600+
601+ if (!driver ) {
602+ err = - ENOMEM ;
603+ goto fail ;
604+ }
605+
606+ driver -> info = parent -> driver -> info ;
607+ valve -> driver = driver ;
608+
609+ err = td_open (valve , & vbd -> encryption );
610+ if (err )
611+ goto fail ;
612+
613+ list_add (& valve -> next , parent -> next .prev );
614+ tapdisk_vbd_debug (vbd );
615+ return 0 ;
616+
617+ fail :
618+ tapdisk_image_free (valve );
619+ return err ;
620+ }
621+
573622int
574623tapdisk_vbd_open_vdi (td_vbd_t * vbd , const char * name , td_flag_t flags , int prt_devnum )
575624{
@@ -623,9 +672,25 @@ tapdisk_vbd_open_vdi(td_vbd_t *vbd, const char *name, td_flag_t flags, int prt_d
623672 goto fail ;
624673 }
625674
675+ if (td_flag_test (vbd -> flags , TD_OPEN_RATED )) {
676+ if (!vbd -> rated_sockpath ) {
677+ err = - EINVAL ;
678+ goto fail ;
679+ }
680+ err = tapdisk_vbd_add_rated (vbd );
681+ if (err ) {
682+ EPRINTF ("VBD %d Error adding valve, %s\n" ,
683+ vbd -> uuid , strerror (- err ));
684+ goto fail ;
685+ }
686+ }
687+
626688 err = tapdisk_vbd_validate_chain (vbd );
627- if (err )
689+ if (err ) {
690+ EPRINTF ("VBD: failed to validate chain %s\n" ,
691+ strerror (- err ));
628692 goto fail ;
693+ }
629694
630695 if (td_flag_test (vbd -> flags , TD_OPEN_SECONDARY )) {
631696 err = tapdisk_vbd_add_secondary (vbd );
@@ -637,13 +702,13 @@ tapdisk_vbd_open_vdi(td_vbd_t *vbd, const char *name, td_flag_t flags, int prt_d
637702 }
638703 }
639704
640- err = vbd_stats_create (vbd );
641- if (err )
642- goto fail ;
705+ err = vbd_stats_create (vbd );
706+ if (err )
707+ goto fail ;
643708
644- err = td_metrics_vdi_start (vbd -> tap -> minor , & vbd -> vdi_stats );
645- if (err )
646- goto fail ;
709+ err = td_metrics_vdi_start (vbd -> tap -> minor , & vbd -> vdi_stats );
710+ if (err )
711+ goto fail ;
647712 if (tmp != vbd -> name )
648713 free (tmp );
649714
@@ -764,6 +829,10 @@ tapdisk_vbd_shutdown(td_vbd_t *vbd)
764829 tapdisk_vbd_detach (vbd );
765830 tapdisk_server_remove_vbd (vbd );
766831 free (vbd -> name );
832+ if (vbd -> logpath )
833+ free (vbd -> logpath );
834+ if (vbd -> rated_sockpath )
835+ free (vbd -> rated_sockpath );
767836 free (vbd );
768837
769838 return 0 ;
0 commit comments