Re: [PATCH] reiserfsprogs: enforce 2^32-1 block limit

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



-----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@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
-----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-----
-
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

[Index of Archives]     [Linux File System Development]     [Linux BTRFS]     [Linux NFS]     [Linux Filesystems]     [Ext4 Filesystem]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]     [Linux Resources]

  Powered by Linux