-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Vladimir V. Saveliev wrote: > Jeff Mahoney wrote: >> Vladimir V. Saveliev wrote: >>>> Hello >>>> >>>> Jeff Mahoney wrote: >>>>> Currently, mkreiserfs on a block device >= 16 TiB will fail with this error: >>>>> reiserfs_create_journal: cannot create a journal of 8193 blocks with >>>>> 18 offset on 0 blocks >>>>> >>>>> The message doesn't adequately describe that the problem is that reiserfs >>>>> supports file system sizes up to 2^32-1 blocks, and it silently overflows. >>>>> >>>>> This patch treats the block device size, as well as the <blocks> command >>>>> line parameter as __u64's, so that they can be safely compared to UINT_MAX. >>>>> >>>>> If the block device is too large, > > You probably should also fix misc_device_count_blocks to return device > size in 64 bits. Currently it returns unsigned long. > Ok, I'll check that. I initially developed the patch against 3.6.19, since that's what we ship still. - -Jeff > we warn the user, offer to truncate the >>>>> file system to 2^32-1 blocks, and confirm. This is overridable by the -f >>>>> option, which will elect to truncate automatically. >>>>> >>>>> If the user has specified a block count that is too large, we fail always >>>>> since the user has provided invalid input. >>>>> >>>>> Please apply. >>>>> >>>>> Signed-off-by: Jeff Mahoney <jeffm@xxxxxxxx> >>>>> >>>>> --- a/utils/mkfs/mkreiserfs.c 2007-08-13 13:34:15.000000000 -0400 >>>>> +++ b/utils/mkfs/mkreiserfs.c 2007-08-13 14:42:02.000000000 -0400 >>>> What did you diff against? >> reiserfsprogs 3.6.20, though I think it was my development tree since a >> patch to a fresh tree comes up with offset -2, but otherwise applies. >> >> -Jeff >> >> >>>>> @@ -29,6 +29,7 @@ >>>>> #include <time.h> >>>>> #include <unistd.h> >>>>> #include <errno.h> >>>>> +#include <limits.h> >>>>> >>>>> #ifdef HAVE_UNAME >>>>> # include <sys/utsname.h> >>>>> @@ -438,6 +439,21 @@ >>>>> return val; >>>>> } >>>>> >>>>> +static __u64 str2u64 (char *str) >>>>> +{ >>>>> + __u64 val; >>>>> + char *tmp; >>>>> + >>>>> + val = (__u64)strtoll(str, &tmp, 0); >>>>> + >>>>> + if (*tmp) { >>>>> + reiserfs_exit (1, "%s: strtoll is unable to make an integer of %s\n", >>>>> + program_name, str); >>>>> + } >>>>> + >>>>> + return val; >>>>> +} >>>>> + >>>>> >>>>> static void set_block_size (char * str, int *b_size) >>>>> { >>>>> @@ -575,7 +591,7 @@ >>>>> int force = 0; >>>>> char * device_name = NULL; >>>>> char * jdevice_name = NULL; >>>>> - unsigned long fs_size = 0; >>>>> + __u64 fs_size = 0; >>>>> int c; >>>>> static int flag; >>>>> >>>>> @@ -710,7 +726,7 @@ >>>>> >>>>> if (optind == argc - 2) { >>>>> /* number of blocks for filesystem is specified */ >>>>> - fs_size = str2int (argv[optind + 1]); >>>>> + fs_size = str2u64 (argv[optind + 1]); >>>>> } else if (optind == argc - 1) { >>>>> /* number of blocks is not specified */ >>>>> if (!(fs_size = misc_device_count_blocks (device_name, Block_size))) >>>>> @@ -719,6 +735,27 @@ >>>>> print_usage_and_exit (); >>>>> } >>>>> >>>>> + if (fs_size >= UINT_MAX) { >>>>> + fprintf(stderr, ">>> ReiserFS supports file systems of up to %u " >>>>> + "blocks.\n>>> The maximum size with a block size of %u bytes " >>>>> + "is about %Lu MiB.\n>>> This file system would occupy %Lu " >>>>> + "blocks. ", UINT_MAX, Block_size, >>>>> + ((__u64)UINT_MAX * Block_size) / (1024 * 1024), fs_size); >>>>> + >>>>> + if (optind == argc - 1) { >>>>> + if (!force && >>>>> + !util_user_confirmed (stderr, "Truncate? (y/N): ", "y\n")) { >>>>> + fprintf(stderr, "\nExiting.\n\n"); >>>>> + exit(1); >>>>> + } >>>>> + fprintf(stderr, "Truncating.\n\n"); >>>>> + fs_size = UINT_MAX; >>>>> + } else { >>>>> + fprintf(stderr, "Exiting.\n\n"); >>>>> + exit(1); >>>>> + } >>>>> + } >>>>> + >>>>> if (is_journal_default (device_name, jdevice_name, Block_size)) >>>>> Create_default_journal = 1; >>>>> >>>>> >> >> -- >> Jeff Mahoney >> SUSE Labs - -- Jeff Mahoney SUSE Labs -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.4-svn0 (GNU/Linux) Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org iD8DBQFGwLrGLPWxlyuTD7IRAm42AJ9pbhp7lI4yMegFS8RgKFh502RuugCfYrKy fR0APgjMHMV9UywsISPMjPE= =844X -----END PGP SIGNATURE----- - To unsubscribe from this list: send the line "unsubscribe reiserfs-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html