Hi, Vyacheslav
On Sat, 23 Mar 2013 15:45:22 +0400, Vyacheslav Dubeyko wrote:
> From: Vyacheslav Dubeyko <[email protected]>
> Subject: [PATCH] nilfs-utils: mkfs.nilfs2 should check presence of NILFS2 
> volume on device
> 
> The mkfs.nilfs2 utility should check presence of NILFS2 volume on device and 
> to warn a user about possibility to destroy data by mkfs activity. This patch 
> tries to read and to validate checksums of primary and secondary superblocks 
> on opened device. If this operation ends successfully then mkfs.nilfs2 
> informs a user about potential danger to destroy existing NILFS2 volume. The 
> execution of mkfs.nilfs2 stops with offering to make decision about 
> continuation or abortion of operation. However, if a user runs mkfs.nilfs2 
> with "-q" option then checking of NILFS2 volume is skipped.
> 
> Reported-by: Hendrik Levsen <[email protected]>
> Signed-off-by: Vyacheslav Dubeyko <[email protected]>
> Tested-by: Vyacheslav Dubeyko <[email protected]>

This patch breaks compatibility of mkfs.nilfs2 in the case when users
or tools are expecting overwrite an exisiting partition.  However, I
am inclined to accept this kind of protection feature.

One thing disturbing is that "quiet option" is used to turn off the
protection; "quiet option" is just an option to suppress messages.

Please consider adding "force overwrite (-f)" option like
mkfs.xfs.

Thanks,
Ryusuke Konishi

> ---
>  sbin/mkfs/Makefile.am |    3 ++-
>  sbin/mkfs/mkfs.c      |   34 ++++++++++++++++++++++++++++++++++
>  2 files changed, 36 insertions(+), 1 deletion(-)
> 
> diff --git a/sbin/mkfs/Makefile.am b/sbin/mkfs/Makefile.am
> index b3eb78a..631b04f 100644
> --- a/sbin/mkfs/Makefile.am
> +++ b/sbin/mkfs/Makefile.am
> @@ -4,7 +4,8 @@ AM_CFLAGS = -Wall
>  AM_CPPFLAGS = -I$(top_srcdir)/include
>  LDADD = -luuid $(top_builddir)/lib/libnilfsfeature.la \
>       $(top_builddir)/lib/libmountchk.la \
> -     $(top_builddir)/lib/libcrc32.la
> +     $(top_builddir)/lib/libcrc32.la \
> +     $(top_builddir)/lib/libnilfs.la
>  
>  sbin_PROGRAMS = mkfs.nilfs2
>  
> diff --git a/sbin/mkfs/mkfs.c b/sbin/mkfs/mkfs.c
> index fde1c76..9f18afe 100644
> --- a/sbin/mkfs/mkfs.c
> +++ b/sbin/mkfs/mkfs.c
> @@ -347,6 +347,8 @@ static int nilfs_mkfs_discard_zeroes_data(int fd)
>  
>  static void disk_scan(const char *device);
>  static void check_mount(int fd, const char *device);
> +static void check_presence_of_nilfs_volume_on_device(int fd,
> +                                             const char *device);
>  
>  
>  /*
> @@ -611,6 +613,7 @@ int main(int argc, char *argv[])
>       if ((fd = open(device, O_RDWR)) < 0)
>               perr("Error: cannot open device: %s", device);
>       check_mount(fd, device);
> +     check_presence_of_nilfs_volume_on_device(fd, device);
>  
>       init_disk_layout(di, fd, device);
>       si = new_segment(di);
> @@ -729,6 +732,37 @@ static void check_mount(int fd, const char *device)
>       fclose(fp);
>  }
>  
> +static void check_presence_of_nilfs_volume_on_device(int fd,
> +                                             const char *device)
> +{
> +     struct nilfs_super_block *sbp = NULL;
> +     int c;
> +
> +     if (quiet == 0) {
> +             sbp = nilfs_sb_read(fd);
> +             if (sbp) {
> +                     free(sbp);
> +
> +                     pinfo("WARNING: Device %s has NILFS2 superblocks.",
> +                             device);
> +                     pinfo("WARNING: All data will be lost after format!");
> +                     pinfo("\nDO YOU REALLY WANT TO FORMAT DEVICE %s?",
> +                             device);
> +
> +                     do {
> +                             fprintf(stderr, "\nContinue? [y/N] ");
> +                             c = getchar();
> +
> +                             if (c == 'n' || c == 'N' || c == EOF) {
> +                                     close(fd);
> +                                     perr("Abort format of device %s",
> +                                             device);
> +                             }
> +                     } while (c != 'y' && c != 'Y');
> +             }
> +     }
> +}
> +
>  static void destroy_disk_buffer(void)
>  {
>       if (disk_buffer) {
> -- 
> 1.7.9.5
> 
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nilfs" in
> the body of a message to [email protected]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-nilfs" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to