From owner-freebsd-questions@FreeBSD.ORG Sat Jul 10 18:38:20 2010 Return-Path: Delivered-To: questions@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 25CB8106566B for ; Sat, 10 Jul 2010 18:38:20 +0000 (UTC) (envelope-from cpghost@cordula.ws) Received: from mail-wy0-f182.google.com (mail-wy0-f182.google.com [74.125.82.182]) by mx1.freebsd.org (Postfix) with ESMTP id B9CC98FC18 for ; Sat, 10 Jul 2010 18:38:19 +0000 (UTC) Received: by wyb34 with SMTP id 34so2944979wyb.13 for ; Sat, 10 Jul 2010 11:38:13 -0700 (PDT) MIME-Version: 1.0 Received: by 10.216.4.199 with SMTP id 49mr1112201wej.26.1278787092910; Sat, 10 Jul 2010 11:38:12 -0700 (PDT) Received: by 10.216.65.3 with HTTP; Sat, 10 Jul 2010 11:38:12 -0700 (PDT) X-Originating-IP: [93.203.29.70] In-Reply-To: References: <87iq4nsr3a.fsf@kobe.laptop> Date: Sat, 10 Jul 2010 20:38:12 +0200 Message-ID: From: "C. P. Ghost" To: Patrick Donnelly Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable Cc: questions@freebsd.org Subject: Re: Writes to Hard Disk Going Beyond Capacity X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 10 Jul 2010 18:38:20 -0000 On Sat, Jul 10, 2010 at 6:03 PM, C. P. Ghost wrote: > On Sat, Jul 10, 2010 at 12:53 PM, Patrick Donnelly = wrote: >> On Sat, Jul 10, 2010 at 4:01 AM, Giorgos Keramidas >> wrote: >>> On Sat, 10 Jul 2010 03:10:31 -0400, Patrick Donnelly 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/