From owner-freebsd-scsi@FreeBSD.ORG Tue Jun 3 13:05:35 2003 Return-Path: Delivered-To: freebsd-scsi@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 9B21E37B401 for ; Tue, 3 Jun 2003 13:05:35 -0700 (PDT) Received: from matou.sibbald.com (matou.sibbald.com [195.202.201.48]) by mx1.FreeBSD.org (Postfix) with ESMTP id D108143F85 for ; Tue, 3 Jun 2003 13:05:32 -0700 (PDT) (envelope-from kern@sibbald.com) Received: from [192.168.68.112] (rufus [192.168.68.112]) by matou.sibbald.com (8.11.6/8.11.6) with ESMTP id h53K4vv10899; Tue, 3 Jun 2003 22:04:57 +0200 From: Kern Sibbald To: "Justin T. Gibbs" In-Reply-To: <955950000.1054667601@aslan.btc.adaptec.com> References: <3EDB31AB.16420.C8964B7D@localhost> <3EDB59A4.27599.C93270FB@localhost> <20030602110836.H71034@beppo> <20030602131225.F71034@beppo> <1054645616.13630.161.camel@rufus> <20030603072944.U44880@beppo> <1054652678.13630.209.camel@rufus> <882210000.1054657530@aslan.btc.adaptec.com> <1054658432.13630.252.camel@rufus> <900070000.1054659860@aslan.btc.adaptec.com> <1054660763.13630.279.camel@rufus> <955950000.1054667601@aslan.btc.adaptec.com> Content-Type: text/plain Organization: Message-Id: <1054670696.13606.302.camel@rufus> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.4 Date: 03 Jun 2003 22:04:56 +0200 Content-Transfer-Encoding: 7bit cc: freebsd-scsi@freebsd.org cc: mjacob@feral.com Subject: Re: SCSI tape data loss X-BeenThere: freebsd-scsi@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: SCSI subsystem List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 03 Jun 2003 20:05:35 -0000 I cannot argue with what you write other than to say that I generally use uint32_t for variables that are positive integers, so I have them everywhere and to change wlen to signed would lead to a flood of changes of other variables. If I remember right one thing that pushed me in this direction is the fact that sizeof() is unsigned. By the way, I've just completed a much simpler test that I ask Dan to try to see if we can reproduce the problem in a simpler case. Best regards, Kern On Tue, 2003-06-03 at 21:13, Justin T. Gibbs wrote: > >> > By the way, the funny casting is mandatory in C++, > >> > because ssize_t as returned by the write is not the > >> > same as size_t (what is written). > > > > If I remove the (uint32_t) cast, I get an error message: > > > > c++ -c -I. -I.. -g -O2 -Wall block.c > > block.c: In function `int write_block_to_dev (JCR *, DEVICE *, > > DEV_BLOCK *)': > > block.c:381: warning: comparison between signed and unsigned integer > > expressions > > > > Line 381 reads: > > > > if ((stat=write(dev->fd, block->buf, (size_t)wlen)) != wlen) { > > > > so I will stick with my funny casting. > > > > This has nothing to do with type size or the fact that you are > using C++. The same warning would occur when your code is > compiled as C. wlen should be a signed type. Since wlen > by definition cannot be larger than the largest positive integer > reportable by the signed return value of write, using an unsigned > type buys you nothing. Conversion from ssize_t to size_t will > occur without error if you happen to chose to make wlen an ssize_t. > > I guess it matters little. My own philosophy is that casts should > be used as a last resort rather than deployed indiscriminantly to > cover up compile warnings. The above casts are easily avoidable > which is why I mentioned them at all. > > -- > Justin