os: have RemoveAll loop on EINTR

Fixes #57966

Change-Id: Ia732d499ff9bd6e70030daab8fac42d1e204be37
Reviewed-on: https://go-review.googlesource.com/c/go/+/463076
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Bryan Mills <bcmills@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Run-TryBot: Nigel Tao <nigeltao@golang.org>
Reviewed-by: Nigel Tao (INACTIVE; USE @golang.org INSTEAD) <nigeltao@google.com>
diff --git a/src/os/removeall_at.go b/src/os/removeall_at.go
index 8b46152..306debd 100644
--- a/src/os/removeall_at.go
+++ b/src/os/removeall_at.go
@@ -58,7 +58,9 @@
 func removeAllFrom(parent *File, base string) error {
 	parentFd := int(parent.Fd())
 	// Simple case: if Unlink (aka remove) works, we're done.
-	err := unix.Unlinkat(parentFd, base, 0)
+	err := ignoringEINTR(func() error {
+		return unix.Unlinkat(parentFd, base, 0)
+	})
 	if err == nil || IsNotExist(err) {
 		return nil
 	}
@@ -75,7 +77,9 @@
 
 	// Is this a directory we need to recurse into?
 	var statInfo syscall.Stat_t
-	statErr := unix.Fstatat(parentFd, base, &statInfo, unix.AT_SYMLINK_NOFOLLOW)
+	statErr := ignoringEINTR(func() error {
+		return unix.Fstatat(parentFd, base, &statInfo, unix.AT_SYMLINK_NOFOLLOW)
+	})
 	if statErr != nil {
 		if IsNotExist(statErr) {
 			return nil
@@ -151,7 +155,9 @@
 	}
 
 	// Remove the directory itself.
-	unlinkError := unix.Unlinkat(parentFd, base, unix.AT_REMOVEDIR)
+	unlinkError := ignoringEINTR(func() error {
+		return unix.Unlinkat(parentFd, base, unix.AT_REMOVEDIR)
+	})
 	if unlinkError == nil || IsNotExist(unlinkError) {
 		return nil
 	}