From: Jeff Mahoney <jeffm@suse.com>
To: ReiserFS Mailing List <reiserfs-devel@vger.kernel.org>
Cc: "Vladimir V. Saveliev" <vs@namesys.com>
Subject: [PATCH] reiserfsprogs: enforce 2^32-1 block limit
Date: Mon, 13 Aug 2007 14:45:34 -0400 [thread overview]
Message-ID: <46C0A6CE.1010807@suse.com> (raw)
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
next reply other threads:[~2007-08-13 18:45 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-08-13 18:45 Jeff Mahoney [this message]
2007-08-13 21:02 ` [PATCH] reiserfsprogs: enforce 2^32-1 block limit 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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=46C0A6CE.1010807@suse.com \
--to=jeffm@suse.com \
--cc=reiserfs-devel@vger.kernel.org \
--cc=vs@namesys.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.