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

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

 



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