--- old/src/hotspot/os_cpu/linux_x86/gc/z/zBackingPath_linux_x86.cpp 2018-07-03 22:08:43.294293071 +0200 +++ new/src/hotspot/os_cpu/linux_x86/gc/z/zBackingPath_linux_x86.cpp 2018-07-03 22:08:43.088284073 +0200 @@ -33,13 +33,13 @@ // Mount information, see proc(5) for more details. #define PROC_SELF_MOUNTINFO "/proc/self/mountinfo" -ZBackingPath::ZBackingPath(const char* filesystem, const char* preferred_path) { +ZBackingPath::ZBackingPath(const char* filesystem, const char** preferred_mountpoints) { if (ZPath != NULL) { // Use specified path _path = strdup(ZPath); } else { // Find suitable path - _path = find_mountpoint(filesystem, preferred_path); + _path = find_mountpoint(filesystem, preferred_mountpoints); } } @@ -68,7 +68,7 @@ return line_mountpoint; } -void ZBackingPath::get_mountpoints(ZArray* mountpoints, const char* filesystem) const { +void ZBackingPath::get_mountpoints(const char* filesystem, ZArray* mountpoints) const { FILE* fd = fopen(PROC_SELF_MOUNTINFO, "r"); if (fd == NULL) { ZErrno err; @@ -98,37 +98,45 @@ mountpoints->clear(); } -char* ZBackingPath::find_mountpoint(const char* filesystem, const char* preferred_mountpoint) const { +char* ZBackingPath::find_preferred_mountpoint(const char* filesystem, + ZArray* mountpoints, + const char** preferred_mountpoints) const { + // Among the found mountpoints, return the first that is on the list of preferred mountpoints + ZArrayIterator iter1(mountpoints); + for (char* mountpoint; iter1.next(&mountpoint);) { + for (const char** preferred = preferred_mountpoints; *preferred != NULL; preferred++) { + if (!strcmp(mountpoint, *preferred)) { + // Preferred mountpoint found + return strdup(mountpoint); + } + } + } + + // Preferred mountpoint not found + log_error(gc, init)("More than one %s filesystem found:", filesystem); + ZArrayIterator iter2(mountpoints); + for (char* mountpoint; iter2.next(&mountpoint);) { + log_error(gc, init)(" %s", mountpoint); + } + + return NULL; +} + +char* ZBackingPath::find_mountpoint(const char* filesystem, const char** preferred_mountpoints) const { char* path = NULL; ZArray mountpoints; - get_mountpoints(&mountpoints, filesystem); + get_mountpoints(filesystem, &mountpoints); if (mountpoints.size() == 0) { - // No filesystem found + // No mountpoint found log_error(gc, init)("Failed to find an accessible %s filesystem", filesystem); } else if (mountpoints.size() == 1) { - // One filesystem found + // One mountpoint found path = strdup(mountpoints.at(0)); - } else if (mountpoints.size() > 1) { - // More than one filesystem found - ZArrayIterator iter(&mountpoints); - for (char* mountpoint; iter.next(&mountpoint);) { - if (!strcmp(mountpoint, preferred_mountpoint)) { - // Preferred mount point found - path = strdup(mountpoint); - break; - } - } - - if (path == NULL) { - // Preferred mount point not found - log_error(gc, init)("More than one %s filesystem found:", filesystem); - ZArrayIterator iter2(&mountpoints); - for (char* mountpoint; iter2.next(&mountpoint);) { - log_error(gc, init)(" %s", mountpoint); - } - } + } else { + // More than one mountpoint found + path = find_preferred_mountpoint(filesystem, &mountpoints, preferred_mountpoints); } free_mountpoints(&mountpoints);