]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/os/types_windows.go
os: report IO_REPARSE_TAG_DEDUP files as regular in Stat and Lstat
[gostls13.git] / src / os / types_windows.go
index b457410a4fee1884a5f7a5b055765696cf3ef96d..6b9fef6c123f61e125c6200a60b0a59f9a498fc6 100644 (file)
@@ -185,7 +185,23 @@ func (fs *fileStat) Mode() (m FileMode) {
                m |= ModeDevice | ModeCharDevice
        }
        if fs.FileAttributes&syscall.FILE_ATTRIBUTE_REPARSE_POINT != 0 && m&ModeType == 0 {
-               m |= ModeIrregular
+               if fs.ReparseTag == windows.IO_REPARSE_TAG_DEDUP {
+                       // If the Data Deduplication service is enabled on Windows Server, its
+                       // Optimization job may convert regular files to IO_REPARSE_TAG_DEDUP
+                       // whenever that job runs.
+                       //
+                       // However, DEDUP reparse points remain similar in most respects to
+                       // regular files: they continue to support random-access reads and writes
+                       // of persistent data, and they shouldn't add unexpected latency or
+                       // unavailability in the way that a network filesystem might.
+                       //
+                       // Go programs may use ModeIrregular to filter out unusual files (such as
+                       // raw device files on Linux, POSIX FIFO special files, and so on), so
+                       // to avoid files changing unpredictably from regular to irregular we will
+                       // consider DEDUP files to be close enough to regular to treat as such.
+               } else {
+                       m |= ModeIrregular
+               }
        }
        return m
 }