PERFORCE change 55679 for review
Robert Watson
rwatson at FreeBSD.org
Thu Jun 24 03:47:03 GMT 2004
http://perforce.freebsd.org/chv.cgi?CH=55679
Change 55679 by rwatson at rwatson_tislabs on 2004/06/24 03:46:34
Integrate netperf_socket to loop back a variety of changes
associated with rwatson_netperf, including:
- portalfs locking
- expand sockbuf locking in sopoll() to include selrecord()
- add sbreserve_locked(), expand and coallesce locking in
soreserve()
- ng_base locking fixes
- when asserting various network locks, also conditionally
assert giant
- lock some accesses to inpcb fields in ip_ctloutput()
- clean up socket buffer locking in tcp_input, covering
oobmark, sbdrop() for ACK processing, tcp_mss(), etc
- netnatm const merge
- sb_flags locking in nfs_socket
- mac_ifnet_mtx, mpo_copy_label, don't externalize holding
mutex
Affected files ...
.. //depot/projects/netperf_socket/sys/compat/svr4/imgact_svr4.c#3 integrate
.. //depot/projects/netperf_socket/sys/conf/options.sparc64#4 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/acpi.c#27 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/acpi_cpu.c#11 integrate
.. //depot/projects/netperf_socket/sys/dev/acpica/acpi_pci.c#12 integrate
.. //depot/projects/netperf_socket/sys/dev/ofw/ofw_console.c#7 integrate
.. //depot/projects/netperf_socket/sys/fs/portalfs/portal_vnops.c#7 integrate
.. //depot/projects/netperf_socket/sys/fs/udf/udf_vnops.c#5 integrate
.. //depot/projects/netperf_socket/sys/geom/vinum/geom_vinum.c#3 integrate
.. //depot/projects/netperf_socket/sys/geom/vinum/geom_vinum_plex.c#4 integrate
.. //depot/projects/netperf_socket/sys/geom/vinum/geom_vinum_raid5.c#4 integrate
.. //depot/projects/netperf_socket/sys/geom/vinum/geom_vinum_raid5.h#2 integrate
.. //depot/projects/netperf_socket/sys/i386/linux/imgact_linux.c#3 integrate
.. //depot/projects/netperf_socket/sys/kern/uipc_socket.c#23 integrate
.. //depot/projects/netperf_socket/sys/kern/uipc_socket2.c#20 integrate
.. //depot/projects/netperf_socket/sys/kern/uipc_syscalls.c#21 integrate
.. //depot/projects/netperf_socket/sys/netgraph/ng_base.c#4 integrate
.. //depot/projects/netperf_socket/sys/netinet/in_pcb.h#4 integrate
.. //depot/projects/netperf_socket/sys/netinet/ip_dummynet.c#5 integrate
.. //depot/projects/netperf_socket/sys/netinet/ip_fw2.c#8 integrate
.. //depot/projects/netperf_socket/sys/netinet/ip_mroute.c#7 integrate
.. //depot/projects/netperf_socket/sys/netinet/ip_output.c#12 integrate
.. //depot/projects/netperf_socket/sys/netinet/tcp_input.c#13 integrate
.. //depot/projects/netperf_socket/sys/netinet/tcp_subr.c#11 integrate
.. //depot/projects/netperf_socket/sys/netnatm/natm.c#5 integrate
.. //depot/projects/netperf_socket/sys/nfsclient/nfs_socket.c#8 integrate
.. //depot/projects/netperf_socket/sys/security/mac/mac_net.c#5 integrate
.. //depot/projects/netperf_socket/sys/security/mac_biba/mac_biba.c#4 integrate
.. //depot/projects/netperf_socket/sys/security/mac_lomac/mac_lomac.c#4 integrate
.. //depot/projects/netperf_socket/sys/security/mac_mls/mac_mls.c#4 integrate
.. //depot/projects/netperf_socket/sys/security/mac_stub/mac_stub.c#4 integrate
.. //depot/projects/netperf_socket/sys/security/mac_test/mac_test.c#5 integrate
.. //depot/projects/netperf_socket/sys/sparc64/conf/NOTES#4 integrate
.. //depot/projects/netperf_socket/sys/sys/mac_policy.h#5 integrate
.. //depot/projects/netperf_socket/sys/sys/socketvar.h#18 integrate
.. //depot/projects/netperf_socket/sys/vm/uma_core.c#7 integrate
.. //depot/projects/netperf_socket/sys/vm/vm_pageout.c#6 integrate
Differences ...
==== //depot/projects/netperf_socket/sys/compat/svr4/imgact_svr4.c#3 (text+ko) ====
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/svr4/imgact_svr4.c,v 1.22 2004/02/04 21:52:53 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/svr4/imgact_svr4.c,v 1.23 2004/06/24 02:21:17 obrien Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -90,7 +90,7 @@
}
bss_size = round_page(a_out->a_bss);
#ifdef DEBUG
- printf("imgact: text: %08lx, data: %08lx, bss: %08lx\n", a_out->a_text, a_out->a_data, bss_size);
+ printf("imgact: text: %08lx, data: %08lx, bss: %08lx\n", (u_long)a_out->a_text, (u_long)a_out->a_data, bss_size);
#endif
/*
@@ -193,7 +193,7 @@
#ifdef DEBUG
printf("imgact: startaddr=%08lx, length=%08lx\n", (u_long)vmaddr,
- a_out->a_text + a_out->a_data);
+ (u_long)a_out->a_text + a_out->a_data);
#endif
/*
* allow read/write of data
==== //depot/projects/netperf_socket/sys/conf/options.sparc64#4 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/options.sparc64,v 1.10 2004/05/08 13:53:46 marius Exp $
+# $FreeBSD: src/sys/conf/options.sparc64,v 1.11 2004/06/24 02:57:10 obrien Exp $
SUN4U opt_global.h
@@ -9,6 +9,7 @@
PSYCHO_DEBUG opt_psycho.h
DEBUGGER_ON_POWERFAIL opt_psycho.h
OFW_PCI_DEBUG opt_ofw_pci.h
+OFWCONS_POLL_HZ opt_ofw.h
# Debug IOMMU inserts/removes using diagnostic accesses. Very loud.
IOMMU_DIAG opt_iommu.h
PMAP_STATS opt_pmap.h
==== //depot/projects/netperf_socket/sys/dev/acpica/acpi.c#27 (text+ko) ====
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/dev/acpica/acpi.c,v 1.164 2004/06/23 17:21:02 jhb Exp $
+ * $FreeBSD: src/sys/dev/acpica/acpi.c,v 1.165 2004/06/24 00:48:45 njl Exp $
*/
#include "opt_acpi.h"
@@ -129,7 +129,6 @@
static ACPI_STATUS acpi_probe_child(ACPI_HANDLE handle, UINT32 level,
void *context, void **status);
static void acpi_shutdown_final(void *arg, int howto);
-static void acpi_shutdown_poweroff(void *arg);
static void acpi_enable_fixed_events(struct acpi_softc *sc);
static int acpi_parse_prw(ACPI_HANDLE h, struct acpi_prw_data *prw);
static ACPI_STATUS acpi_wake_limit(ACPI_HANDLE h, UINT32 level, void *context,
@@ -1282,9 +1281,9 @@
ACPI_STATUS status;
/*
- * If powering off, run the actual shutdown code on each processor.
- * It will only perform the shutdown on the BSP. Some chipsets do
- * not power off the system correctly if called from an AP.
+ * XXX Shutdown code should only run on the BSP (cpuid 0).
+ * Some chipsets do not power off the system correctly if called from
+ * an AP.
*/
if ((howto & RB_POWEROFF) != 0) {
status = AcpiEnterSleepStatePrep(ACPI_STATE_S5);
@@ -1294,36 +1293,20 @@
return;
}
printf("Powering system off using ACPI\n");
- smp_rendezvous(NULL, acpi_shutdown_poweroff, NULL, NULL);
+ ACPI_DISABLE_IRQS();
+ status = AcpiEnterSleepState(ACPI_STATE_S5);
+ if (ACPI_FAILURE(status)) {
+ printf("ACPI power-off failed - %s\n", AcpiFormatException(status));
+ } else {
+ DELAY(1000000);
+ printf("ACPI power-off failed - timeout\n");
+ }
} else {
printf("Shutting down ACPI\n");
AcpiTerminate();
}
}
-/*
- * Since this function may be called with locks held or in an unknown
- * context, it cannot allocate memory, acquire locks, sleep, etc.
- */
-static void
-acpi_shutdown_poweroff(void *arg)
-{
- ACPI_STATUS status;
-
- /* Only attempt to power off if this is the BSP (cpuid 0). */
- if (PCPU_GET(cpuid) != 0)
- return;
-
- ACPI_DISABLE_IRQS();
- status = AcpiEnterSleepState(ACPI_STATE_S5);
- if (ACPI_FAILURE(status)) {
- printf("ACPI power-off failed - %s\n", AcpiFormatException(status));
- } else {
- DELAY(1000000);
- printf("ACPI power-off failed - timeout\n");
- }
-}
-
static void
acpi_enable_fixed_events(struct acpi_softc *sc)
{
==== //depot/projects/netperf_socket/sys/dev/acpica/acpi_cpu.c#11 (text+ko) ====
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_cpu.c,v 1.40 2004/06/19 02:27:23 njl Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_cpu.c,v 1.41 2004/06/24 00:38:51 njl Exp $");
#include "opt_acpi.h"
#include <sys/param.h>
@@ -1046,7 +1046,7 @@
struct sbuf sb;
char buf[128];
int i;
- uint64_t fract, sum, whole;
+ uintmax_t fract, sum, whole;
sum = 0;
for (i = 0; i < cpu_cx_count; i++)
@@ -1054,7 +1054,7 @@
sbuf_new(&sb, buf, sizeof(buf), SBUF_FIXEDLEN);
for (i = 0; i < cpu_cx_count; i++) {
if (sum > 0) {
- whole = cpu_cx_stats[i] * 100;
+ whole = (uintmax_t)cpu_cx_stats[i] * 100;
fract = (whole % sum) * 100;
sbuf_printf(&sb, "%u.%02u%% ", (u_int)(whole / sum),
(u_int)(fract / sum));
==== //depot/projects/netperf_socket/sys/dev/acpica/acpi_pci.c#12 (text+ko) ====
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_pci.c,v 1.19 2004/06/23 15:08:40 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_pci.c,v 1.20 2004/06/24 01:57:31 njl Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -232,7 +232,7 @@
if (ACPI_FAILURE(status))
printf("WARNING: Unable to detach object data from %s - %s\n",
acpi_name(handle), AcpiFormatException(status));
- status = AcpiAttachData(handle, acpi_fake_objhandler, child);
+ status = AcpiAttachData(handle, acpi_fake_objhandler, pci_child);
if (ACPI_FAILURE(status))
printf("WARNING: Unable to attach object data to %s - %s\n",
acpi_name(handle), AcpiFormatException(status));
@@ -261,8 +261,7 @@
dinfo->ap_dinfo.cfg.slot == slot) {
dinfo->ap_handle = handle;
acpi_pci_update_device(handle, devlist[i]);
- free(devlist, M_TEMP);
- return_ACPI_STATUS (AE_OK);
+ break;
}
}
free(devlist, M_TEMP);
==== //depot/projects/netperf_socket/sys/dev/ofw/ofw_console.c#7 (text+ko) ====
@@ -24,10 +24,11 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ofw/ofw_console.c,v 1.24 2004/06/16 09:46:52 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ofw/ofw_console.c,v 1.25 2004/06/24 02:57:11 obrien Exp $");
#include "opt_ddb.h"
#include "opt_comconsole.h"
+#include "opt_ofw.h"
#include <sys/param.h>
#include <sys/kernel.h>
@@ -42,7 +43,10 @@
#include <ddb/ddb.h>
-#define OFW_POLL_HZ 4
+#ifndef OFWCONS_POLL_HZ
+#define OFWCONS_POLL_HZ 4 /* 50-100 works best on Ultra2 */
+#endif
+#define OFBURSTLEN 128 /* max number of bytes to write in one chunk */
static d_open_t ofw_dev_open;
static d_close_t ofw_dev_close;
@@ -125,7 +129,7 @@
ttychars(tp);
tp->t_iflag = TTYDEF_IFLAG;
tp->t_oflag = TTYDEF_OFLAG;
- tp->t_cflag = TTYDEF_CFLAG|CLOCAL;
+ tp->t_cflag = TTYDEF_CFLAG;
tp->t_lflag = TTYDEF_LFLAG;
tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED;
ttsetwater(tp);
@@ -138,7 +142,7 @@
error = ttyld_open(tp, dev);
if (error == 0 && setuptimeout) {
- polltime = hz / OFW_POLL_HZ;
+ polltime = hz / OFWCONS_POLL_HZ;
if (polltime < 1) {
polltime = 1;
}
@@ -162,6 +166,8 @@
return (ENXIO);
}
+ /* XXX Should be replaced with callout_stop(9) */
+ untimeout(ofw_timeout, tp, ofw_timeouthandle);
ttyld_close(tp, flag);
ttyclose(tp);
@@ -179,16 +185,18 @@
static void
ofw_tty_start(struct tty *tp)
{
+ struct clist *cl;
+ int len;
+ u_char buf[OFBURSTLEN];
+
- if (tp->t_state & (TS_TIMEOUT | TS_TTSTOP)) {
- ttwwakeup(tp);
+ if (tp->t_state & (TS_TIMEOUT | TS_BUSY | TS_TTSTOP))
return;
- }
tp->t_state |= TS_BUSY;
- while (tp->t_outq.c_cc != 0) {
- ofw_cons_putc(NULL, getc(&tp->t_outq));
- }
+ cl = &tp->t_outq;
+ len = q_to_b(cl, buf, OFBURSTLEN);
+ OF_write(stdout, buf, len);
tp->t_state &= ~TS_BUSY;
ttwwakeup(tp);
==== //depot/projects/netperf_socket/sys/fs/portalfs/portal_vnops.c#7 (text+ko) ====
@@ -31,7 +31,7 @@
*
* @(#)portal_vnops.c 8.14 (Berkeley) 5/21/95
*
- * $FreeBSD: src/sys/fs/portalfs/portal_vnops.c,v 1.64 2004/06/23 06:47:49 bde Exp $
+ * $FreeBSD: src/sys/fs/portalfs/portal_vnops.c,v 1.65 2004/06/24 00:47:23 rwatson Exp $
*/
/*
@@ -216,7 +216,6 @@
struct portalnode *pt;
struct thread *td = ap->a_td;
struct vnode *vp = ap->a_vp;
- int s;
struct uio auio;
struct iovec aiov[2];
int res;
@@ -284,16 +283,18 @@
* will happen if the server dies. Sleep for 5 second intervals
* and keep polling the reference count. XXX.
*/
- s = splnet();
+ /* XXXRW: Locking? */
+ SOCK_LOCK(so);
while ((so->so_state & SS_ISCONNECTING) && so->so_error == 0) {
if (fmp->pm_server->f_count == 1) {
+ SOCK_UNLOCK(so);
error = ECONNREFUSED;
- splx(s);
goto bad;
}
- (void) tsleep((caddr_t) &so->so_timeo, PSOCK, "portalcon", 5 * hz);
+ (void) msleep((caddr_t) &so->so_timeo, SOCK_MTX(so), PSOCK,
+ "portalcon", 5 * hz);
}
- splx(s);
+ SOCK_UNLOCK(so);
if (so->so_error) {
error = so->so_error;
@@ -303,12 +304,12 @@
/*
* Set miscellaneous flags
*/
+ SOCKBUF_LOCK(&so->so_rcv);
so->so_rcv.sb_timeo = 0;
- so->so_snd.sb_timeo = 0;
- SOCKBUF_LOCK(&so->so_rcv);
so->so_rcv.sb_flags |= SB_NOINTR;
SOCKBUF_UNLOCK(&so->so_rcv);
SOCKBUF_LOCK(&so->so_snd);
+ so->so_snd.sb_timeo = 0;
so->so_snd.sb_flags |= SB_NOINTR;
SOCKBUF_UNLOCK(&so->so_snd);
==== //depot/projects/netperf_socket/sys/fs/udf/udf_vnops.c#5 (text+ko) ====
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/fs/udf/udf_vnops.c,v 1.36 2004/06/23 19:36:09 scottl Exp $
+ * $FreeBSD: src/sys/fs/udf/udf_vnops.c,v 1.37 2004/06/23 21:49:03 scottl Exp $
*/
/* udf_vnops.c */
@@ -186,11 +186,11 @@
udf_permtomode(struct udf_node *node)
{
uint32_t perm;
- uint32_t flags;
+ uint16_t flags;
mode_t mode;
- perm = node->fentry->perm;
- flags = node->fentry->icbtag.flags;
+ perm = le32toh(node->fentry->perm);
+ flags = le16toh(node->fentry->icbtag.flags);
mode = perm & UDF_FENTRY_PERM_USER_MASK;
mode |= ((perm & UDF_FENTRY_PERM_GRP_MASK) >> 2);
@@ -256,7 +256,7 @@
static void
udf_timetotimespec(struct timestamp *time, struct timespec *t)
{
- int i, lpyear, daysinyear;
+ int i, lpyear, daysinyear, year;
union {
uint16_t u_tz_offset;
int16_t s_tz_offset;
@@ -265,7 +265,8 @@
t->tv_nsec = 0;
/* DirectCD seems to like using bogus year values */
- if (time->year < 1970) {
+ year = le16toh(time->year);
+ if (year < 1970) {
t->tv_sec = 0;
return;
}
@@ -277,18 +278,18 @@
t->tv_sec += time->day * 3600 * 24;
/* Calclulate the month */
- lpyear = udf_isaleapyear(time->year);
+ lpyear = udf_isaleapyear(year);
for (i = 1; i < time->month; i++)
t->tv_sec += mon_lens[lpyear][i] * 3600 * 24;
/* Speed up the calculation */
- if (time->year > 1979)
+ if (year > 1979)
t->tv_sec += 315532800;
- if (time->year > 1989)
+ if (year > 1989)
t->tv_sec += 315619200;
- if (time->year > 1999)
+ if (year > 1999)
t->tv_sec += 315532800;
- for (i = 2000; i < time->year; i++) {
+ for (i = 2000; i < year; i++) {
daysinyear = udf_isaleapyear(i) + 365 ;
t->tv_sec += daysinyear * 3600 * 24;
}
@@ -297,7 +298,7 @@
* Calculate the time zone. The timezone is 12 bit signed 2's
* compliment, so we gotta do some extra magic to handle it right.
*/
- tz.u_tz_offset = time->type_tz;
+ tz.u_tz_offset = le16toh(time->type_tz);
tz.u_tz_offset &= 0x0fff;
if (tz.u_tz_offset & 0x0800)
tz.u_tz_offset |= 0xf000; /* extend the sign to 16 bits */
@@ -326,13 +327,13 @@
vap->va_fsid = dev2udev(node->i_dev);
vap->va_fileid = node->hash_id;
vap->va_mode = udf_permtomode(node);
- vap->va_nlink = fentry->link_cnt;
+ vap->va_nlink = le16toh(fentry->link_cnt);
/*
* XXX The spec says that -1 is valid for uid/gid and indicates an
* invalid uid/gid. How should this be represented?
*/
- vap->va_uid = (fentry->uid == -1) ? 0 : fentry->uid;
- vap->va_gid = (fentry->gid == -1) ? 0 : fentry->gid;
+ vap->va_uid = (le32toh(fentry->uid) == -1) ? 0 : le32toh(fentry->uid);
+ vap->va_gid = (le32toh(fentry->gid) == -1) ? 0 : le32toh(fentry->gid);
udf_timetotimespec(&fentry->atime, &vap->va_atime);
udf_timetotimespec(&fentry->mtime, &vap->va_mtime);
vap->va_ctime = vap->va_mtime; /* XXX Stored as an Extended Attribute */
@@ -345,24 +346,25 @@
* make it appear so.
*/
if (fentry->logblks_rec != 0) {
- vap->va_size = fentry->logblks_rec * node->udfmp->bsize;
+ vap->va_size =
+ le64toh(fentry->logblks_rec) * node->udfmp->bsize;
} else {
vap->va_size = node->udfmp->bsize;
}
} else {
- vap->va_size = fentry->inf_len;
+ vap->va_size = le64toh(fentry->inf_len);
}
vap->va_flags = 0;
vap->va_gen = 1;
vap->va_blocksize = node->udfmp->bsize;
- vap->va_bytes = fentry->inf_len;
+ vap->va_bytes = le64toh(fentry->inf_len);
vap->va_type = vp->v_type;
vap->va_filerev = 0; /* XXX */
return (0);
}
/*
- * File specific ioctls. DeCSS candidate?
+ * File specific ioctls.
*/
static int
udf_ioctl(struct vop_ioctl_args *a)
@@ -411,7 +413,7 @@
if (uio->uio_offset < 0)
return (EINVAL);
- fsize = node->fentry->inf_len;
+ fsize = le64toh(node->fentry->inf_len);
while (uio->uio_offset < fsize && uio->uio_resid > 0) {
offset = uio->uio_offset;
@@ -602,7 +604,7 @@
* looking for the l_iu and l_fi fields.
*/
if (ds->off + UDF_FID_SIZE > ds->size ||
- ds->off + fid->l_iu + fid->l_fi + UDF_FID_SIZE > ds->size) {
+ ds->off + le16toh(fid->l_iu) + fid->l_fi + UDF_FID_SIZE > ds->size){
/* Copy what we have of the fid into a buffer */
frag_size = ds->size - ds->off;
@@ -649,7 +651,7 @@
* copy in the rest of the fid from the new
* allocation.
*/
- total_fid_size = UDF_FID_SIZE + fid->l_iu + fid->l_fi;
+ total_fid_size = UDF_FID_SIZE + le16toh(fid->l_iu) + fid->l_fi;
if (total_fid_size > ds->udfmp->bsize) {
printf("udf: invalid FID\n");
ds->error = EIO;
@@ -660,7 +662,7 @@
ds->fid_fragment = 1;
} else {
- total_fid_size = fid->l_iu + fid->l_fi + UDF_FID_SIZE;
+ total_fid_size = le16toh(fid->l_iu) + fid->l_fi + UDF_FID_SIZE;
}
/*
@@ -733,7 +735,7 @@
* Iterate through the file id descriptors. Give the parent dir
* entry special attention.
*/
- ds = udf_opendir(node, uio->uio_offset, node->fentry->inf_len,
+ ds = udf_opendir(node, uio->uio_offset, le64toh(node->fentry->inf_len),
node->udfmp);
while ((fid = udf_getfid(ds)) != NULL) {
@@ -918,7 +920,7 @@
flags = a->a_cnp->cn_flags;
nameptr = a->a_cnp->cn_nameptr;
namelen = a->a_cnp->cn_namelen;
- fsize = node->fentry->inf_len;
+ fsize = le64toh(node->fentry->inf_len);
td = a->a_cnp->cn_thread;
/*
@@ -1077,8 +1079,8 @@
* allocation descriptor field of the file entry.
*/
fentry = node->fentry;
- *data = &fentry->data[fentry->l_ea];
- *size = fentry->l_ad;
+ *data = &fentry->data[le32toh(fentry->l_ea)];
+ *size = le32toh(fentry->l_ad);
return (0);
} else if (error != 0) {
return (error);
@@ -1120,7 +1122,7 @@
fentry = node->fentry;
tag = &fentry->icbtag;
- switch (tag->strat_type) {
+ switch (le16toh(tag->strat_type)) {
case 4:
break;
@@ -1133,7 +1135,7 @@
return (ENODEV);
}
- switch (tag->flags & 0x7) {
+ switch (le16toh(tag->flags) & 0x7) {
case 0:
/*
* The allocation descriptor field is filled with short_ad's.
@@ -1143,11 +1145,12 @@
do {
offset -= icblen;
ad_offset = sizeof(struct short_ad) * ad_num;
- if (ad_offset > fentry->l_ad) {
+ if (ad_offset > le32toh(fentry->l_ad)) {
printf("File offset out of bounds\n");
return (EINVAL);
}
- icb = GETICB(long_ad, fentry, fentry->l_ea + ad_offset);
+ icb = GETICB(long_ad, fentry,
+ le32toh(fentry->l_ea) + ad_offset);
icblen = GETICBLEN(short_ad, icb);
ad_num++;
} while(offset >= icblen);
@@ -1167,17 +1170,18 @@
do {
offset -= icblen;
ad_offset = sizeof(struct long_ad) * ad_num;
- if (ad_offset > fentry->l_ad) {
+ if (ad_offset > le32toh(fentry->l_ad)) {
printf("File offset out of bounds\n");
return (EINVAL);
}
- icb = GETICB(long_ad, fentry, fentry->l_ea + ad_offset);
+ icb = GETICB(long_ad, fentry,
+ le32toh(fentry->l_ea) + ad_offset);
icblen = GETICBLEN(long_ad, icb);
ad_num++;
} while(offset >= icblen);
lsector = (offset >> udfmp->bshift) +
- ((struct long_ad *)(icb))->loc.lb_num;
+ le32toh(((struct long_ad *)(icb))->loc.lb_num);
*max_size = GETICBLEN(long_ad, icb);
@@ -1207,9 +1211,11 @@
*/
if (udfmp->s_table != NULL) {
for (i = 0; i< udfmp->s_table_entries; i++) {
- p_offset = lsector - udfmp->s_table->entries[i].org;
+ p_offset =
+ lsector - le32toh(udfmp->s_table->entries[i].org);
if ((p_offset < udfmp->p_sectors) && (p_offset >= 0)) {
- *sector = udfmp->s_table->entries[i].map +
+ *sector =
+ le32toh(udfmp->s_table->entries[i].map) +
p_offset;
break;
}
==== //depot/projects/netperf_socket/sys/geom/vinum/geom_vinum.c#3 (text+ko) ====
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/geom/vinum/geom_vinum.c,v 1.2 2004/06/18 19:53:33 le Exp $");
+__FBSDID("$FreeBSD: src/sys/geom/vinum/geom_vinum.c,v 1.3 2004/06/24 02:40:34 csjp Exp $");
#include <sys/param.h>
#include <sys/bio.h>
@@ -319,8 +319,16 @@
d = g_malloc(sizeof(*d), M_WAITOK | M_ZERO);
bcopy(d2, d, sizeof(*d));
- /* XXX */
+ /*
+ * Make sure that the provider specified in the drive
+ * specification is an active GEOM provider.
+ */
pp = g_provider_by_name(d->device);
+ if (pp == NULL) {
+ gctl_error(req, "%s: drive not found", d->device);
+ g_free(d);
+ return (-1);
+ }
d->size = pp->mediasize - GV_DATA_START;
d->avail = d->size;
@@ -456,8 +464,17 @@
*/
LIST_FOREACH(d, &sc->drives, drive) {
if (d->geom == NULL) {
- /* XXX */
+ /*
+ * XXX if the provider disapears before we get a chance
+ * to write the config out to the drive, should this
+ * be handled any differently?
+ */
pp = g_provider_by_name(d->device);
+ if (pp == NULL) {
+ printf("geom_vinum: %s: drive disapeared?\n",
+ d->device);
+ continue;
+ }
cp = g_new_consumer(gp);
g_attach(cp, pp);
gv_save_config(cp, d, sc);
==== //depot/projects/netperf_socket/sys/geom/vinum/geom_vinum_plex.c#4 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/geom/vinum/geom_vinum_plex.c,v 1.3 2004/06/18 19:53:33 le Exp $");
+__FBSDID("$FreeBSD: src/sys/geom/vinum/geom_vinum_plex.c,v 1.4 2004/06/23 23:52:55 le Exp $");
#include <sys/param.h>
#include <sys/bio.h>
@@ -275,6 +275,8 @@
boff);
if (err) {
+ if (p->org == GV_PLEX_RAID5)
+ gv_free_raid5_packet(wp);
bp->bio_completed += bcount;
if (bp->bio_error == 0)
bp->bio_error = err;
==== //depot/projects/netperf_socket/sys/geom/vinum/geom_vinum_raid5.c#4 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/geom/vinum/geom_vinum_raid5.c,v 1.3 2004/06/22 14:54:31 le Exp $");
+__FBSDID("$FreeBSD: src/sys/geom/vinum/geom_vinum_raid5.c,v 1.5 2004/06/23 23:52:55 le Exp $");
#include <sys/param.h>
#include <sys/bio.h>
@@ -70,6 +70,26 @@
return (wp);
}
+void
+gv_free_raid5_packet(struct gv_raid5_packet *wp)
+{
+ struct gv_raid5_bit *r, *r2;
+
+ /* Remove all the bits from this work packet. */
+ TAILQ_FOREACH_SAFE(r, &wp->bits, list, r2) {
+ TAILQ_REMOVE(&wp->bits, r, list);
+ if (r->malloc)
+ g_free(r->buf);
+ if (r->bio != NULL)
+ g_destroy_bio(r->bio);
+ g_free(r);
+ }
+
+ if (wp->bufmalloc == 1)
+ g_free(wp->buf);
+ g_free(wp);
+}
+
/*
* Check if the stripe that the work packet wants is already being used by
* some other work packet.
@@ -109,7 +129,6 @@
mtx_lock(&p->worklist_mtx);
for (;;) {
restart = 0;
- g_trace(G_T_TOPOLOGY, "gv_raid5_worker scan");
TAILQ_FOREACH_SAFE(wp, &p->worklist, list, wpt) {
/* This request packet is already being processed. */
if (wp->state == IO)
@@ -141,9 +160,7 @@
mtx_lock(&p->worklist_mtx);
}
TAILQ_REMOVE(&p->worklist, wp, list);
- if (wp->bufmalloc == 1)
- g_free(wp->buf);
- g_free(wp);
+ gv_free_raid5_packet(wp);
restart++;
/*break;*/
}
@@ -152,7 +169,6 @@
/* Self-destruct. */
if (p->flags & GV_PLEX_THREAD_DIE)
break;
- g_trace(G_T_TOPOLOGY, "gv_raid5_worker sleep");
error = msleep(p, &p->worklist_mtx, PRIBIO, "-",
hz/100);
}
@@ -240,15 +256,6 @@
break;
}
- g_destroy_bio(bp);
-
- if (rbp != NULL) {
- if (rbp->malloc == 1)
- g_free(rbp->buf);
- TAILQ_REMOVE(&wp->bits, rbp, list);
- g_free(rbp);
- }
-
/* This request group is done. */
if (wp->active == 0)
wp->state = FINISH;
==== //depot/projects/netperf_socket/sys/geom/vinum/geom_vinum_raid5.h#2 (text+ko) ====
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/geom/vinum/geom_vinum_raid5.h,v 1.1 2004/06/12 21:16:10 le Exp $
+ * $FreeBSD: src/sys/geom/vinum/geom_vinum_raid5.h,v 1.2 2004/06/23 23:52:55 le Exp $
*/
#ifndef _GEOM_VINUM_RAID5_H_
@@ -85,6 +85,7 @@
int gv_build_raid5_req(struct gv_raid5_packet *, struct bio *, caddr_t,
long, off_t);
+void gv_free_raid5_packet(struct gv_raid5_packet *);
void gv_raid5_done(struct bio *);
void gv_raid5_worker(void *);
struct gv_raid5_packet *gv_new_raid5_packet(void);
==== //depot/projects/netperf_socket/sys/i386/linux/imgact_linux.c#3 (text+ko) ====
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/i386/linux/imgact_linux.c,v 1.51 2004/02/04 21:52:54 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/i386/linux/imgact_linux.c,v 1.52 2004/06/24 02:24:39 obrien Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -192,7 +192,7 @@
#ifdef DEBUG
printf("imgact: startaddr=%08lx, length=%08lx\n",
- (u_long)vmaddr, a_out->a_text + a_out->a_data);
+ (u_long)vmaddr, (u_long)a_out->a_text + (u_long)a_out->a_data);
#endif
/*
* allow read/write of data
==== //depot/projects/netperf_socket/sys/kern/uipc_socket.c#23 (text+ko) ====
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/uipc_socket.c,v 1.187 2004/06/22 03:49:22 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/uipc_socket.c,v 1.188 2004/06/24 00:54:26 rwatson Exp $");
#include "opt_inet.h"
#include "opt_mac.h"
@@ -1915,15 +1915,15 @@
if (events &
(POLLIN | POLLINIGNEOF | POLLPRI | POLLRDNORM |
POLLRDBAND)) {
+ SOCKBUF_LOCK(&so->so_rcv);
selrecord(td, &so->so_rcv.sb_sel);
- SOCKBUF_LOCK(&so->so_rcv);
so->so_rcv.sb_flags |= SB_SEL;
SOCKBUF_UNLOCK(&so->so_rcv);
}
if (events & (POLLOUT | POLLWRNORM)) {
+ SOCKBUF_LOCK(&so->so_snd);
selrecord(td, &so->so_snd.sb_sel);
- SOCKBUF_LOCK(&so->so_snd);
so->so_snd.sb_flags |= SB_SEL;
SOCKBUF_UNLOCK(&so->so_snd);
}
==== //depot/projects/netperf_socket/sys/kern/uipc_socket2.c#20 (text+ko) ====
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/uipc_socket2.c,v 1.134 2004/06/21 00:20:42 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/uipc_socket2.c,v 1.135 2004/06/24 01:37:03 rwatson Exp $");
#include "opt_mac.h"
#include "opt_param.h"
@@ -506,24 +506,26 @@
{
struct thread *td = curthread;
- if (sbreserve(&so->so_snd, sndcc, so, td) == 0)
+ SOCKBUF_LOCK(&so->so_snd);
+ SOCKBUF_LOCK(&so->so_rcv);
+ if (sbreserve_locked(&so->so_snd, sndcc, so, td) == 0)
goto bad;
- if (sbreserve(&so->so_rcv, rcvcc, so, td) == 0)
+ if (sbreserve_locked(&so->so_rcv, rcvcc, so, td) == 0)
goto bad2;
- SOCKBUF_LOCK(&so->so_rcv);
if (so->so_rcv.sb_lowat == 0)
so->so_rcv.sb_lowat = 1;
- SOCKBUF_UNLOCK(&so->so_rcv);
- SOCKBUF_LOCK(&so->so_snd);
if (so->so_snd.sb_lowat == 0)
so->so_snd.sb_lowat = MCLBYTES;
if (so->so_snd.sb_lowat > so->so_snd.sb_hiwat)
so->so_snd.sb_lowat = so->so_snd.sb_hiwat;
+ SOCKBUF_UNLOCK(&so->so_rcv);
SOCKBUF_UNLOCK(&so->so_snd);
return (0);
bad2:
- sbrelease(&so->so_snd, so);
+ sbrelease_locked(&so->so_snd, so);
bad:
+ SOCKBUF_UNLOCK(&so->so_rcv);
+ SOCKBUF_UNLOCK(&so->so_snd);
return (ENOBUFS);
}
@@ -553,7 +555,7 @@
* if buffering efficiency is near the normal case.
*/
int
-sbreserve(sb, cc, so, td)
+sbreserve_locked(sb, cc, so, td)
struct sockbuf *sb;
u_long cc;
struct socket *so;
@@ -561,6 +563,8 @@
{
rlim_t sbsize_limit;
+ SOCKBUF_LOCK_ASSERT(sb);
+
/*
* td will only be NULL when we're in an interrupt
* (e.g. in tcp_input())
@@ -582,6 +586,21 @@
return (1);
}
+int
+sbreserve(sb, cc, so, td)
+ struct sockbuf *sb;
+ u_long cc;
+ struct socket *so;
+ struct thread *td;
+{
+ int error;
+
+ SOCKBUF_LOCK(sb);
+ error = sbreserve_locked(sb, cc, so, td);
+ SOCKBUF_UNLOCK(sb);
+ return (error);
+}
+
/*
* Free mbufs held by a socket, and reserved mbuf space.
*/
==== //depot/projects/netperf_socket/sys/kern/uipc_syscalls.c#21 (text+ko) ====
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/uipc_syscalls.c,v 1.195 2004/06/22 23:58:09 bms Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/uipc_syscalls.c,v 1.196 2004/06/24 01:43:23 rwatson Exp $");
#include "opt_compat.h"
#include "opt_ktrace.h"
==== //depot/projects/netperf_socket/sys/netgraph/ng_base.c#4 (text+ko) ====
@@ -36,7 +36,7 @@
* Authors: Julian Elischer <julian at freebsd.org>
* Archie Cobbs <archie at freebsd.org>
*
- * $FreeBSD: src/sys/netgraph/ng_base.c,v 1.75 2004/05/29 07:21:46 julian Exp $
+ * $FreeBSD: src/sys/netgraph/ng_base.c,v 1.76 2004/06/24 01:47:31 rwatson Exp $
* $Whistle: ng_base.c,v 1.39 1999/01/28 23:54:53 julian Exp $
*/
@@ -170,6 +170,7 @@
#define NG_IDHASH_FN(ID) ((ID) % (NG_ID_HASH_SIZE))
#define NG_IDHASH_FIND(ID, node) \
do { \
+ mtx_assert(&ng_idhash_mtx, MA_OWNED); \
LIST_FOREACH(node, &ng_ID_hash[NG_IDHASH_FN(ID)], \
nd_idnodes) { \
if (NG_NODE_IS_VALID(node) \
@@ -3231,10 +3232,12 @@
{
node_p node;
int i = 1;
+ mtx_lock(&ng_nodelist_mtx);
SLIST_FOREACH(node, &ng_allnodes, nd_all) {
printf("[%d] ", i++);
dumpnode(node, NULL, 0);
}
+ mtx_unlock(&ng_nodelist_mtx);
}
static void
@@ -3242,10 +3245,12 @@
{
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list