qga: Disable unsupported commands by default
Currently management softwares cannot know whether a qemu-ga command is supported or not on the running platform until they actually execute it. This patch disables unsupported commands at launch time of qemu-ga, so that management softwares can check whether they are supported from 'enabled' property of the result from 'guest-info' command. Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama@hds.com> Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
		
							parent
							
								
									46d4c5723e
								
							
						
					
					
						commit
						1281c08a46
					
				| @ -1955,6 +1955,44 @@ void qmp_guest_fstrim(bool has_minimum, int64_t minimum, Error **errp) | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| /* add unsupported commands to the blacklist */ | ||||
| GList *ga_command_blacklist_init(GList *blacklist) | ||||
| { | ||||
| #if !defined(__linux__) | ||||
|     { | ||||
|         const char *list[] = { | ||||
|             "guest-suspend-disk", "guest-suspend-ram", | ||||
|             "guest-suspend-hybrid", "guest-network-get-interfaces", | ||||
|             "guest-get-vcpus", "guest-set-vcpus", NULL}; | ||||
|         char **p = (char **)list; | ||||
| 
 | ||||
|         while (*p) { | ||||
|             blacklist = g_list_append(blacklist, *p++); | ||||
|         } | ||||
|     } | ||||
| #endif | ||||
| 
 | ||||
| #if !defined(CONFIG_FSFREEZE) | ||||
|     { | ||||
|         const char *list[] = { | ||||
|             "guest-get-fsinfo", "guest-fsfreeze-status", | ||||
|             "guest-fsfreeze-freeze", "guest-fsfreeze-freeze-list", | ||||
|             "guest-fsfreeze-thaw", "guest-get-fsinfo", NULL}; | ||||
|         char **p = (char **)list; | ||||
| 
 | ||||
|         while (*p) { | ||||
|             blacklist = g_list_append(blacklist, *p++); | ||||
|         } | ||||
|     } | ||||
| #endif | ||||
| 
 | ||||
| #if !defined(CONFIG_FSTRIM) | ||||
|     blacklist = g_list_append(blacklist, (char *)"guest-fstrim"); | ||||
| #endif | ||||
| 
 | ||||
|     return blacklist; | ||||
| } | ||||
| 
 | ||||
| /* register init/cleanup routines for stateful command groups */ | ||||
| void ga_command_state_init(GAState *s, GACommandState *cs) | ||||
| { | ||||
|  | ||||
| @ -446,10 +446,40 @@ int64_t qmp_guest_set_vcpus(GuestLogicalProcessorList *vcpus, Error **errp) | ||||
|     return -1; | ||||
| } | ||||
| 
 | ||||
| /* add unsupported commands to the blacklist */ | ||||
| GList *ga_command_blacklist_init(GList *blacklist) | ||||
| { | ||||
|     const char *list_unsupported[] = { | ||||
|         "guest-file-open", "guest-file-close", "guest-file-read", | ||||
|         "guest-file-write", "guest-file-seek", "guest-file-flush", | ||||
|         "guest-suspend-hybrid", "guest-network-get-interfaces", | ||||
|         "guest-get-vcpus", "guest-set-vcpus", | ||||
|         "guest-fsfreeze-freeze-list", "guest-get-fsinfo", | ||||
|         "guest-fstrim", NULL}; | ||||
|     char **p = (char **)list_unsupported; | ||||
| 
 | ||||
|     while (*p) { | ||||
|         blacklist = g_list_append(blacklist, *p++); | ||||
|     } | ||||
| 
 | ||||
|     if (!vss_init(true)) { | ||||
|         const char *list[] = { | ||||
|             "guest-get-fsinfo", "guest-fsfreeze-status", | ||||
|             "guest-fsfreeze-freeze", "guest-fsfreeze-thaw", NULL}; | ||||
|         p = (char **)list; | ||||
| 
 | ||||
|         while (*p) { | ||||
|             blacklist = g_list_append(blacklist, *p++); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return blacklist; | ||||
| } | ||||
| 
 | ||||
| /* register init/cleanup routines for stateful command groups */ | ||||
| void ga_command_state_init(GAState *s, GACommandState *cs) | ||||
| { | ||||
|     if (vss_init(true)) { | ||||
|     if (!vss_initialized()) { | ||||
|         ga_command_state_add(cs, NULL, guest_fsfreeze_cleanup); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -19,6 +19,7 @@ typedef struct GAState GAState; | ||||
| typedef struct GACommandState GACommandState; | ||||
| extern GAState *ga_state; | ||||
| 
 | ||||
| GList *ga_command_blacklist_init(GList *blacklist); | ||||
| void ga_command_state_init(GAState *s, GACommandState *cs); | ||||
| void ga_command_state_add(GACommandState *cs, | ||||
|                           void (*init)(void), | ||||
|  | ||||
| @ -1144,6 +1144,7 @@ int main(int argc, char **argv) | ||||
|         goto out_bad; | ||||
|     } | ||||
| 
 | ||||
|     blacklist = ga_command_blacklist_init(blacklist); | ||||
|     if (blacklist) { | ||||
|         s->blacklist = blacklist; | ||||
|         do { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Tomoki Sekiyama
						Tomoki Sekiyama