Skip to contentSkip to conversation

mkfs: fix mkfs.xfs -dfile,name=$NAME for new files

PATCH Superseded Eric Sandeen 2 participants 5 messages Jan 14, 2010 – Jan 15, 2010

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 mkfs: fix mkfs.xfs -dfile,name=$NAME for new files

# /sbin/mkfs.xfs -dfile,name=grrr,size=100g
mkfs.xfs: Use the -f option to force overwrite.

check_overwrite is failing, because blkid_new_probe_from_filename() is failing, because the (new) image file is 0 length.

We already return 0 (carry on!) for other internal failures, and nobody tests for a -1 return. So let's just let this one pass too.

---

(note, i'm open to comments if we want to differentiate 1/0/-1 in a cleaner fashion...)

mkfs/xfs_mkfs.c +1 -1
index 9a8eff3..53568bc 100644
@@ -296,7 +296,7 @@ check_overwrite(
 
 	pr = blkid_new_probe_from_filename(device);
 	if (!pr)
-		return -1;
+		return 0;
 
 	if (blkid_probe_enable_partitions(pr, 1))
 		goto out_free_probe;

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

#1 lore raw
Quoted 9 lines · Eric Sandeen
# /sbin/mkfs.xfs -dfile,name=grrr,size=100g
mkfs.xfs: Use the -f option to force overwrite.

check_overwrite is failing, because blkid_new_probe_from_filename() is failing, because the (new) image file is 0 length.

We already return 0 (carry on!) for other internal failures, and nobody tests for a -1 return. So let's just let this one pass too.

I discussed this with Eric. He suggested that instead of simply ignoring the case of not recognizing the underlying file system type, we could report that, and then allow the user to intentionally overwrite it by specifying "-f".

I thought that was a better approach, and he agreed to re-submit a patch that does that.

-Alex

Quoted 20 lines

---

(note, i'm open to comments if we want to differentiate 1/0/-1 in a cleaner fashion...)

mkfs/xfs_mkfs.c +1 -1
index 9a8eff3..53568bc 100644
@@ -296,7 +296,7 @@ check_overwrite(
 
 	pr = blkid_new_probe_from_filename(device);
 	if (!pr)
-		return -1;
+		return 0;
 
 	if (blkid_probe_enable_partitions(pr, 1))
 		goto out_free_probe;
Quoted 4 lines

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

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

#2 lore raw

PATCH v2 1/1 mkfs: fix mkfs.xfs -dfile,name=$NAME for new files

In reply to Eric Sandeen
# /sbin/mkfs.xfs -dfile,name=grrr,size=100g
mkfs.xfs: Use the -f option to force overwrite.

check_overwrite is failing, because blkid_new_probe_from_filename() is failing, because the (new) image file is 0 length.

It's easy to test for 0 length, and if found, there is nothing to overwrite so return 0.

Also, if testing itself failed for some reason, print a message to that effect:

# mkfs/mkfs.xfs -dfile,name=newfile,size=1g
mkfs.xfs: probe of newfile failed, cannot detect existing filesystem.
mkfs.xfs: Use the -f option to force overwrite.

---

mkfs/xfs_mkfs.c +32 -7
index faaafed..b6801dd 100644
@@ -283,27 +283,47 @@ calc_stripe_factors(
 }
 
 #ifdef ENABLE_BLKID
+/*
+ * Check for existing filesystem or partition table on device.
+ * Returns:
+ *	 1 for existing fs or partition
+ *	 0 for nothing found
+ *	-1 for internal error
+ */
 static int
 check_overwrite(
 	char		*device)
 {
 	const char	*type;
-	blkid_probe	pr;
-	int		ret = 0;
+	blkid_probe	pr = NULL;
+	int		ret;
+	struct stat	statbuf;
 
 	if (!device || !*device)
 		return 0;
 
+	ret = -1; /* will reset on success of all setup calls */
+
+	if (stat(device, &statbuf) < 0)
+		goto out;
+
+	/* nothing to overwrite on a 0-length device */
+	if (statbuf.st_size == 0) {
+		ret = 0;
+		goto out;
+	}
+
 	pr = blkid_new_probe_from_filename(device);
 	if (!pr)
-		return -1;
+		goto out;
 
 	if (blkid_probe_enable_partitions(pr, 1))
-		goto out_free_probe;
+		goto out;
 
 	if (blkid_do_fullprobe(pr))
-		goto out_free_probe;
+		goto out;
 
+	ret = 0;
 	if (!blkid_probe_lookup_value(pr, "TYPE", &type, NULL)) {
 		fprintf(stderr,
 			_("%s: %s appears to contain an existing "
@@ -316,8 +336,13 @@ check_overwrite(
 		ret = 1;
 	}
 
-out_free_probe:
-	blkid_free_probe(pr);
+out:
+	if (pr)
+		blkid_free_probe(pr);
+	if (ret == -1)
+		fprintf(stderr,
+			_("%s: probe of %s failed, cannot detect "
+			  "existing filesystem.\n"), progname, device);
 	return ret;
 }
 

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

Reviewed-by on v2 1/1
#3 lore raw
Quoted 9 lines · Eric Sandeen
# /sbin/mkfs.xfs -dfile,name=grrr,size=100g
mkfs.xfs: Use the -f option to force overwrite.

check_overwrite is failing, because blkid_new_probe_from_filename() is failing, because the (new) image file is 0 length.

It's easy to test for 0 length, and if found, there is nothing to overwrite so return 0.

Quoted 6 lines

Also, if testing itself failed for some reason, print a message to that effect:

# mkfs/mkfs.xfs -dfile,name=newfile,size=1g
mkfs.xfs: probe of newfile failed, cannot detect existing filesystem.
mkfs.xfs: Use the -f option to force overwrite.

This looks good.

Quoted 2 lines

---

Quoted 74 lines
mkfs/xfs_mkfs.c +32 -7
index faaafed..b6801dd 100644
@@ -283,27 +283,47 @@ calc_stripe_factors(
 }
 
 #ifdef ENABLE_BLKID
+/*
+ * Check for existing filesystem or partition table on device.
+ * Returns:
+ *	 1 for existing fs or partition
+ *	 0 for nothing found
+ *	-1 for internal error
+ */
 static int
 check_overwrite(
 	char		*device)
 {
 	const char	*type;
-	blkid_probe	pr;
-	int		ret = 0;
+	blkid_probe	pr = NULL;
+	int		ret;
+	struct stat	statbuf;
 
 	if (!device || !*device)
 		return 0;
 
+	ret = -1; /* will reset on success of all setup calls */
+
+	if (stat(device, &statbuf) < 0)
+		goto out;
+
+	/* nothing to overwrite on a 0-length device */
+	if (statbuf.st_size == 0) {
+		ret = 0;
+		goto out;
+	}
+
 	pr = blkid_new_probe_from_filename(device);
 	if (!pr)
-		return -1;
+		goto out;
 
 	if (blkid_probe_enable_partitions(pr, 1))
-		goto out_free_probe;
+		goto out;
 
 	if (blkid_do_fullprobe(pr))
-		goto out_free_probe;
+		goto out;
 
+	ret = 0;
 	if (!blkid_probe_lookup_value(pr, "TYPE", &type, NULL)) {
 		fprintf(stderr,
 			_("%s: %s appears to contain an existing "
@@ -316,8 +336,13 @@ check_overwrite(
 		ret = 1;
 	}
 
-out_free_probe:
-	blkid_free_probe(pr);
+out:
+	if (pr)
+		blkid_free_probe(pr);
+	if (ret == -1)
+		fprintf(stderr,
+			_("%s: probe of %s failed, cannot detect "
+			  "existing filesystem.\n"), progname, device);
 	return ret;
 }
 
Quoted 4 lines

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

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

#4 lore raw
Quoted 10 lines · Alex Elder
Quoted 9 lines · Eric Sandeen
# /sbin/mkfs.xfs -dfile,name=grrr,size=100g
mkfs.xfs: Use the -f option to force overwrite.

check_overwrite is failing, because blkid_new_probe_from_filename() is failing, because the (new) image file is 0 length.

It's easy to test for 0 length, and if found, there is nothing to overwrite so return 0.

Quoted 8 lines
Quoted 6 lines

Also, if testing itself failed for some reason, print a message to that effect:

# mkfs/mkfs.xfs -dfile,name=newfile,size=1g
mkfs.xfs: probe of newfile failed, cannot detect existing filesystem.
mkfs.xfs: Use the -f option to force overwrite.

This looks good.

except of course that st_size for devices is 0.

Oh, I suck lately :/

Ok, will send fixup patch later. And then I'm gonna stop ;)

-Eric

Quoted 79 lines
Quoted 2 lines

---

Quoted 74 lines
mkfs/xfs_mkfs.c +32 -7
index faaafed..b6801dd 100644
@@ -283,27 +283,47 @@ calc_stripe_factors(
 }
 
 #ifdef ENABLE_BLKID
+/*
+ * Check for existing filesystem or partition table on device.
+ * Returns:
+ *	 1 for existing fs or partition
+ *	 0 for nothing found
+ *	-1 for internal error
+ */
 static int
 check_overwrite(
 	char		*device)
 {
 	const char	*type;
-	blkid_probe	pr;
-	int		ret = 0;
+	blkid_probe	pr = NULL;
+	int		ret;
+	struct stat	statbuf;
 
 	if (!device || !*device)
 		return 0;
 
+	ret = -1; /* will reset on success of all setup calls */
+
+	if (stat(device, &statbuf) < 0)
+		goto out;
+
+	/* nothing to overwrite on a 0-length device */
+	if (statbuf.st_size == 0) {
+		ret = 0;
+		goto out;
+	}
+
 	pr = blkid_new_probe_from_filename(device);
 	if (!pr)
-		return -1;
+		goto out;
 
 	if (blkid_probe_enable_partitions(pr, 1))
-		goto out_free_probe;
+		goto out;
 
 	if (blkid_do_fullprobe(pr))
-		goto out_free_probe;
+		goto out;
 
+	ret = 0;
 	if (!blkid_probe_lookup_value(pr, "TYPE", &type, NULL)) {
 		fprintf(stderr,
 			_("%s: %s appears to contain an existing "
@@ -316,8 +336,13 @@ check_overwrite(
 		ret = 1;
 	}
 
-out_free_probe:
-	blkid_free_probe(pr);
+out:
+	if (pr)
+		blkid_free_probe(pr);
+	if (ret == -1)
+		fprintf(stderr,
+			_("%s: probe of %s failed, cannot detect "
+			  "existing filesystem.\n"), progname, device);
 	return ret;
 }
 
Quoted 10 lines
Quoted 4 lines

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

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

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