Skip site navigation (1)Skip section navigation (2)
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. =A0This 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? =A0What 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)
> {
> =A0ssize_t r =3D write(fd, buf, s);
> =A0if (r =3D=3D -1)
> =A0 =A0fprintf(stderr, "write error: %s\n", strerror(errno));
> =A0return r >=3D 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=97for 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=97only 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=3Den&n=3D1&a=3Dview

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.

--=20
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>