Date: Thu, 11 Mar 1999 10:20:48 -0800 (PST) From: Matthew Dillon <dillon@apollo.backplane.com> To: "Mark J. Taylor" <mtaylor@cybernet.com> Cc: jkh@FreeBSD.ORG, msmith@FreeBSD.ORG, freebsd-hackers@FreeBSD.ORG Subject: Re: ccd driver problems with > 2GB segments, +fix Message-ID: <199903111820.KAA66914@apollo.backplane.com> References: <XFMail.990311110304.mtaylor@cybernet.com>
index | next in thread | previous in thread | raw e-mail
:The fixes actually came at two separate times: one to fix
:the panic, and another to fix the filesystem.
:...
:The second fix (the off_t) is really the only fix needed. The
:first patch (the u_long) is not necessary: it hid the real
:problem under most cases (32 bit << 9 being put into a 32 bit
:value ends up being negative much of the time!), until the
:math worked out "badly".
:
:Here's the final and complete patch (for -current):
:(this is exactly what NetBSD does, BTW)
Ah! Ok, now I understand.
This seems totally reasonable. Jordan or David, can you commit this
into -4.x plus backport it to 3.x? I don't think it needs any additional
review.
-Matt
Matthew Dillon
<dillon@backplane.com>
:*** ccd.c.orig Wed Mar 10 11:22:41 1999
:--- ccd.c Thu Mar 11 10:53:13 1999
:***************
:*** 841,846 ****
:--- 841,847 ----
: register struct ccdcinfo *ci, *ci2 = NULL; /* XXX */
: register struct ccdbuf *cbp;
: register daddr_t cbn, cboff;
:+ register off_t cbc;
:
: #ifdef DEBUG
: if (ccddebug & CCDB_IO)
:***************
:*** 919,929 ****
: LIST_INIT(&cbp->cb_buf.b_dep);
: cbp->cb_buf.b_resid = 0;
: if (cs->sc_ileave == 0)
:! cbp->cb_buf.b_bcount = dbtob(ci->ci_size - cbn);
: else
:! cbp->cb_buf.b_bcount = dbtob(cs->sc_ileave - cboff);
:! if (cbp->cb_buf.b_bcount > bcount)
:! cbp->cb_buf.b_bcount = bcount;
:
: cbp->cb_buf.b_bufsize = cbp->cb_buf.b_bcount;
:
:--- 920,929 ----
: LIST_INIT(&cbp->cb_buf.b_dep);
: cbp->cb_buf.b_resid = 0;
: if (cs->sc_ileave == 0)
:! cbc = dbtob((off_t)(ci->ci_size - cbn));
: else
:! cbc = dbtob((off_t)(cs->sc_ileave - cboff));
:! cbp->cb_buf.b_bcount = (cbc < bcount) ? cbc : bcount;
:
: cbp->cb_buf.b_bufsize = cbp->cb_buf.b_bcount;
:
:
:
:
:
:On 11-Mar-99 Matthew Dillon wrote:
:> Interesting. What if each disk is 8GB and we set the stripe
:> size to 8GB? Won't that break the u_long ( i.e. was broken
:> before, and is still broken now ). Perhaps these variables
:> should be 64 bit quantities throughout except for the
:> bp->b_count?
:>
:> -Matt
:> Matthew Dillon
:> <dillon@backplane.com>
:>
:>:Fix:
:>:The ccd driver has a variable "bcount" that is a long: it needs
:>:to be a u_long. And, a 64 bit int is shifted into a 32 bit int
:>:in ccdbuffer(): the 32 bit int must changed to be a 64 bit int.
:>:
:>:This second change has already been made in NetBSD (somebody else
:>:figured it out), where the ccd driver originated from. It was
:>:rather tricky to find: the math involving block numbers and ccd
:>:...
:
:--------------------------------------------------------------------
:Mark J. Taylor Networking Research
:Cybernet Systems mtaylor@cybernet.com
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199903111820.KAA66914>
