@@ -570,6 +570,52 @@ 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+ valve = tapdisk_image_allocate (vbd -> rated_sockpath ,
588+ DISK_TYPE_VALVE ,
589+ parent -> flags );
590+
591+ if (!valve )
592+ return - ENOMEM ;
593+
594+ driver = tapdisk_driver_allocate (valve -> type ,
595+ valve -> name ,
596+ valve -> flags );
597+
598+ if (!driver ) {
599+ err = - ENOMEM ;
600+ goto fail ;
601+ }
602+
603+ driver -> info = parent -> driver -> info ;
604+ valve -> driver = driver ;
605+
606+ err = td_open (valve , & vbd -> encryption );
607+ if (err )
608+ goto fail ;
609+
610+ list_add (& valve -> next , parent -> next .prev );
611+ tapdisk_vbd_debug (vbd );
612+ return 0 ;
613+
614+ fail :
615+ tapdisk_image_free (valve );
616+ return err ;
617+ }
618+
573619int
574620tapdisk_vbd_open_vdi (td_vbd_t * vbd , const char * name , td_flag_t flags , int prt_devnum )
575621{
@@ -623,9 +669,25 @@ tapdisk_vbd_open_vdi(td_vbd_t *vbd, const char *name, td_flag_t flags, int prt_d
623669 goto fail ;
624670 }
625671
672+ if (td_flag_test (vbd -> flags , TD_OPEN_RATED )) {
673+ if (!vbd -> rated_sockpath ) {
674+ err = - EINVAL ;
675+ goto fail ;
676+ }
677+ err = tapdisk_vbd_add_rated (vbd );
678+ if (err ) {
679+ EPRINTF ("VBD %d Error adding valve, %s\n" ,
680+ vbd -> uuid , strerror (- err ));
681+ goto fail ;
682+ }
683+ }
684+
626685 err = tapdisk_vbd_validate_chain (vbd );
627- if (err )
686+ if (err ) {
687+ EPRINTF ("VBD: failed to validate chain %s\n" ,
688+ strerror (- err ));
628689 goto fail ;
690+ }
629691
630692 if (td_flag_test (vbd -> flags , TD_OPEN_SECONDARY )) {
631693 err = tapdisk_vbd_add_secondary (vbd );
@@ -637,13 +699,13 @@ tapdisk_vbd_open_vdi(td_vbd_t *vbd, const char *name, td_flag_t flags, int prt_d
637699 }
638700 }
639701
640- err = vbd_stats_create (vbd );
641- if (err )
642- goto fail ;
702+ err = vbd_stats_create (vbd );
703+ if (err )
704+ goto fail ;
643705
644- err = td_metrics_vdi_start (vbd -> tap -> minor , & vbd -> vdi_stats );
645- if (err )
646- goto fail ;
706+ err = td_metrics_vdi_start (vbd -> tap -> minor , & vbd -> vdi_stats );
707+ if (err )
708+ goto fail ;
647709 if (tmp != vbd -> name )
648710 free (tmp );
649711
@@ -764,6 +826,10 @@ tapdisk_vbd_shutdown(td_vbd_t *vbd)
764826 tapdisk_vbd_detach (vbd );
765827 tapdisk_server_remove_vbd (vbd );
766828 free (vbd -> name );
829+ if (vbd -> logpath )
830+ free (vbd -> logpath );
831+ if (vbd -> rated_sockpath )
832+ free (vbd -> rated_sockpath );
767833 free (vbd );
768834
769835 return 0 ;
0 commit comments