aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/fs/tmpfs/tmpfs_vfsops.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/sys/fs/tmpfs/tmpfs_vfsops.c b/sys/fs/tmpfs/tmpfs_vfsops.c
index 6bb1a440f5c9..96d7321e6b49 100644
--- a/sys/fs/tmpfs/tmpfs_vfsops.c
+++ b/sys/fs/tmpfs/tmpfs_vfsops.c
@@ -130,6 +130,8 @@ tmpfs_node_fini(void *mem, int size)
static int
tmpfs_mount(struct mount *mp)
{
+ const size_t nodes_per_page = howmany(PAGE_SIZE,
+ sizeof(struct tmpfs_dirent) + sizeof(struct tmpfs_node));
struct tmpfs_mount *tmp;
struct tmpfs_node *root;
int error;
@@ -195,11 +197,13 @@ tmpfs_mount(struct mount *mp)
MPASS(pages > 0);
if (nodes_max <= 3) {
- if (pages > UINT32_MAX - 3)
- nodes_max = UINT32_MAX;
+ if (pages < INT_MAX / nodes_per_page)
+ nodes_max = pages * nodes_per_page;
else
- nodes_max = pages + 3;
+ nodes_max = INT_MAX;
}
+ if (nodes_max > INT_MAX)
+ nodes_max = INT_MAX;
MPASS(nodes_max >= 3);
/* Allocate the tmpfs mount structure and fill it. */