diff --git a/src/os/file.go b/src/os/file.go
index e8d2de1b3cb5cf92ace4039922f3d8a98d92bb37..c46c9030b91b2195567f6f002a6bd92a08121aaa 100644
--- a/src/os/file.go
+++ b/src/os/file.go
@@ -625,6 +625,7 @@ func DirFS(dir string) fs.FS {
 	return dirFS(dir)
 }
 
+// containsAny reports whether any bytes in chars are within s.
 func containsAny(s, chars string) bool {
 	for i := 0; i < len(s); i++ {
 		for j := 0; j < len(chars); j++ {
@@ -644,14 +645,12 @@ func (dir dirFS) Open(name string) (fs.File, error) {
 	}
 	f, err := Open(dir.join(name))
 	if err != nil {
-		if runtime.GOOS == "windows" {
-			// Undo the backslash conversion done by dir.join.
-			perr := err.(*PathError)
-			if containsAny(perr.Path, `\`) {
-				perr.Path = string(dir) + "/" + name
-			}
-		}
-		return nil, err // nil fs.File
+		// DirFS takes a string appropriate for GOOS,
+		// while the name argument here is always slash separated.
+		// dir.join will have mixed the two; undo that for
+		// error reporting.
+		err.(*PathError).Path = name
+		return nil, err
 	}
 	return f, nil
 }
@@ -662,6 +661,8 @@ func (dir dirFS) Stat(name string) (fs.FileInfo, error) {
 	}
 	f, err := Stat(dir.join(name))
 	if err != nil {
+		// See comment in dirFS.Open.
+		err.(*PathError).Path = name
 		return nil, err
 	}
 	return f, nil
diff --git a/src/os/os_test.go b/src/os/os_test.go
index 550b7db5a3327e4c8f5026ff23950fa4d48b7824..52fac4f63c452ab3282bb2945ee655d39c925758 100644
--- a/src/os/os_test.go
+++ b/src/os/os_test.go
@@ -2717,7 +2717,8 @@ func TestDirFS(t *testing.T) {
 		t.Fatal(err)
 	}
 
-	// Test that the error message does not contain a backslash.
+	// Test that the error message does not contain a backslash,
+	// and does not contain the DirFS argument.
 	const nonesuch = "dir/nonesuch"
 	_, err := fs.Open(nonesuch)
 	if err == nil {
@@ -2726,6 +2727,9 @@ func TestDirFS(t *testing.T) {
 		if !strings.Contains(err.Error(), nonesuch) {
 			t.Errorf("error %q does not contain %q", err, nonesuch)
 		}
+		if strings.Contains(err.Error(), "testdata") {
+			t.Errorf("error %q contains %q", err, "testdata")
+		}
 	}
 
 	// Test that Open does not accept backslash as separator.