[PATCH 1/2] tests: test for the ped_disk_duplicate needs_clobber fix

Jim Meyering meyering at redhat.com
Tue Feb 23 16:26:48 UTC 2010


* tests/dup-clobber.c: New file.
Exercise the fix in commit jabb411b, "libparted: copy the
needs_clobber value in ped_disk_duplicate()".
* tests/Makefile.am (TESTS, check_PROGRAMS): Add dup-clobber.
---
 tests/Makefile.am   |    3 +-
 tests/dup-clobber.c |  103 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 105 insertions(+), 1 deletions(-)
 create mode 100644 tests/dup-clobber.c

diff --git a/tests/Makefile.am b/tests/Makefile.am
index 8008400..afe711c 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -2,6 +2,7 @@ XFAIL_TESTS = \
   t3200-type-change.sh

 TESTS = \
+  dup-clobber \
   t0000-basic.sh \
   t0001-tiny.sh \
   t0010-script-no-ctrl-chars.sh \
@@ -39,7 +40,7 @@ TESTS = \
 EXTRA_DIST = \
   $(TESTS) test-lib.sh t-lib.sh lvm-utils.sh t-local.sh t-lvm.sh

-check_PROGRAMS = print-align print-max
+check_PROGRAMS = print-align print-max dup-clobber
 LDADD = \
   $(top_builddir)/libparted/libparted.la
 AM_CPPFLAGS = \
diff --git a/tests/dup-clobber.c b/tests/dup-clobber.c
new file mode 100644
index 0000000..4e7add2
--- /dev/null
+++ b/tests/dup-clobber.c
@@ -0,0 +1,103 @@
+/* Demonstrate that setting disk->needs_clobber in ped_disk_duplicate
+   is necessary.  With that, this test passes.  Without it, the last
+   sectors of the disk are cleared, and this test fails.  */
+#include <config.h>
+#include <parted/parted.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#include "closeout.h"
+#include "progname.h"
+
+static void
+seek_to_final_sector (int fd, PedSector ss)
+{
+  /* Seek to EOF.  */
+  off_t off = lseek (fd, 0, SEEK_END);
+
+  /* That had better succeed and determine that the size is > 2 sectors
+     and an exact multiple of ss.  */
+  assert (2 * ss < off);
+  assert (off % ss == 0);
+
+  /* Back up one sector.  */
+  off = lseek (fd, -ss, SEEK_CUR);
+  assert (0 < off);
+}
+
+static void
+scribble_on_final_sector (char const *file_name, PedSector ss)
+{
+  assert (0 < ss);
+  assert (ss % 512 == 0);
+  int fd = open (file_name, O_WRONLY);
+  assert (0 <= fd);
+
+  seek_to_final_sector (fd, ss);
+
+  /* Fill the final sector with ascii 'G's.  */
+  char *buf = malloc (ss);
+  assert (buf);
+  memset (buf, 'G', ss);
+  assert (write (fd, buf, ss) == ss);
+  free (buf);
+  assert (close (fd) == 0);
+}
+
+int
+main (int argc, char **argv)
+{
+  atexit (close_stdout);
+  set_program_name (argv[0]);
+
+  if (argc != 1)
+    return EXIT_FAILURE;
+
+  char const *dev_name = "dev-file";
+
+  /* Create a file.  */
+  int fd = open (dev_name, O_CREAT|O_TRUNC|O_WRONLY, 0644);
+  assert (0 <= fd);
+  off_t size = 8 * 1024 * 1024;
+  assert (ftruncate (fd, size) == 0);
+  assert (close (fd) == 0);
+
+  PedDevice *dev = ped_device_get (dev_name);
+  assert (dev);
+
+  PedDisk *disk = ped_disk_new_fresh (dev, ped_disk_type_get ("msdos"));
+  assert (disk);
+
+  assert (ped_disk_commit(disk));
+
+  PedSector ss = dev->sector_size;
+  scribble_on_final_sector (dev_name, ss);
+
+  /* Before the fix, this ped_disk_duplicate call would always set
+     copy->needs_clobber, thus causing the subsequent commit to
+     mistakenly clobber 9KiB at each end of the disk.  */
+  PedDisk *copy = ped_disk_duplicate (disk);
+  assert (ped_disk_commit(copy));
+
+  ped_disk_destroy (copy);
+  ped_disk_destroy (disk);
+  ped_device_destroy (dev);
+
+  /* Read the final sector and ensure it's still all 'G's.  */
+  fd = open (dev_name, O_RDONLY);
+  assert (0 <= fd);
+  seek_to_final_sector (fd, ss);
+  char *buf = malloc (ss);
+  assert (buf);
+  assert (read (fd, buf, ss) == ss);
+  unsigned int i;
+  for (i = 0; i < ss; i++)
+    assert (buf[i] == 'G');
+  free (buf);
+
+  return EXIT_SUCCESS;
+}
--
1.7.0.367.g566c3




More information about the parted-devel mailing list