Skip to contentSkip to conversation

mkfs: don't zero old superblocks if file was truncated

PATCH New Brian Foster 1 participant 1 message Mar 26, 2015

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 mkfs: don't zero old superblocks if file was truncated

If the force overwrite option is passed to mkfs, we attempt to zero old superblock metadata on the mkfs target. We attempt to read the primary superblock to identify the secondary superblocks.

If the mkfs target is a regular file, it is truncated on open and the secondary superblock zeroing operation returns a spurious and incorrect error message due to a 0-byte read:

$ mkfs.xfs -f -d file=1,name=xfs.fs,size=32m
...
existing superblock read failed: Inappropriate ioctl for device

Fix the error reporting in zero_old_xfs_structures() to only print an error string if the pread() call returns an error. Warn the user if the read doesn't match the sector size. Finally, detect the case where we know we've already truncated a regular file and skip the sb zeroing.

---
 mkfs/xfs_mkfs.c | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)
mkfs/xfs_mkfs.c +15 -3
index 484e7a8..5084d75 100644
@@ -817,6 +817,13 @@ zero_old_xfs_structures(
 	__uint32_t		bsize;
 	int			i;
 	xfs_off_t		off;
+	int			tmp;
+
+	/*
+	 * We open regular files with O_TRUNC|O_CREAT. Nothing to do here...
+	 */
+	if (xi->disfile && xi->dcreat)
+		return;
 
 	/*
 	 * read in existing filesystem superblock, use its geometry
@@ -830,11 +837,16 @@ zero_old_xfs_structures(
 	}
 	memset(buf, 0, new_sb->sb_sectsize);
 
-	if (pread(xi->dfd, buf, new_sb->sb_sectsize, 0) != new_sb->sb_sectsize) {
+	tmp = pread(xi->dfd, buf, new_sb->sb_sectsize, 0);
+	if (tmp < 0) {
 		fprintf(stderr, _("existing superblock read failed: %s\n"),
 			strerror(errno));
-		free(buf);
-		return;
+		goto done;
+	}
+	if (tmp != new_sb->sb_sectsize) {
+		fprintf(stderr,
+	_("warning: could not read existing superblock, skip zeroing\n"));
+		goto done;
 	}
 	libxfs_sb_from_disk(&sb, buf);
 
Signature · 6 lines
1.9.3

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs