X-Spam-Check-By: sourceware.org Date: Thu, 8 Dec 2005 11:56:34 +0100 From: Corinna Vinschen To: cygwin AT cygwin DOT com Subject: Re: Error reported dd'ing close of end of block device with skip Message-ID: <20051208105634.GD25739@calimero.vinschen.de> Reply-To: cygwin AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com References: <20051207183555 DOT GD2999 AT calimero DOT vinschen DOT de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20051207183555.GD2999@calimero.vinschen.de> User-Agent: Mutt/1.4.2i Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm Precedence: bulk List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com On Dec 7 19:35, Corinna Vinschen wrote: > On Dec 7 11:55, Loh, Joe wrote: > > QUESTION: > > > > Is there a way in Cygwin to do a read of a block device using "C" that > > does not do a read-ahead? We needed to develop an application that will > > issue the exact transfer size to the target device as requested. > > Looking at the strace, it appears that read() less than 61440-bytes gets > > translated to reading 61440 bytes into buffer and then a subset of that > > read is returned to the caller. > > There's a non-portable (only Cygwin) way to set the buffer size after > opening a device: > > #include > > struct rdop rd; > > fd = open ("dev/sda", ...); > > rd.rd_op = RDSETBLK; > rd.rd_parm = 0; /* Unbuffered reading */ > rd.rd_parm = 1; /* Unbuffered reading */ > rd.rd_parm = n; /* Buffered reading with buffer size n */ > > ioctl (fd, RDIOCDOP, &rd); > > Note that the ioctl fails if the buffer already contains data, so ioctl > should be called before the first read. Also note that in unbuffered > mode the usual Windows blocking rule applies, the length given to read > must be a multiple of 512. > > Sigh, it seems that I introduced a bug into this ioctl also not long ago. > I fixed this in CVS. Recent code will probably not work very well when > setting it to unbuffered mode. Please wait for the next developers > snapshot. I just added another requirement, that rd.rd_parm must be either 0, 1, or a multiple of 512. Other sizes for buffers don't make much sense. Corinna -- Corinna Vinschen Please, send mails regarding Cygwin to Cygwin Project Co-Leader cygwin AT cygwin DOT com Red Hat, Inc. -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/