Sun Mar 15 20:20:03 2009 UTC ()
Pull up following revision(s) (requested by mrg in ticket #565):
	sys/kern/init_sysctl.c: revision 1.158
always calculate "needed" for KERN_FILE2 calls.  this allows a caller
to get an estimate of the needed space, like the intention is.


(snj)
diff -r1.149.4.1 -r1.149.4.2 src/sys/kern/init_sysctl.c

cvs diff -r1.149.4.1 -r1.149.4.2 src/sys/kern/init_sysctl.c (expand / switch to unified diff)

--- src/sys/kern/init_sysctl.c 2008/11/29 20:51:06 1.149.4.1
+++ src/sys/kern/init_sysctl.c 2009/03/15 20:20:02 1.149.4.2
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: init_sysctl.c,v 1.149.4.1 2008/11/29 20:51:06 bouyer Exp $ */ 1/* $NetBSD: init_sysctl.c,v 1.149.4.2 2009/03/15 20:20:02 snj Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2003, 2007, 2008 The NetBSD Foundation, Inc. 4 * Copyright (c) 2003, 2007, 2008 The NetBSD Foundation, Inc.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * This code is derived from software contributed to The NetBSD Foundation 7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Andrew Brown, and by Andrew Doran. 8 * by Andrew Brown, and by Andrew Doran.
9 * 9 *
10 * Redistribution and use in source and binary forms, with or without 10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions 11 * modification, are permitted provided that the following conditions
12 * are met: 12 * are met:
13 * 1. Redistributions of source code must retain the above copyright 13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer. 14 * notice, this list of conditions and the following disclaimer.
@@ -20,27 +20,27 @@ @@ -20,27 +20,27 @@
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE. 29 * POSSIBILITY OF SUCH DAMAGE.
30 */ 30 */
31 31
32#include <sys/cdefs.h> 32#include <sys/cdefs.h>
33__KERNEL_RCSID(0, "$NetBSD: init_sysctl.c,v 1.149.4.1 2008/11/29 20:51:06 bouyer Exp $"); 33__KERNEL_RCSID(0, "$NetBSD: init_sysctl.c,v 1.149.4.2 2009/03/15 20:20:02 snj Exp $");
34 34
35#include "opt_sysv.h" 35#include "opt_sysv.h"
36#include "opt_compat_netbsd32.h" 36#include "opt_compat_netbsd32.h"
37#include "opt_sa.h" 37#include "opt_sa.h"
38#include "pty.h" 38#include "pty.h"
39#include "rnd.h" 39#include "rnd.h"
40 40
41#include <sys/types.h> 41#include <sys/types.h>
42#include <sys/param.h> 42#include <sys/param.h>
43#include <sys/sysctl.h> 43#include <sys/sysctl.h>
44#include <sys/cpu.h> 44#include <sys/cpu.h>
45#include <sys/errno.h> 45#include <sys/errno.h>
46#include <sys/systm.h> 46#include <sys/systm.h>
@@ -1995,28 +1995,28 @@ sysctl_kern_file2(SYSCTLFN_ARGS) @@ -1995,28 +1995,28 @@ sysctl_kern_file2(SYSCTLFN_ARGS)
1995 mutex_exit(&filelist_lock); 1995 mutex_exit(&filelist_lock);
1996 error = dcopyout(l, &kf, dp, out_size); 1996 error = dcopyout(l, &kf, dp, out_size);
1997 mutex_enter(&filelist_lock); 1997 mutex_enter(&filelist_lock);
1998 np = LIST_NEXT(tp, f_list); 1998 np = LIST_NEXT(tp, f_list);
1999 LIST_REMOVE(tp, f_list); 1999 LIST_REMOVE(tp, f_list);
2000 if (error) { 2000 if (error) {
2001 break; 2001 break;
2002 } 2002 }
2003 dp += elem_size; 2003 dp += elem_size;
2004 len -= elem_size; 2004 len -= elem_size;
2005 } else { 2005 } else {
2006 mutex_exit(&fp->f_lock); 2006 mutex_exit(&fp->f_lock);
2007 } 2007 }
 2008 needed += elem_size;
2008 if (elem_count > 0) { 2009 if (elem_count > 0) {
2009 needed += elem_size; 
2010 if (elem_count != INT_MAX) 2010 if (elem_count != INT_MAX)
2011 elem_count--; 2011 elem_count--;
2012 } 2012 }
2013 } 2013 }
2014 mutex_exit(&filelist_lock); 2014 mutex_exit(&filelist_lock);
2015 fputdummy(tp); 2015 fputdummy(tp);
2016 sysctl_relock(); 2016 sysctl_relock();
2017 break; 2017 break;
2018 case KERN_FILE_BYPID: 2018 case KERN_FILE_BYPID:
2019 if (arg < -1) 2019 if (arg < -1)
2020 /* -1 means all processes */ 2020 /* -1 means all processes */
2021 return (EINVAL); 2021 return (EINVAL);
2022 sysctl_unlock(); 2022 sysctl_unlock();
@@ -2071,28 +2071,28 @@ sysctl_kern_file2(SYSCTLFN_ARGS) @@ -2071,28 +2071,28 @@ sysctl_kern_file2(SYSCTLFN_ARGS)
2071 fill_file(&kf, fp, ff, i, p->p_pid); 2071 fill_file(&kf, fp, ff, i, p->p_pid);
2072 mutex_exit(&fp->f_lock); 2072 mutex_exit(&fp->f_lock);
2073 mutex_exit(&ff->ff_lock); 2073 mutex_exit(&ff->ff_lock);
2074 mutex_exit(&fd->fd_lock); 2074 mutex_exit(&fd->fd_lock);
2075 error = dcopyout(l, &kf, dp, out_size); 2075 error = dcopyout(l, &kf, dp, out_size);
2076 mutex_enter(&fd->fd_lock); 2076 mutex_enter(&fd->fd_lock);
2077 if (error) 2077 if (error)
2078 break; 2078 break;
2079 dp += elem_size; 2079 dp += elem_size;
2080 len -= elem_size; 2080 len -= elem_size;
2081 } else { 2081 } else {
2082 mutex_exit(&ff->ff_lock); 2082 mutex_exit(&ff->ff_lock);
2083 } 2083 }
 2084 needed += elem_size;
2084 if (elem_count > 0) { 2085 if (elem_count > 0) {
2085 needed += elem_size; 
2086 if (elem_count != INT_MAX) 2086 if (elem_count != INT_MAX)
2087 elem_count--; 2087 elem_count--;
2088 } 2088 }
2089 } 2089 }
2090 mutex_exit(&fd->fd_lock); 2090 mutex_exit(&fd->fd_lock);
2091 2091
2092 /* 2092 /*
2093 * Release reference to process. 2093 * Release reference to process.
2094 */ 2094 */
2095 mutex_enter(proc_lock); 2095 mutex_enter(proc_lock);
2096 rw_exit(&p->p_reflock); 2096 rw_exit(&p->p_reflock);
2097 } 2097 }
2098 mutex_exit(proc_lock); 2098 mutex_exit(proc_lock);