Date: Wed, 22 Mar 2017 15:40:49 +0300 From: Slawa Olhovchenkov <slw@zxy.spb.ru> To: John Baldwin <jhb@freebsd.org> Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org Subject: Re: svn commit: r313450 - in stable/11: lib/libc/gen lib/libc/sys sys/compat/freebsd32 sys/kern sys/sys Message-ID: <20170322124049.GY70430@zxy.spb.ru> In-Reply-To: <18428734.CRRuMZqGsJ@ralph.baldwin.cx> References: <201702081832.v18IWZlC001828@repo.freebsd.org> <20170315143053.GW15630@zxy.spb.ru> <18428734.CRRuMZqGsJ@ralph.baldwin.cx>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Mar 21, 2017 at 08:05:31PM -0700, John Baldwin wrote: > On Wednesday, March 15, 2017 05:30:53 PM Slawa Olhovchenkov wrote: > > On Wed, Feb 08, 2017 at 06:32:35PM +0000, John Baldwin wrote: > > > > > Author: jhb > > > Date: Wed Feb 8 18:32:35 2017 > > > New Revision: 313450 > > > URL: https://svnweb.freebsd.org/changeset/base/313450 > > > > > > Log: > > > MFC 310638: > > > Rename the 'flags' argument to getfsstat() to 'mode' and validate it. > > > > > > This argument is not a bitmask of flags, but only accepts a single value. > > > Fail with EINVAL if an invalid value is passed to 'flag'. Rename the > > > 'flags' argument to getmntinfo(3) to 'mode' as well to match. > > > > > > This is a followup to r308088. > > > > > kern_getfsstat(struct thread *td, struct statfs **buf, size_t bufsize, > > > - size_t *countp, enum uio_seg bufseg, int flags) > > > + size_t *countp, enum uio_seg bufseg, int mode) > > > { > > > struct mount *mp, *nmp; > > > struct statfs *sfsp, *sp, *sptmp, *tofree; > > > size_t count, maxcount; > > > int error; > > > > > > + switch (mode) { > > > + case MNT_WAIT: > > > + case MNT_NOWAIT: > > > + break; > > > + default: > > > + return (EINVAL); > > > + } > > > restart: > > > > This is break net-snmp UCD-SNMP-MIB::dskTable oid: > > > > 82434 snmpd CALL getfsstat(0,0,<invalid=0>) > > 82434 snmpd RET getfsstat -1 errno 22 Invalid argument > > 82434 snmpd CALL getfsstat(0,0xfffffffffffffe28,MNT_NOWAIT) > > 82434 snmpd RET getfsstat -1 errno 22 Invalid argument > > 82434 snmpd CALL write(0x9,0x800f162ea,0x1) > > This doesn't seem to match the code in the port: > > void > Init_HR_FileSys(void) > { > #if HAVE_GETFSSTAT > #if defined(HAVE_STATVFS) && defined(__NetBSD__) > fscount = getvfsstat(NULL, 0, ST_NOWAIT); > #else > fscount = getfsstat(NULL, 0, MNT_NOWAIT); > #endif > if (fsstats) > free((char *) fsstats); > fsstats = NULL; > fsstats = malloc(fscount * sizeof(*fsstats)); > #if defined(HAVE_STATVFS) && defined(__NetBSD__) > getvfsstat(fsstats, fscount * sizeof(*fsstats), ST_NOWAIT); > #else > getfsstat(fsstats, fscount * sizeof(*fsstats), MNT_NOWAIT); > #endif > HRFS_index = 0; > > (Here it always calls with MNT_NOWAIT) This is for net-snmp 5.7.3, > but it seems like that code hasn't changed in quite a while. I see, strange. I am also use net-snmp 5.7.3 (net-snmp-5.7.3_12). # dtrace -n 'syscall:freebsd:getfsstat:entry { printf("%s %p %d %d\n", execname, args[0], args[1], args[2]); stack(); ustack();}' dtrace: description 'syscall:freebsd:getfsstat:entry ' matched 1 probe CPU ID FUNCTION:NAME 22 43059 getfsstat:entry snmpd 0 0 0 kernel`amd64_syscall+0x36b kernel`0xffffffff8071c84b libc.so.7`getfsstat+0xa libnetsnmpmibs.so.30.0.3`netsnmp_fsys_load+0x9 libnetsnmpagent.so.30.0.3`0x80083dfbf libnetsnmpmibs.so.30.0.3`var_extensible_disk+0x38 libnetsnmpagent.so.30.0.3`netsnmp_old_api_helper+0x18f libnetsnmpagent.so.30.0.3`netsnmp_call_handler+0x134 libnetsnmpagent.so.30.0.3`netsnmp_bulk_to_next_helper+0x1a1 libnetsnmpagent.so.30.0.3`netsnmp_call_handler+0x134 libnetsnmpagent.so.30.0.3`handle_var_requests+0x67 libnetsnmpagent.so.30.0.3`handle_getnext_loop+0x244 libnetsnmpagent.so.30.0.3`netsnmp_handle_request+0x186 libnetsnmpagent.so.30.0.3`handle_snmp_packet+0x140 libnetsnmp.so.30.0.3`0x800ece6c6 libnetsnmp.so.30.0.3`_sess_read+0x5b9 libnetsnmp.so.30.0.3`snmp_read2+0x3b snmpd`0x404cab snmpd`0x40317f ld-elf.so.1`0x800629000 Ok, what is it: /* * Wrapper routine for re-loading filesystem statistics on demand */ int netsnmp_fsys_load( netsnmp_cache *cache, void *data ) { /* XXX - check cache timeliness */ return _fsys_load(); } /* * Architecture-independent processing of loading filesystem statistics */ static int _fsys_load( void ) { netsnmp_fsys_arch_load(); /* XXX - update cache timestamp */ return 0; } agent/mibgroup/hardware/fsys/fsys_getfsstats.c: void netsnmp_fsys_arch_load( void ) { int n, i; struct NSFS_STATFS *stats; netsnmp_fsys_info *entry; /* * Retrieve information about the currently mounted filesystems... */ n = NSFS_GETFSSTAT( NULL, 0, 0 ); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20170322124049.GY70430>