* [PATCH] reiserfsprogs: enforce 2^32-1 block limit
@ 2007-08-13 18:45 Jeff Mahoney
2007-08-13 21:02 ` Vladimir V. Saveliev
0 siblings, 1 reply; 5+ messages in thread
From: Jeff Mahoney @ 2007-08-13 18:45 UTC (permalink / raw)
To: ReiserFS Mailing List; +Cc: Vladimir V. Saveliev
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, 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@suse.com>
--- 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
@@ -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
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] reiserfsprogs: enforce 2^32-1 block limit
2007-08-13 21:02 ` Vladimir V. Saveliev
@ 2007-08-13 19:57 ` Jeff Mahoney
2007-08-13 21:16 ` Vladimir V. Saveliev
0 siblings, 1 reply; 5+ messages in thread
From: Jeff Mahoney @ 2007-08-13 19:57 UTC (permalink / raw)
To: vs; +Cc: ReiserFS Mailing List
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
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, 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@suse.com>
>>
>> --- 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
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.4-svn0 (GNU/Linux)
Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org
iD8DBQFGwLegLPWxlyuTD7IRAsDFAJ9QQ4OKUcyTeoW5b0DdS7+1vG7EzwCfUz1+
XARDrvF4WzwYY2T58F9FEwk=
=me8b
-----END PGP SIGNATURE-----
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] reiserfsprogs: enforce 2^32-1 block limit
2007-08-13 21:16 ` Vladimir V. Saveliev
@ 2007-08-13 20:10 ` Jeff Mahoney
0 siblings, 0 replies; 5+ messages in thread
From: Jeff Mahoney @ 2007-08-13 20:10 UTC (permalink / raw)
To: vs; +Cc: ReiserFS Mailing List
-----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@suse.com>
>>>>>
>>>>> --- 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-----
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] reiserfsprogs: enforce 2^32-1 block limit
2007-08-13 18:45 [PATCH] reiserfsprogs: enforce 2^32-1 block limit Jeff Mahoney
@ 2007-08-13 21:02 ` Vladimir V. Saveliev
2007-08-13 19:57 ` Jeff Mahoney
0 siblings, 1 reply; 5+ messages in thread
From: Vladimir V. Saveliev @ 2007-08-13 21:02 UTC (permalink / raw)
To: Jeff Mahoney; +Cc: ReiserFS Mailing List
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, 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@suse.com>
>
> --- 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?
> @@ -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;
>
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] reiserfsprogs: enforce 2^32-1 block limit
2007-08-13 19:57 ` Jeff Mahoney
@ 2007-08-13 21:16 ` Vladimir V. Saveliev
2007-08-13 20:10 ` Jeff Mahoney
0 siblings, 1 reply; 5+ messages in thread
From: Vladimir V. Saveliev @ 2007-08-13 21:16 UTC (permalink / raw)
To: Jeff Mahoney; +Cc: ReiserFS Mailing List
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.
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@suse.com>
>>>>
>>>> --- 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
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2007-08-13 21:16 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-08-13 18:45 [PATCH] reiserfsprogs: enforce 2^32-1 block limit Jeff Mahoney
2007-08-13 21:02 ` Vladimir V. Saveliev
2007-08-13 19:57 ` Jeff Mahoney
2007-08-13 21:16 ` Vladimir V. Saveliev
2007-08-13 20:10 ` Jeff Mahoney
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.