Date: Sat, 10 Jul 2010 20:38:12 +0200 From: "C. P. Ghost" <cpghost@cordula.ws> To: Patrick Donnelly <batrick@batbytes.com> Cc: questions@freebsd.org Subject: Re: Writes to Hard Disk Going Beyond Capacity Message-ID: <AANLkTinLsM2EEGMZEthZ95YDPnD7Ey20xbeiOR3sXWMp@mail.gmail.com> In-Reply-To: <AANLkTilc1NdTqA91CTxINnAdtyE2ToViPdytTTnwkIm0@mail.gmail.com> References: <AANLkTin9-MymICgQoSjFlKbLXN2Efm5_3r6X1lufqiCo@mail.gmail.com> <87iq4nsr3a.fsf@kobe.laptop> <AANLkTilAuZ3MkzDP5_f7ETk0wcvWR7OLYB8G4c_JVpj9@mail.gmail.com> <AANLkTilc1NdTqA91CTxINnAdtyE2ToViPdytTTnwkIm0@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, Jul 10, 2010 at 6:03 PM, C. P. Ghost <cpghost@cordula.ws> wrote: > On Sat, Jul 10, 2010 at 12:53 PM, Patrick Donnelly <batrick@batbytes.com> wrote: >> On Sat, Jul 10, 2010 at 4:01 AM, Giorgos Keramidas >> <keramida@ceid.upatras.gr> wrote: >>> On Sat, 10 Jul 2010 03:10:31 -0400, Patrick Donnelly <batrick@batbytes.com> wrote: >>>> Hi List, >>>> >>>> I have a strange problem in a C program I wrote. I open a hard >>>> disk character file (/dev/ad1) and attempt to write over the >>>> entire disk. I expect the last write that would go beyond the >>>> hard disk length (capacity) to return with an error but instead >>>> the write succeeds. This happens for hundreds of gigabytes >>>> beyond the file (hard drive) length. What could be wrong? (This >>>> program works fine on Linux. The last write that would go >>>> beyond the end of the hard drive returns with -1.) >>>> >>>> Thanks for any help, >>> >>> Can we see the exact source code of the program? What you >>> describe might work if the file has holes inside it. >> >> http://www.batbytes.com/destroy >> >> Specifically, after filling the hard drive it will begin to rapidly >> "write" where the throughput of the writes is about 10 GB/s (obviously >> not going to the hard drive). > > Are you aware of short writes? > > static int write_buf (int fd, const char *buf, size_t s) > { > ssize_t r = write(fd, buf, s); > if (r == -1) > fprintf(stderr, "write error: %s\n", strerror(errno)); > return r >= 0; > } > > What if write(2) returns less than s, but not -1? Or, to be more precise, is it possible that write(2) returns 0 for some reason, perhaps because the device isn't ready and can't accept more data, so it says that it wrote 0 bytes, but that you are free to try again? On Solaris, the write(2) man page says: If a write() requests that more bytes be written than there is room for—for example, if the write would exceed the process file size limit (see getrlimit(2) and ulimit(2)), the system file size limit, or the free space on the device—only as many bytes as there is room for will be written. For example, suppose there is space for 20 bytes more in a file before reaching a limit. A write() of 512-bytes returns 20. The next write() of a non-zero number of bytes gives a failure return (except as noted for pipes and FIFO below). http://docs.sun.com/app/docs/doc/816-5167/write-2?l=en&n=1&a=view Have you tried your program on [Open]Solaris too? What happens there? Perhaps our write(2) isn't entirely IEEE Std 1003.1 compliant? Because write(2) there says: If a write() requests that more bytes be written than there is room for (for example, [XSI] [Option Start] the process' file size limit or [Option End] the physical end of a medium), only as many bytes as there is room for shall be written. For example, suppose there is space for 20 bytes more in a file before reaching a limit. A write of 512 bytes will return 20. The next write of a non-zero number of bytes would give a failure return (except as noted below). (...) http://www.opengroup.org/onlinepubs/000095399/functions/write.html Hmmm... any C/POSIX standards lawyers/specialists here? -cpghost. -- Cordula's Web. http://www.cordula.ws/
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AANLkTinLsM2EEGMZEthZ95YDPnD7Ey20xbeiOR3sXWMp>
