Andrey Repin wrote:
dd if=/dev/zero of=/dev/sda iflag=fullblock bs=4M status=progress
The root of the problem is that the Windows WriteFile() function apparently does not support truncated writes at EOM. If seek_position + write_size > disk_size, then WriteFile() does nothing and returns an error.
oflag=direct Although I'm unsure how Cygwin/Windows handles it. But without this flag, the write is cached, and the problem may be outside dd, or even Cygwin.
If 'oflag=direct' is used, dd passes O_DIRECT flag to open() call of output file. Cygwin's open() function then passes FILE_NO_INTERMEDIATE_BUFFERING to NtCreateFile() and the write() function calls WriteFile() directly with original address and size.
Without O_DIRECT, Cygwin ensures that address and size passed to WriteFile() are both aligned to sector size. All writes are then done through a 64KiB internal buffer.
As a consequence, oflag=direct in the above dd command may increase speed but would also let the final 4MiB WriteFile() fail. Without oflag=direct, only the last 64KiB WriteFile() fails.
To clear the last sectors of the disk, use an appropriate small block size. I did this several times with Cygwin 'dd seek=... bs=512 ...' to get rid of Intel RST RAID metadata.
-- Regards, Christian -- Problem reports: https://cygwin.com/problems.html FAQ: https://cygwin.com/faq/ Documentation: https://cygwin.com/docs.html Unsubscribe info: https://cygwin.com/ml/#unsubscribe-simple