@@ -776,6 +776,61 @@ static int method_mark_image_read_only(sd_bus *bus, sd_bus_message *message, voi
776776 return bus_image_method_mark_read_only (bus , message , i , error );
777777}
778778
779+ static int method_set_pool_limit (sd_bus * bus , sd_bus_message * message , void * userdata , sd_bus_error * error ) {
780+ Manager * m = userdata ;
781+ uint64_t limit ;
782+ int r ;
783+
784+ assert (bus );
785+ r = sd_bus_message_read (message , "t" , & limit );
786+ if (r < 0 )
787+ return r ;
788+
789+ r = bus_verify_polkit_async (
790+ message ,
791+ CAP_SYS_ADMIN ,
792+ "org.freedesktop.machine1.manage-machines" ,
793+ false,
794+ UID_INVALID ,
795+ & m -> polkit_registry ,
796+ error );
797+ if (r < 0 )
798+ return r ;
799+ if (r == 0 )
800+ return 1 ; /* Will call us back */
801+
802+ r = btrfs_quota_limit ("/var/lib/machines" , limit );
803+ if (r == - ENOTTY )
804+ return sd_bus_error_setf (error , SD_BUS_ERROR_NOT_SUPPORTED , "Quota is only supported on btrfs." );
805+ else if (r < 0 )
806+ return sd_bus_error_set_errnof (error , r , "Failed to adjust quota limit: %m" );
807+
808+ return sd_bus_reply_method_return (message , NULL );
809+ }
810+
811+ static int method_set_image_limit (sd_bus * bus , sd_bus_message * message , void * userdata , sd_bus_error * error ) {
812+ _cleanup_ (image_unrefp ) Image * i = NULL ;
813+ const char * name ;
814+ int r ;
815+
816+ assert (bus );
817+ r = sd_bus_message_read (message , "s" , & name );
818+ if (r < 0 )
819+ return r ;
820+
821+ if (!image_name_is_valid (name ))
822+ return sd_bus_error_setf (error , SD_BUS_ERROR_INVALID_ARGS , "Image name '%s' is invalid." , name );
823+
824+ r = image_find (name , & i );
825+ if (r < 0 )
826+ return r ;
827+ if (r == 0 )
828+ return sd_bus_error_setf (error , BUS_ERROR_NO_SUCH_IMAGE , "No image '%s' known" , name );
829+
830+ i -> userdata = userdata ;
831+ return bus_image_method_set_limit (bus , message , i , error );
832+ }
833+
779834const sd_bus_vtable manager_vtable [] = {
780835 SD_BUS_VTABLE_START (0 ),
781836 SD_BUS_PROPERTY ("PoolPath" , "s" , property_get_pool_path , 0 , 0 ),
@@ -803,6 +858,8 @@ const sd_bus_vtable manager_vtable[] = {
803858 SD_BUS_METHOD ("RenameImage" , "ss" , NULL , method_rename_image , SD_BUS_VTABLE_UNPRIVILEGED ),
804859 SD_BUS_METHOD ("CloneImage" , "ssb" , NULL , method_clone_image , SD_BUS_VTABLE_UNPRIVILEGED ),
805860 SD_BUS_METHOD ("MarkImageReadOnly" , "sb" , NULL , method_mark_image_read_only , SD_BUS_VTABLE_UNPRIVILEGED ),
861+ SD_BUS_METHOD ("SetPoolLimit" , "t" , NULL , method_set_pool_limit , SD_BUS_VTABLE_UNPRIVILEGED ),
862+ SD_BUS_METHOD ("SetImageLimit" , "st" , NULL , method_set_image_limit , SD_BUS_VTABLE_UNPRIVILEGED ),
806863 SD_BUS_SIGNAL ("MachineNew" , "so" , 0 ),
807864 SD_BUS_SIGNAL ("MachineRemoved" , "so" , 0 ),
808865 SD_BUS_VTABLE_END
0 commit comments