tools/libxc: handle fallback in linux_privcmd_map_foreign_bulk properly
authorOlaf Hering <olaf@aepfle.de>
Fri, 27 Jan 2012 18:32:55 +0000 (18:32 +0000)
committerOlaf Hering <olaf@aepfle.de>
Fri, 27 Jan 2012 18:32:55 +0000 (18:32 +0000)
If the first ioctl fails with ENOENT it means the command is known. If a
second attempt to map each gfn happens to fail then there is no need to
run the fallback code. Some gfns are paged and the fallback code would
not fix the failure. Instead return the EINVAL to the caller.

Signed-off-by: Olaf Hering <olaf@aepfle.de>
Acked-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
tools/libxc/xc_linux_osdep.c

index 319997947e15933ddee972f37fe78711140fc347..02df9c5ba0d7a27182a1bbb0944156a30bddde78 100644 (file)
@@ -217,6 +217,7 @@ static void *linux_privcmd_map_foreign_bulk(xc_interface *xch, xc_osdep_handle h
 
     rc = ioctl(fd, IOCTL_PRIVCMD_MMAPBATCH_V2, &ioctlx);
 
+    /* Command was recognized, some gfn in arr are in paging state */
     if ( rc < 0 && errno == ENOENT )
     {
         for ( i = rc = 0; rc == 0 && i < num; i++ )
@@ -235,8 +236,8 @@ static void *linux_privcmd_map_foreign_bulk(xc_interface *xch, xc_osdep_handle h
             } while ( rc < 0 && errno == ENOENT && err[i] == -ENOENT );
         }
     }
-
-    if ( rc < 0 && errno == EINVAL && (int)num > 0 )
+    /* Command was not recognized, use fall back */
+    else if ( rc < 0 && errno == EINVAL && (int)num > 0 )
     {
         /*
          * IOCTL_PRIVCMD_MMAPBATCH_V2 is not supported - fall back to