diff options
| -rw-r--r-- | fs/ubifs/super.c | 19 | ||||
| -rw-r--r-- | fs/ubifs/ubifs.h | 5 |
2 files changed, 24 insertions, 0 deletions
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index 703a62109cf2..efc327b92f98 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c | |||
| @@ -507,6 +507,8 @@ static int init_constants_early(struct ubifs_info *c) | |||
| 507 | c->half_leb_size = c->leb_size / 2; | 507 | c->half_leb_size = c->leb_size / 2; |
| 508 | c->min_io_size = c->di.min_io_size; | 508 | c->min_io_size = c->di.min_io_size; |
| 509 | c->min_io_shift = fls(c->min_io_size) - 1; | 509 | c->min_io_shift = fls(c->min_io_size) - 1; |
| 510 | c->max_write_size = c->di.max_write_size; | ||
| 511 | c->max_write_shift = fls(c->max_write_size) - 1; | ||
| 510 | 512 | ||
| 511 | if (c->leb_size < UBIFS_MIN_LEB_SZ) { | 513 | if (c->leb_size < UBIFS_MIN_LEB_SZ) { |
| 512 | ubifs_err("too small LEBs (%d bytes), min. is %d bytes", | 514 | ubifs_err("too small LEBs (%d bytes), min. is %d bytes", |
| @@ -526,6 +528,18 @@ static int init_constants_early(struct ubifs_info *c) | |||
| 526 | } | 528 | } |
| 527 | 529 | ||
| 528 | /* | 530 | /* |
| 531 | * Maximum write size has to be greater or equivalent to min. I/O | ||
| 532 | * size, and be multiple of min. I/O size. | ||
| 533 | */ | ||
| 534 | if (c->max_write_size < c->min_io_size || | ||
| 535 | c->max_write_size % c->min_io_size || | ||
| 536 | !is_power_of_2(c->max_write_size)) { | ||
| 537 | ubifs_err("bad write buffer size %d for %d min. I/O unit", | ||
| 538 | c->max_write_size, c->min_io_size); | ||
| 539 | return -EINVAL; | ||
| 540 | } | ||
| 541 | |||
| 542 | /* | ||
| 529 | * UBIFS aligns all node to 8-byte boundary, so to make function in | 543 | * UBIFS aligns all node to 8-byte boundary, so to make function in |
| 530 | * io.c simpler, assume minimum I/O unit size to be 8 bytes if it is | 544 | * io.c simpler, assume minimum I/O unit size to be 8 bytes if it is |
| 531 | * less than 8. | 545 | * less than 8. |
| @@ -533,6 +547,10 @@ static int init_constants_early(struct ubifs_info *c) | |||
| 533 | if (c->min_io_size < 8) { | 547 | if (c->min_io_size < 8) { |
| 534 | c->min_io_size = 8; | 548 | c->min_io_size = 8; |
| 535 | c->min_io_shift = 3; | 549 | c->min_io_shift = 3; |
| 550 | if (c->max_write_size < c->min_io_size) { | ||
| 551 | c->max_write_size = c->min_io_size; | ||
| 552 | c->max_write_shift = c->min_io_shift; | ||
| 553 | } | ||
| 536 | } | 554 | } |
| 537 | 555 | ||
| 538 | c->ref_node_alsz = ALIGN(UBIFS_REF_NODE_SZ, c->min_io_size); | 556 | c->ref_node_alsz = ALIGN(UBIFS_REF_NODE_SZ, c->min_io_size); |
| @@ -1391,6 +1409,7 @@ static int mount_ubifs(struct ubifs_info *c) | |||
| 1391 | 1409 | ||
| 1392 | dbg_msg("compiled on: " __DATE__ " at " __TIME__); | 1410 | dbg_msg("compiled on: " __DATE__ " at " __TIME__); |
| 1393 | dbg_msg("min. I/O unit size: %d bytes", c->min_io_size); | 1411 | dbg_msg("min. I/O unit size: %d bytes", c->min_io_size); |
| 1412 | dbg_msg("max. write size: %d bytes", c->max_write_size); | ||
| 1394 | dbg_msg("LEB size: %d bytes (%d KiB)", | 1413 | dbg_msg("LEB size: %d bytes (%d KiB)", |
| 1395 | c->leb_size, c->leb_size >> 10); | 1414 | c->leb_size, c->leb_size >> 10); |
| 1396 | dbg_msg("data journal heads: %d", | 1415 | dbg_msg("data journal heads: %d", |
diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h index d1823541f987..8b519499f14a 100644 --- a/fs/ubifs/ubifs.h +++ b/fs/ubifs/ubifs.h | |||
| @@ -1024,6 +1024,9 @@ struct ubifs_debug_info; | |||
| 1024 | * | 1024 | * |
| 1025 | * @min_io_size: minimal input/output unit size | 1025 | * @min_io_size: minimal input/output unit size |
| 1026 | * @min_io_shift: number of bits in @min_io_size minus one | 1026 | * @min_io_shift: number of bits in @min_io_size minus one |
| 1027 | * @max_write_size: maximum amount of bytes the underlying flash can write at a | ||
| 1028 | * time (MTD write buffer size) | ||
| 1029 | * @max_write_shift: number of bits in @max_write_size minus one | ||
| 1027 | * @leb_size: logical eraseblock size in bytes | 1030 | * @leb_size: logical eraseblock size in bytes |
| 1028 | * @half_leb_size: half LEB size | 1031 | * @half_leb_size: half LEB size |
| 1029 | * @idx_leb_size: how many bytes of an LEB are effectively available when it is | 1032 | * @idx_leb_size: how many bytes of an LEB are effectively available when it is |
| @@ -1270,6 +1273,8 @@ struct ubifs_info { | |||
| 1270 | 1273 | ||
| 1271 | int min_io_size; | 1274 | int min_io_size; |
| 1272 | int min_io_shift; | 1275 | int min_io_shift; |
| 1276 | int max_write_size; | ||
| 1277 | int max_write_shift; | ||
| 1273 | int leb_size; | 1278 | int leb_size; |
| 1274 | int half_leb_size; | 1279 | int half_leb_size; |
| 1275 | int idx_leb_size; | 1280 | int idx_leb_size; |
