If a machine has a /proc/mounts file larger than 4kb and the hugetlb mount point is after the 4kb mark the library currently fails to find the hugetlb mount. This patch ensures that the entire mounts file is searched for the hugetlb mount before giving up.
Signed-off-by: Eric Munson <[EMAIL PROTECTED]>
---
hugeutils.c | 103 +++++++++++++++++++++++++++++++++++++++++++----------------
1 files changed, 75 insertions(+), 28 deletions(-)
diff --git a/hugeutils.c b/hugeutils.c
index 8244c84..22f886f 100644
--- a/hugeutils.c
+++ b/hugeutils.c
@@ -158,11 +158,35 @@ int hugetlbfs_test_path(const char *mount)
}
#define MOUNTS_SZ 4096
+#define READ_SZ (MOUNTS_SZ - 1)
+
+static const char *path_search(char *buf)
+{
+ int err;
+ char *tmp = buf;
+ while (tmp) {
+ err = sscanf(tmp,
+ "%*s %" stringify(PATH_MAX)
+ "s hugetlbfs ",
+ htlb_mount);
+ if ((err == 1) && (hugetlbfs_test_path(htlb_mount) == 1))
+ return htlb_mount;
+
+ memset(htlb_mount, 0, sizeof(htlb_mount));
+
+ tmp = strchr(tmp, '\n');
+ if (tmp)
+ tmp++;
+ }
+ return NULL;
+}
const char *hugetlbfs_find_path(void)
{
int err, readerr;
- char *tmp;
+ char *start, *newline = NULL, *end = NULL;
+ const char *tmp;
+ char hold;
int fd, len;
char buf[MOUNTS_SZ];
@@ -197,35 +221,58 @@ const char *hugetlbfs_find_path(void)
}
}
- len = read(fd, buf, sizeof(buf));
- readerr = errno;
- close(fd);
- if (len < 0) {
- ERROR("Error reading mounts (%s)\n", strerror(errno));
- return NULL;
- }
- if (len >= sizeof(buf)) {
- ERROR("/proc/mounts is too long\n");
- return NULL;
- }
- buf[sizeof(buf)-1] = '\0';
-
- tmp = buf;
- while (tmp) {
- err = sscanf(tmp,
- "%*s %" stringify(PATH_MAX)
- "s hugetlbfs ",
- htlb_mount);
- if ((err == 1) && (hugetlbfs_test_path(htlb_mount) == 1))
- return htlb_mount;
-
- memset(htlb_mount, 0, sizeof(htlb_mount));
+ start = buf;
+ do {
+ len = read(fd, start, READ_SZ - (end - newline));
+ readerr = errno;
+ if (len < 0) {
+ if (readerr == EAGAIN || readerr == EINTR)
+ continue;
+ ERROR("Error reading mounts (%s)\n", strerror(errno));
+ close(fd);
+ return NULL;
+ }
- tmp = strchr(tmp, '\n');
- if (tmp)
- tmp++;
- }
+ if (len == 0) {
+ buf[READ_SZ] = '\0';
+ tmp = path_search(buf);
+ if (tmp) {
+ close(fd);
+ return tmp;
+ }
+ } else {
+ /*
+ * There is more to read so we will examine the buffer
+ * that we have for the hugetlb entry, if we find it
+ * go out, otherwise pull the next chunk.
+ */
+
+ newline = end = start + len;
+ while (*newline != '\n' && newline > start)
+ newline--;
+ if (newline <= start) {
+ ERROR("/proc/mounts is not readable.\n");
+ close(fd);
+ return NULL;
+ }
+
+ newline++;
+ hold = *newline;
+ *newline = '\0';
+ tmp = path_search(buf);
+ if (tmp) {
+ close(fd);
+ return tmp;
+ }
+
+ *newline = hold;
+ memcpy(buf, newline, end - newline);
+ start = buf + (end - newline);
+ }
+ } while (len != 0);
+ close(fd);
+ memset(htlb_mount, 0, sizeof(htlb_mount));
WARNING("Could not find hugetlbfs mount point in /proc/mounts. "
"Is it mounted?\n");
signature.asc
Description: This is a digitally signed message part
------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________ Libhugetlbfs-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/libhugetlbfs-devel
