Writes to Hard Disk Going Beyond Capacity

C. P. Ghost cpghost at cordula.ws
Sat Jul 10 18:38:20 UTC 2010


On Sat, Jul 10, 2010 at 6:03 PM, C. P. Ghost <cpghost at cordula.ws> wrote:
> On Sat, Jul 10, 2010 at 12:53 PM, Patrick Donnelly <batrick at batbytes.com> wrote:
>> On Sat, Jul 10, 2010 at 4:01 AM, Giorgos Keramidas
>> <keramida at ceid.upatras.gr> wrote:
>>> On Sat, 10 Jul 2010 03:10:31 -0400, Patrick Donnelly <batrick at 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/


More information about the freebsd-questions mailing list