On Dec 10, 2013, at 6:18 PM, Darrick J. Wong <darrick.wong@xxxxxxxxxx> wrote: > mke2fs has a series of checks to ensure that we don't create a > filesystem too big for its blocksize -- if auto-64bit is on, then it > turns on 64bit; otherwise it complains. Unfortunately, it performs > these checks before looking in mke2fs.conf for a blocksize, which > means that the checks are incorrect if the user specifies a non-4096 > blocksize in the config file and says nothing on the command line. > The bug also has the effect of mandating a 4k block size on any block > device larger than 4T in that situation. Therefore, read the block > size from the config file before performing the 64bit checks. > > Reviewed-by: Zheng Liu <wenqing.lz@xxxxxxxxxx> > Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > --- > misc/mke2fs.c | 134 +++++++++++++++++++++++++++++++-------------------------- > 1 file changed, 72 insertions(+), 62 deletions(-) > > > diff --git a/misc/mke2fs.c b/misc/mke2fs.c > index 67c9225..19b6e85 100644 > --- a/misc/mke2fs.c > +++ b/misc/mke2fs.c > @@ -1780,15 +1795,67 @@ profile_error: > } > } > > + /* Get the hardware sector sizes, if available */ > + retval = ext2fs_get_device_sectsize(device_name, &lsector_size); > + if (retval) { > + com_err(program_name, retval, > + _("while trying to determine hardware sector size")); > + exit(1); > + } > + retval = ext2fs_get_device_phys_sectsize(device_name, &psector_size); > + if (retval) { > + com_err(program_name, retval, > + _("while trying to determine physical sector size")); > + exit(1); > + } > + > + tmp = getenv("MKE2FS_DEVICE_SECTSIZE"); > + if (tmp != NULL) > + lsector_size = atoi(tmp); > + tmp = getenv("MKE2FS_DEVICE_PHYS_SECTSIZE"); > + if (tmp != NULL) > + psector_size = atoi(tmp); > + > + /* Older kernels may not have physical/logical distinction */ > + if (!psector_size) > + psector_size = lsector_size; > + > + if (blocksize <= 0) { > + use_bsize = get_int_from_profile(fs_types, "blocksize", 4096); > + > + if (use_bsize == -1) { > + use_bsize = sys_page_size; > + if ((linux_version_code < (2*65536 + 6*256)) && Would be nice to have a helper to compute the linux_version_code comparison, the above is a bit too much detail for this code. > + (use_bsize > 4096)) > + use_bsize = 4096; > + } > + if (lsector_size && use_bsize < lsector_size) > + use_bsize = lsector_size; > + if ((blocksize < 0) && (use_bsize < (-blocksize))) > + use_bsize = -blocksize; > + blocksize = use_bsize; > + fs_blocks_count /= (blocksize / 1024); > + } else { > + if (blocksize < lsector_size) { /* Impossible */ > + com_err(program_name, EINVAL, > + _("while setting blocksize; too small " > + "for device\n")); > + exit(1); > + } else if ((blocksize < psector_size) && > + (psector_size <= sys_page_size)) { /* Suboptimal */ > + fprintf(stderr, _("Warning: specified blocksize %d is " > + "less than device physical sectorsize %d\n"), > + blocksize, psector_size); > + } > + } > + > + fs_param.s_log_block_size = > + int_log2(blocksize >> EXT2_MIN_BLOCK_LOG_SIZE); Does it make sense to wrap this whole block size guessing dance into a small helper routine, like "figure_fs_blocksize()" or similar? Cheers, Andreas
Attachment:
signature.asc
Description: Message signed with OpenPGP using GPGMail