Skip to content

Commit f171d4d

Browse files
Artem BityutskiyArtem Bityutskiy
authored andcommitted
UBIFS: fix division by zero
If fanout is 3, we have division by zero in 'ubifs_read_superblock()': divide error: 0000 [#1] PREEMPT SMP Pid: 28744, comm: mount Not tainted (2.6.27-rc4-ubifs-2.6 #23) EIP: 0060:[<f8f9e3ef>] EFLAGS: 00010202 CPU: 0 EIP is at ubifs_reported_space+0x2d/0x69 [ubifs] EAX: 00000000 EBX: 00000000 ECX: 00000000 EDX: 00000000 ESI: 00000000 EDI: f0ae64b0 EBP: f1f9fcf4 ESP: f1f9fce0 DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068 Signed-off-by: Artem Bityutskiy <[email protected]>
1 parent 7c7cbad commit f171d4d

File tree

1 file changed

+7
-6
lines changed

1 file changed

+7
-6
lines changed

fs/ubifs/budget.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -723,24 +723,25 @@ void ubifs_release_dirty_inode_budget(struct ubifs_info *c,
723723
*/
724724
long long ubifs_reported_space(const struct ubifs_info *c, uint64_t free)
725725
{
726-
int divisor, factor;
726+
int divisor, factor, f;
727727

728728
/*
729729
* Reported space size is @free * X, where X is UBIFS block size
730730
* divided by UBIFS block size + all overhead one data block
731731
* introduces. The overhead is the node header + indexing overhead.
732732
*
733-
* Indexing overhead is calculations are based on the following
734-
* formula: I = N/(f - 1) + 1, where I - number of indexing nodes, N -
735-
* number of data nodes, f - fanout. Because effective UBIFS fanout is
736-
* twice as less than maximum fanout, we assume that each data node
733+
* Indexing overhead calculations are based on the following formula:
734+
* I = N/(f - 1) + 1, where I - number of indexing nodes, N - number
735+
* of data nodes, f - fanout. Because effective UBIFS fanout is twice
736+
* as less than maximum fanout, we assume that each data node
737737
* introduces 3 * @c->max_idx_node_sz / (@c->fanout/2 - 1) bytes.
738738
* Note, the multiplier 3 is because UBIFS reseves thrice as more space
739739
* for the index.
740740
*/
741+
f = c->fanout > 3 ? c->fanout >> 1 : 2;
741742
factor = UBIFS_BLOCK_SIZE;
742743
divisor = UBIFS_MAX_DATA_NODE_SZ;
743-
divisor += (c->max_idx_node_sz * 3) / ((c->fanout >> 1) - 1);
744+
divisor += (c->max_idx_node_sz * 3) / (f - 1);
744745
free *= factor;
745746
do_div(free, divisor);
746747
return free;

0 commit comments

Comments
 (0)