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

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

 



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?

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

-
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