[PATCH] tune2fs: implemented -c and -i options.

Denys Vlasenko vda.linux at googlemail.com
Sun Oct 3 15:50:42 UTC 2010


On Sunday 03 October 2010 12:32, Richard Braun wrote:
> This patch adds support for maximum mount count and interval checking of
> ext2/ext3 file systems. The -i option however doesn't support d/w/m
> suffixes.
> 
> Although tune2fs seems unused by the vast majority of busybox users
> because of its only available option, I felt it was the right place to
> introduce those changes. I'm currently developing an embedded
> distribution on x86 hardware and a CompactFlash card is used as the
> persistent storage device, so ext2 was chosen as the file system for
> persistent configuration. But this file system is very small and almost
> never mounted read-write, only when changes are actually committed. As a
> result, there is no real need to regularly check that file system. And
> because the "restore defaults" operation actually recreates an empty
> file system, I needed a way to disable mount count/interval checking
> from busybox. So here is the patch.
> ---
>  e2fsprogs/tune2fs.c |   49 ++++++++++++++++++++++++++++++++++++++++++++-----
>  include/usage.src.h |    6 ++++--
>  2 files changed, 48 insertions(+), 7 deletions(-)
> 
> diff --git a/e2fsprogs/tune2fs.c b/e2fsprogs/tune2fs.c
> index 311349f..9772bf0 100644
> --- a/e2fsprogs/tune2fs.c
> +++ b/e2fsprogs/tune2fs.c
> @@ -27,25 +27,53 @@ do { \
>  #define FETCH_LE32(field) \
>  	(sizeof(field) == 4 ? SWAP_LE32(field) : BUG_wrong_field_size())
>  
> +#define SECONDS_PER_DAY 86400
> +#define MAX_CHECK_INTERVAL ((unsigned)0xffffffff / SECONDS_PER_DAY)
> +
>  enum {
>  	OPT_L = 1 << 0,	// label
> +	OPT_c = 1 << 1, // max mount count
> +	OPT_i = 1 << 2, // check interval
>  };
>  
>  int tune2fs_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
>  int tune2fs_main(int argc UNUSED_PARAM, char **argv)
>  {
> -	unsigned opts;
> -	const char *label;
> +	unsigned opts, check_interval;
> +	const char *label, *max_mnt_count_str, *check_interval_str;
>  	struct ext2_super_block *sb;
> -	int fd;
> +	int fd, max_mnt_count;
>  
>  	opt_complementary = "=1";
> -	opts = getopt32(argv, "L:", &label);
> +	opts = getopt32(argv, "L:c:i:", &label, &max_mnt_count_str, &check_interval_str);
>  	argv += optind; // argv[0] -- device
>  
>  	if (!opts)
>  		bb_show_usage();
>  
> +	if (opts & OPT_c) {
> +		errno = 0;
> +		max_mnt_count = bb_strtoi(max_mnt_count_str, NULL, 10);
> +
> +		// max_mnt_count is 16-bits wide in the superblock. In addition,
> +		// -1 marks mount count checking as disabled.
> +		if (errno || (max_mnt_count < -1) || (max_mnt_count >= 0xffff))
> +			bb_error_msg_and_die("invalid max mount count");
> +
> +		if (max_mnt_count == 0)
> +			max_mnt_count = -1;
> +	}
> +	if (opts & OPT_i) {
> +		errno = 0;
> +		check_interval = bb_strtou(check_interval_str, NULL, 10);
> +
> +		if (errno || (check_interval > MAX_CHECK_INTERVAL))
> +			bb_error_msg_and_die("invalid check interval");
> +
> +		check_interval *= SECONDS_PER_DAY;
> +	}

You can simplify this by using xatou16() or xatou_range().



> +
>  	// read superblock
>  	fd = xopen(argv[0], O_RDWR);
>  	xlseek(fd, 1024, SEEK_SET);
> @@ -55,8 +83,19 @@ int tune2fs_main(int argc UNUSED_PARAM, char **argv)
>  	// mangle superblock
>  	//STORE_LE(sb->s_wtime, time(NULL)); - why bother?
>  	// set the label
> -	if (1 /*opts & OPT_L*/)
> +	if (opts & OPT_L)
>  		safe_strncpy((char *)sb->s_volume_name, label, sizeof(sb->s_volume_name));
> +
> +	if (opts & OPT_c) {
> +		printf("Setting maximal mount count to %d\n", max_mnt_count);
> +		STORE_LE(sb->s_max_mnt_count, (unsigned)max_mnt_count);
> +	}
> +
> +	if (opts & OPT_i) {
> +		printf("Setting interval between checks to %u seconds\n", check_interval);
> +		STORE_LE(sb->s_checkinterval, check_interval);
> +	}

Are these messages needed? They look like bloat to me.

-- 
vda


More information about the busybox mailing list