Changeset View
Changeset View
Standalone View
Standalone View
sys/net/bpf.c
Show First 20 Lines • Show All 168 Lines • ▼ Show 20 Lines | |||||
static LIST_HEAD(, bpf_if) bpf_iflist, bpf_freelist; | static LIST_HEAD(, bpf_if) bpf_iflist, bpf_freelist; | ||||
static struct mtx bpf_mtx; /* bpf global lock */ | static struct mtx bpf_mtx; /* bpf global lock */ | ||||
static int bpf_bpfd_cnt; | static int bpf_bpfd_cnt; | ||||
static void bpf_attachd(struct bpf_d *, struct bpf_if *); | static void bpf_attachd(struct bpf_d *, struct bpf_if *); | ||||
static void bpf_detachd(struct bpf_d *); | static void bpf_detachd(struct bpf_d *); | ||||
static void bpf_detachd_locked(struct bpf_d *); | static void bpf_detachd_locked(struct bpf_d *); | ||||
static void bpf_freed(struct bpf_d *); | static void bpf_freed(struct bpf_d *); | ||||
static int bpf_movein(struct uio *, int, struct ifnet *, struct mbuf **, | static int bpf_fill_hdrtype(int, struct sockaddr *, int *); | ||||
struct sockaddr *, int *, struct bpf_d *); | static int bpf_movein(struct uio *, struct mbuf **); | ||||
static int bpf_sendmbuf(struct bpf_d *, struct mbuf *); | |||||
static int bpf_prepare_mbuf_locked(struct bpf_d *, struct mbuf *, | |||||
struct sockaddr *, int *, struct mbuf **); | |||||
static int bpf_setif(struct bpf_d *, struct ifreq *); | static int bpf_setif(struct bpf_d *, struct ifreq *); | ||||
static void bpf_timed_out(void *); | static void bpf_timed_out(void *); | ||||
static __inline void | static __inline void | ||||
bpf_wakeup(struct bpf_d *); | bpf_wakeup(struct bpf_d *); | ||||
static void catchpacket(struct bpf_d *, u_char *, u_int, u_int, | static void catchpacket(struct bpf_d *, u_char *, u_int, u_int, | ||||
void (*)(struct bpf_d *, caddr_t, u_int, void *, u_int), | void (*)(struct bpf_d *, caddr_t, u_int, void *, u_int), | ||||
struct bintime *); | struct bintime *); | ||||
static void reset_d(struct bpf_d *); | static void reset_d(struct bpf_d *); | ||||
▲ Show 20 Lines • Show All 271 Lines • ▼ Show 20 Lines | bpf_ioctl_setzbuf(struct thread *td, struct bpf_d *d, struct bpf_zbuf *bz) | ||||
if (d->bd_bufmode != BPF_BUFMODE_ZBUF) | if (d->bd_bufmode != BPF_BUFMODE_ZBUF) | ||||
return (EOPNOTSUPP); | return (EOPNOTSUPP); | ||||
return (bpf_zerocopy_ioctl_setzbuf(td, d, bz)); | return (bpf_zerocopy_ioctl_setzbuf(td, d, bz)); | ||||
} | } | ||||
/* | /* | ||||
* General BPF functions. | * General BPF functions. | ||||
*/ | */ | ||||
/* | |||||
* Fills in L2 header length and AF based on bpf DLT. | |||||
*/ | |||||
static int | static int | ||||
bpf_movein(struct uio *uio, int linktype, struct ifnet *ifp, struct mbuf **mp, | bpf_fill_hdrtype(int linktype, struct sockaddr *sockp, int *hdrlen) | ||||
struct sockaddr *sockp, int *hdrlen, struct bpf_d *d) | |||||
{ | { | ||||
const struct ieee80211_bpf_params *p; | |||||
struct ether_header *eh; | |||||
struct mbuf *m; | |||||
int error; | |||||
int len; | |||||
int hlen; | int hlen; | ||||
int slen; | |||||
/* | /* | ||||
* Build a sockaddr based on the data link layer type. | * Build a sockaddr based on the data link layer type. | ||||
* We do this at this level because the ethernet header | * We do this at this level because the ethernet header | ||||
* is copied directly into the data field of the sockaddr. | * is copied directly into the data field of the sockaddr. | ||||
* In the case of SLIP, there is no header and the packet | * In the case of SLIP, there is no header and the packet | ||||
* is forwarded as is. | * is forwarded as is. | ||||
* Also, we are careful to leave room at the front of the mbuf | * Also, we are careful to leave room at the front of the mbuf | ||||
▲ Show 20 Lines • Show All 56 Lines • ▼ Show 20 Lines | case DLT_IEEE802_11_RADIO: /* IEEE 802.11 wireless w/ phy params */ | ||||
sockp->sa_len = 12; /* XXX != 0 */ | sockp->sa_len = 12; /* XXX != 0 */ | ||||
hlen = sizeof(struct ieee80211_bpf_params); | hlen = sizeof(struct ieee80211_bpf_params); | ||||
break; | break; | ||||
default: | default: | ||||
return (EIO); | return (EIO); | ||||
} | } | ||||
*hdrlen = hlen; | |||||
return (0); | |||||
} | |||||
/* | |||||
* Copies frame from the userspace to the newly-created mbuf. | |||||
* Returns 0 and save mbuf into @mp on success. | |||||
*/ | |||||
static int | |||||
bpf_movein(struct uio *uio, struct mbuf **mp) | |||||
{ | |||||
int error, len; | |||||
struct mbuf *m; | |||||
len = uio->uio_resid; | len = uio->uio_resid; | ||||
if (len < hlen || len - hlen > ifp->if_mtu) | if (len > MJUMPAGESIZE) | ||||
return (EMSGSIZE); | return (EMSGSIZE); | ||||
m = m_get2(len, M_WAITOK, MT_DATA, M_PKTHDR); | m = m_get2(len, M_WAITOK, MT_DATA, M_PKTHDR); | ||||
if (m == NULL) | if (m == NULL) | ||||
return (EIO); | return (EIO); | ||||
m->m_pkthdr.len = m->m_len = len; | m->m_pkthdr.len = m->m_len = len; | ||||
*mp = m; | |||||
error = uiomove(mtod(m, u_char *), len, uio); | error = uiomove(mtod(m, u_char *), len, uio); | ||||
if (error) | if (error != 0) { | ||||
goto bad; | m_freem(m); | ||||
return (error); | |||||
} | |||||
slen = bpf_filter(d->bd_wfilter, mtod(m, u_char *), len, len); | *mp = m; | ||||
if (slen == 0) { | return (0); | ||||
error = EPERM; | |||||
goto bad; | |||||
} | } | ||||
/* Check for multicast destination */ | /* | ||||
* Prepares mbuf for sending by finalizing link-layer header, | |||||
* filling in mbuf flags and performing sanity checks. | |||||
*/ | |||||
static int | |||||
bpf_prepare_mbuf_locked(struct bpf_d *d, struct mbuf *m, struct sockaddr *dst, | |||||
int *phlen, struct mbuf **pmc) | |||||
{ | |||||
const struct ieee80211_bpf_params *p; | |||||
struct ether_header *eh; | |||||
struct ifnet *ifp; | |||||
struct mbuf *mc; | |||||
int error, hlen, len, linktype; | |||||
BPFD_LOCK_ASSERT(d); | |||||
if (d->bd_bif == NULL) | |||||
return (ENXIO); | |||||
ifp = d->bd_bif->bif_ifp; | |||||
if ((ifp->if_flags & IFF_UP) == 0) | |||||
return (ENETDOWN); | |||||
linktype = d->bd_bif->bif_dlt; | |||||
error = bpf_fill_hdrtype(linktype, dst, &hlen); | |||||
if (error != 0) | |||||
return (error); | |||||
len = m->m_len; | |||||
if (len < hlen || len - hlen > ifp->if_mtu) | |||||
return (EMSGSIZE); | |||||
if (bpf_filter(d->bd_wfilter, mtod(m, u_char *), len, len) == 0) | |||||
return (EPERM); | |||||
counter_u64_add(d->bd_wfcount, 1); | |||||
switch (linktype) { | switch (linktype) { | ||||
case DLT_EN10MB: | case DLT_EN10MB: | ||||
eh = mtod(m, struct ether_header *); | eh = mtod(m, struct ether_header *); | ||||
/* Set mbuf flags for broadcast/multicast destinations */ | |||||
if (ETHER_IS_MULTICAST(eh->ether_dhost)) { | if (ETHER_IS_MULTICAST(eh->ether_dhost)) { | ||||
if (bcmp(ifp->if_broadcastaddr, eh->ether_dhost, | if (bcmp(ifp->if_broadcastaddr, eh->ether_dhost, | ||||
ETHER_ADDR_LEN) == 0) | ETHER_ADDR_LEN) == 0) | ||||
m->m_flags |= M_BCAST; | m->m_flags |= M_BCAST; | ||||
else | else | ||||
m->m_flags |= M_MCAST; | m->m_flags |= M_MCAST; | ||||
} | } | ||||
if (d->bd_hdrcmplt == 0) { | if (d->bd_hdrcmplt == 0) { | ||||
memcpy(eh->ether_shost, IF_LLADDR(ifp), | memcpy(eh->ether_shost, IF_LLADDR(ifp), | ||||
sizeof(eh->ether_shost)); | sizeof(eh->ether_shost)); | ||||
} | } | ||||
break; | break; | ||||
} | } | ||||
/* | /* | ||||
* Make room for link header, and copy it to sockaddr | * Make room for link header, and copy it to sockaddr | ||||
*/ | */ | ||||
if (hlen != 0) { | if (hlen != 0) { | ||||
if (sockp->sa_family == AF_IEEE80211) { | if (dst->sa_family == AF_IEEE80211) { | ||||
/* | /* | ||||
* Collect true length from the parameter header | * Collect true length from the parameter header | ||||
* NB: sockp is known to be zero'd so if we do a | * NB: sockp is known to be zero'd so if we do a | ||||
* short copy unspecified parameters will be | * short copy unspecified parameters will be | ||||
* zero. | * zero. | ||||
* NB: packet may not be aligned after stripping | * NB: packet may not be aligned after stripping | ||||
* bpf params | * bpf params | ||||
* XXX check ibp_vers | * XXX check ibp_vers | ||||
*/ | */ | ||||
p = mtod(m, const struct ieee80211_bpf_params *); | p = mtod(m, const struct ieee80211_bpf_params *); | ||||
hlen = p->ibp_len; | hlen = p->ibp_len; | ||||
if (hlen > sizeof(sockp->sa_data)) { | if (hlen > sizeof(dst->sa_data)) | ||||
error = EINVAL; | return (EINVAL); | ||||
goto bad; | |||||
} | } | ||||
bcopy(mtod(m, const void *), dst->sa_data, hlen); | |||||
} | } | ||||
bcopy(mtod(m, const void *), sockp->sa_data, hlen); | |||||
} | |||||
*hdrlen = hlen; | |||||
if (d->bd_hdrcmplt) | |||||
dst->sa_family = pseudo_AF_HDRCMPLT; | |||||
if (d->bd_feedback) { | |||||
mc = m_dup(m, M_NOWAIT); | |||||
if (mc != NULL) | |||||
mc->m_pkthdr.rcvif = ifp; | |||||
/* Set M_PROMISC for outgoing packets to be discarded. */ | |||||
if (d->bd_direction == BPF_D_INOUT) | |||||
m->m_flags |= M_PROMISC; | |||||
} else | |||||
mc = NULL; | |||||
m->m_pkthdr.len -= hlen; | |||||
m->m_len -= hlen; | |||||
m->m_data += hlen; /* XXX */ | |||||
#ifdef MAC | |||||
CURVNET_SET(ifp->if_vnet); | |||||
mac_bpfdesc_create_mbuf(d, m); | |||||
if (mc != NULL) | |||||
mac_bpfdesc_create_mbuf(d, mc); | |||||
CURVNET_RESTORE(); | |||||
#endif | |||||
*phlen = hlen; | |||||
*pmc = mc; | |||||
return (0); | return (0); | ||||
bad: | |||||
m_freem(m); | |||||
return (error); | |||||
} | } | ||||
/* | /* | ||||
* Attach file to the bpf interface, i.e. make d listen on bp. | * Attach file to the bpf interface, i.e. make d listen on bp. | ||||
*/ | */ | ||||
static void | static void | ||||
bpf_attachd(struct bpf_d *d, struct bpf_if *bp) | bpf_attachd(struct bpf_d *d, struct bpf_if *bp) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 283 Lines • ▼ Show 20 Lines | bpfopen(struct cdev *dev, int flags, int fmt, struct thread *td) | ||||
d->bd_bufmode = BPF_BUFMODE_BUFFER; | d->bd_bufmode = BPF_BUFMODE_BUFFER; | ||||
d->bd_sig = SIGIO; | d->bd_sig = SIGIO; | ||||
d->bd_direction = BPF_D_INOUT; | d->bd_direction = BPF_D_INOUT; | ||||
BPF_PID_REFRESH(d, td); | BPF_PID_REFRESH(d, td); | ||||
#ifdef MAC | #ifdef MAC | ||||
mac_bpfdesc_init(d); | mac_bpfdesc_init(d); | ||||
mac_bpfdesc_create(td->td_ucred, d); | mac_bpfdesc_create(td->td_ucred, d); | ||||
#endif | #endif | ||||
mtx_init(&d->bd_lock, devtoname(dev), "bpf cdev lock", MTX_DEF); | rw_init(&d->bd_lock, "bpf cdev lock"); | ||||
callout_init_mtx(&d->bd_callout, &d->bd_lock, 0); | callout_init_rw(&d->bd_callout, &d->bd_lock, 0); | ||||
knlist_init_mtx(&d->bd_sel.si_note, &d->bd_lock); | knlist_init_rw_reader(&d->bd_sel.si_note, &d->bd_lock); | ||||
return (0); | return (0); | ||||
} | } | ||||
/* | /* | ||||
* bpfread - read next chunk of packets from buffers | * bpfread - read next chunk of packets from buffers | ||||
*/ | */ | ||||
static int | static int | ||||
▲ Show 20 Lines • Show All 67 Lines • ▼ Show 20 Lines | if (d->bd_bif == NULL) { | ||||
BPFD_UNLOCK(d); | BPFD_UNLOCK(d); | ||||
return (ENXIO); | return (ENXIO); | ||||
} | } | ||||
if (non_block) { | if (non_block) { | ||||
BPFD_UNLOCK(d); | BPFD_UNLOCK(d); | ||||
return (EWOULDBLOCK); | return (EWOULDBLOCK); | ||||
} | } | ||||
error = msleep(d, &d->bd_lock, PRINET|PCATCH, | error = rw_sleep(d, &d->bd_lock, PRINET|PCATCH, | ||||
"bpf", d->bd_rtout); | "bpf", d->bd_rtout); | ||||
if (error == EINTR || error == ERESTART) { | if (error == EINTR || error == ERESTART) { | ||||
BPFD_UNLOCK(d); | BPFD_UNLOCK(d); | ||||
return (error); | return (error); | ||||
} | } | ||||
if (error == EWOULDBLOCK) { | if (error == EWOULDBLOCK) { | ||||
/* | /* | ||||
* On a timeout, return what's in the buffer, | * On a timeout, return what's in the buffer, | ||||
▲ Show 20 Lines • Show All 94 Lines • ▼ Show 20 Lines | if ((d->bd_immediate || d->bd_state == BPF_TIMED_OUT) && | ||||
return (1); | return (1); | ||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
bpfwrite(struct cdev *dev, struct uio *uio, int ioflag) | bpfwrite(struct cdev *dev, struct uio *uio, int ioflag) | ||||
{ | { | ||||
struct bpf_d *d; | struct bpf_d *d; | ||||
struct ifnet *ifp; | struct mbuf *m; | ||||
struct mbuf *m, *mc; | int error; | ||||
struct sockaddr dst; | |||||
struct route ro; | |||||
int error, hlen; | |||||
error = devfs_get_cdevpriv((void **)&d); | error = devfs_get_cdevpriv((void **)&d); | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
BPF_PID_REFRESH_CUR(d); | BPF_PID_REFRESH_CUR(d); | ||||
counter_u64_add(d->bd_wcount, 1); | counter_u64_add(d->bd_wcount, 1); | ||||
/* XXX: locking required */ | |||||
if (d->bd_bif == NULL) { | |||||
counter_u64_add(d->bd_wdcount, 1); | |||||
return (ENXIO); | |||||
} | |||||
ifp = d->bd_bif->bif_ifp; | |||||
if ((ifp->if_flags & IFF_UP) == 0) { | |||||
counter_u64_add(d->bd_wdcount, 1); | |||||
return (ENETDOWN); | |||||
} | |||||
if (uio->uio_resid == 0) { | if (uio->uio_resid == 0) { | ||||
counter_u64_add(d->bd_wdcount, 1); | counter_u64_add(d->bd_wdcount, 1); | ||||
return (0); | return (0); | ||||
} | } | ||||
bzero(&dst, sizeof(dst)); | |||||
m = NULL; | m = NULL; | ||||
hlen = 0; | error = bpf_movein(uio, &m); | ||||
/* XXX: bpf_movein() can sleep */ | if (error != 0) { | ||||
error = bpf_movein(uio, (int)d->bd_bif->bif_dlt, ifp, | |||||
&m, &dst, &hlen, d); | |||||
if (error) { | |||||
counter_u64_add(d->bd_wdcount, 1); | counter_u64_add(d->bd_wdcount, 1); | ||||
return (error); | return (error); | ||||
} | } | ||||
counter_u64_add(d->bd_wfcount, 1); | |||||
if (d->bd_hdrcmplt) | |||||
dst.sa_family = pseudo_AF_HDRCMPLT; | |||||
if (d->bd_feedback) { | error = bpf_sendmbuf(d, m); | ||||
mc = m_dup(m, M_NOWAIT); | return (error); | ||||
if (mc != NULL) | } | ||||
mc->m_pkthdr.rcvif = ifp; | |||||
/* Set M_PROMISC for outgoing packets to be discarded. */ | |||||
if (d->bd_direction == BPF_D_INOUT) | |||||
m->m_flags |= M_PROMISC; | |||||
} else | |||||
mc = NULL; | |||||
m->m_pkthdr.len -= hlen; | /* | ||||
m->m_len -= hlen; | * Sends mbuf @m to the interface specified by @d. | ||||
m->m_data += hlen; /* XXX */ | * Frees @m in case of error. | ||||
* Returns 0 on success. | |||||
*/ | |||||
static int | |||||
bpf_sendmbuf(struct bpf_d *d, struct mbuf *m) | |||||
{ | |||||
struct route ro; | |||||
struct sockaddr dst; | |||||
struct mbuf *mc; | |||||
struct ifnet *ifp; | |||||
int error, hlen; | |||||
CURVNET_SET(ifp->if_vnet); | ifp = NULL; | ||||
#ifdef MAC | bzero(&dst, sizeof(dst)); | ||||
BPFD_LOCK(d); | hlen = 0; | ||||
mac_bpfdesc_create_mbuf(d, m); | mc = NULL; | ||||
if (mc != NULL) | BPFD_RLOCK(d); | ||||
mac_bpfdesc_create_mbuf(d, mc); | error = bpf_prepare_mbuf_locked(d, m, &dst, &hlen, &mc); | ||||
BPFD_UNLOCK(d); | if (error == 0) | ||||
#endif | ifp = d->bd_bif->bif_ifp; | ||||
BPFD_RUNLOCK(d); | |||||
if (error != 0) { | |||||
counter_u64_add(d->bd_wdcount, 1); | |||||
m_freem(m); | |||||
return (error); | |||||
} | |||||
bzero(&ro, sizeof(ro)); | bzero(&ro, sizeof(ro)); | ||||
if (hlen != 0) { | if (hlen != 0) { | ||||
ro.ro_prepend = (u_char *)&dst.sa_data; | ro.ro_prepend = (u_char *)&dst.sa_data; | ||||
ro.ro_plen = hlen; | ro.ro_plen = hlen; | ||||
ro.ro_flags = RT_HAS_HEADER; | ro.ro_flags = RT_HAS_HEADER; | ||||
} | } | ||||
CURVNET_SET(ifp->if_vnet); | |||||
error = (*ifp->if_output)(ifp, m, &dst, &ro); | error = (*ifp->if_output)(ifp, m, &dst, &ro); | ||||
if (error) | if (error != 0) | ||||
counter_u64_add(d->bd_wdcount, 1); | counter_u64_add(d->bd_wdcount, 1); | ||||
if (mc != NULL) { | if (mc != NULL) { | ||||
if (error == 0) | if (error == 0) | ||||
(*ifp->if_input)(ifp, mc); | (*ifp->if_input)(ifp, mc); | ||||
else | else | ||||
m_freem(mc); | m_freem(mc); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 155 Lines • ▼ Show 20 Lines | #endif | ||||
*/ | */ | ||||
case FIONREAD: | case FIONREAD: | ||||
{ | { | ||||
int n; | int n; | ||||
BPFD_LOCK(d); | BPFD_LOCK(d); | ||||
n = d->bd_slen; | n = d->bd_slen; | ||||
while (d->bd_hbuf_in_use) | while (d->bd_hbuf_in_use) | ||||
mtx_sleep(&d->bd_hbuf_in_use, &d->bd_lock, | rw_sleep(&d->bd_hbuf_in_use, &d->bd_lock, | ||||
PRINET, "bd_hbuf", 0); | PRINET, "bd_hbuf", 0); | ||||
if (d->bd_hbuf) | if (d->bd_hbuf) | ||||
n += d->bd_hlen; | n += d->bd_hlen; | ||||
BPFD_UNLOCK(d); | BPFD_UNLOCK(d); | ||||
*(int *)addr = n; | *(int *)addr = n; | ||||
break; | break; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 140 Lines • ▼ Show 20 Lines | case BIOCSETIF: | ||||
/* | /* | ||||
* Behavior here depends on the buffering model. If | * Behavior here depends on the buffering model. If | ||||
* we're using kernel memory buffers, then we can | * we're using kernel memory buffers, then we can | ||||
* allocate them here. If we're using zero-copy, | * allocate them here. If we're using zero-copy, | ||||
* then the user process must have registered buffers | * then the user process must have registered buffers | ||||
* by the time we get here. | * by the time we get here. | ||||
*/ | */ | ||||
alloc_buf = 0; | alloc_buf = 0; | ||||
size = 0; | |||||
BPFD_LOCK(d); | BPFD_LOCK(d); | ||||
if (d->bd_bufmode == BPF_BUFMODE_BUFFER && | if (d->bd_bufmode == BPF_BUFMODE_BUFFER && | ||||
d->bd_sbuf == NULL) | d->bd_sbuf == NULL) { | ||||
alloc_buf = 1; | alloc_buf = 1; | ||||
size = d->bd_bufsize; | |||||
} | |||||
BPFD_UNLOCK(d); | BPFD_UNLOCK(d); | ||||
if (alloc_buf) { | if (alloc_buf) { | ||||
size = d->bd_bufsize; | |||||
error = bpf_buffer_ioctl_sblen(d, &size); | error = bpf_buffer_ioctl_sblen(d, &size); | ||||
if (error != 0) | if (error != 0) | ||||
break; | break; | ||||
} | } | ||||
BPF_LOCK(); | BPF_LOCK(); | ||||
error = bpf_setif(d, (struct ifreq *)addr); | error = bpf_setif(d, (struct ifreq *)addr); | ||||
BPF_UNLOCK(); | BPF_UNLOCK(); | ||||
break; | break; | ||||
▲ Show 20 Lines • Show All 1,006 Lines • ▼ Show 20 Lines | if (d->bd_rfilter != NULL) { | ||||
free((caddr_t)d->bd_rfilter, M_BPF); | free((caddr_t)d->bd_rfilter, M_BPF); | ||||
#ifdef BPF_JITTER | #ifdef BPF_JITTER | ||||
if (d->bd_bfilter != NULL) | if (d->bd_bfilter != NULL) | ||||
bpf_destroy_jit_filter(d->bd_bfilter); | bpf_destroy_jit_filter(d->bd_bfilter); | ||||
#endif | #endif | ||||
} | } | ||||
if (d->bd_wfilter != NULL) | if (d->bd_wfilter != NULL) | ||||
free((caddr_t)d->bd_wfilter, M_BPF); | free((caddr_t)d->bd_wfilter, M_BPF); | ||||
mtx_destroy(&d->bd_lock); | rw_destroy(&d->bd_lock); | ||||
counter_u64_free(d->bd_rcount); | counter_u64_free(d->bd_rcount); | ||||
counter_u64_free(d->bd_dcount); | counter_u64_free(d->bd_dcount); | ||||
counter_u64_free(d->bd_fcount); | counter_u64_free(d->bd_fcount); | ||||
counter_u64_free(d->bd_wcount); | counter_u64_free(d->bd_wcount); | ||||
counter_u64_free(d->bd_wfcount); | counter_u64_free(d->bd_wfcount); | ||||
counter_u64_free(d->bd_wdcount); | counter_u64_free(d->bd_wdcount); | ||||
counter_u64_free(d->bd_zcopy); | counter_u64_free(d->bd_zcopy); | ||||
▲ Show 20 Lines • Show All 511 Lines • Show Last 20 Lines |