|
@@ -507,6 +507,8 @@ static int init_constants_early(struct ubifs_info *c)
|
|
|
c->half_leb_size = c->leb_size / 2;
|
|
|
c->min_io_size = c->di.min_io_size;
|
|
|
c->min_io_shift = fls(c->min_io_size) - 1;
|
|
|
+ c->max_write_size = c->di.max_write_size;
|
|
|
+ c->max_write_shift = fls(c->max_write_size) - 1;
|
|
|
|
|
|
if (c->leb_size < UBIFS_MIN_LEB_SZ) {
|
|
|
ubifs_err("too small LEBs (%d bytes), min. is %d bytes",
|
|
@@ -525,6 +527,18 @@ static int init_constants_early(struct ubifs_info *c)
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * Maximum write size has to be greater or equivalent to min. I/O
|
|
|
+ * size, and be multiple of min. I/O size.
|
|
|
+ */
|
|
|
+ if (c->max_write_size < c->min_io_size ||
|
|
|
+ c->max_write_size % c->min_io_size ||
|
|
|
+ !is_power_of_2(c->max_write_size)) {
|
|
|
+ ubifs_err("bad write buffer size %d for %d min. I/O unit",
|
|
|
+ c->max_write_size, c->min_io_size);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* UBIFS aligns all node to 8-byte boundary, so to make function in
|
|
|
* io.c simpler, assume minimum I/O unit size to be 8 bytes if it is
|
|
@@ -533,6 +547,10 @@ static int init_constants_early(struct ubifs_info *c)
|
|
|
if (c->min_io_size < 8) {
|
|
|
c->min_io_size = 8;
|
|
|
c->min_io_shift = 3;
|
|
|
+ if (c->max_write_size < c->min_io_size) {
|
|
|
+ c->max_write_size = c->min_io_size;
|
|
|
+ c->max_write_shift = c->min_io_shift;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
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)
|
|
|
|
|
|
dbg_msg("compiled on: " __DATE__ " at " __TIME__);
|
|
|
dbg_msg("min. I/O unit size: %d bytes", c->min_io_size);
|
|
|
+ dbg_msg("max. write size: %d bytes", c->max_write_size);
|
|
|
dbg_msg("LEB size: %d bytes (%d KiB)",
|
|
|
c->leb_size, c->leb_size >> 10);
|
|
|
dbg_msg("data journal heads: %d",
|