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…
	
		Reference in New Issue