mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-17 10:26:15 +00:00
- Change the type of nodes_max to u_int and use "%u" format string to
convert its value. [1] - Set default tm_nodes_max to min(pages + 3, UINT32_MAX). It's more reasonable than the old four nodes per page (with page size 4096) because non-empty regular files always use at least one page. This fixes possible overflow in the calculation. [2] - Don't allow more than tm_nodes_max nodes allocated in tmpfs_alloc_node(). PR: kern/138367 Suggested by: bde [1], Gleb Kurtsou [2] Approved by: trasz (mentor)
This commit is contained in:
parent
cbf58894c1
commit
189ee6be40
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=202708
@ -93,7 +93,7 @@ tmpfs_alloc_node(struct tmpfs_mount *tmp, enum vtype type,
|
||||
MPASS(IFF(type == VLNK, target != NULL));
|
||||
MPASS(IFF(type == VBLK || type == VCHR, rdev != VNOVAL));
|
||||
|
||||
if (tmp->tm_nodes_inuse > tmp->tm_nodes_max)
|
||||
if (tmp->tm_nodes_inuse >= tmp->tm_nodes_max)
|
||||
return (ENOSPC);
|
||||
|
||||
nnode = (struct tmpfs_node *)uma_zalloc_arg(
|
||||
|
@ -182,10 +182,10 @@ tmpfs_mount(struct mount *mp)
|
||||
struct tmpfs_mount *tmp;
|
||||
struct tmpfs_node *root;
|
||||
size_t pages, mem_size;
|
||||
ino_t nodes;
|
||||
uint32_t nodes;
|
||||
int error;
|
||||
/* Size counters. */
|
||||
ino_t nodes_max;
|
||||
u_int nodes_max;
|
||||
u_quad_t size_max;
|
||||
|
||||
/* Root node attributes. */
|
||||
@ -223,7 +223,7 @@ tmpfs_mount(struct mount *mp)
|
||||
if (mp->mnt_cred->cr_ruid != 0 ||
|
||||
vfs_scanopt(mp->mnt_optnew, "mode", "%ho", &root_mode) != 1)
|
||||
root_mode = va.va_mode;
|
||||
if (vfs_scanopt(mp->mnt_optnew, "inodes", "%d", &nodes_max) != 1)
|
||||
if (vfs_scanopt(mp->mnt_optnew, "inodes", "%u", &nodes_max) != 1)
|
||||
nodes_max = 0;
|
||||
if (vfs_scanopt(mp->mnt_optnew, "size", "%qu", &size_max) != 1)
|
||||
size_max = 0;
|
||||
@ -245,9 +245,12 @@ tmpfs_mount(struct mount *mp)
|
||||
pages = howmany(size_max, PAGE_SIZE);
|
||||
MPASS(pages > 0);
|
||||
|
||||
if (nodes_max <= 3)
|
||||
nodes = 3 + pages * PAGE_SIZE / 1024;
|
||||
else
|
||||
if (nodes_max <= 3) {
|
||||
if (pages > UINT32_MAX - 3)
|
||||
nodes = UINT32_MAX;
|
||||
else
|
||||
nodes = pages + 3;
|
||||
} else
|
||||
nodes = nodes_max;
|
||||
MPASS(nodes >= 3);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user