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

[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