void _bmap_op_done(const struct pfl_callerinfo *pci, struct bmap *b, const char *fmt, ...) { va_list ap; BMAP_LOCK_ENSURE(b); psc_assert(!(b->bcm_flags & BMAPF_TOFREE)); va_start(ap, fmt); _psclogv_pci(pci, SLSS_BMAP, 0, fmt, ap); va_end(ap); if (!psc_atomic32_read(&b->bcm_opcnt)) { b->bcm_flags |= BMAPF_TOFREE; DEBUG_BMAP(PLL_DIAG, b, "free bmap now"); BMAP_ULOCK(b); /* * Invoke service specific bmap cleanup callbacks: * mds_bmap_destroy(), iod_bmap_finalcleanup(), and * msl_bmap_final_cleanup(). */ if (sl_bmap_ops.bmo_final_cleanupf) sl_bmap_ops.bmo_final_cleanupf(b); bmap_remove(b); } else { bmap_wake_locked(b); BMAP_ULOCK(b); } }
int slmctlparam_namespace_stats_process(int fd, struct psc_ctlmsghdr *mh, struct psc_ctlmsg_param *pcp, char **levels, struct slm_nsstats *st, int d_val, int o_val, int s_val) { int d_start, o_start, s_start, i_d, i_o, i_s; char nbuf[16]; if (mh->mh_type == PCMT_SETPARAM) return (psc_ctlsenderr(fd, mh, "field is read-only")); d_start = d_val == -1 ? 0 : d_val; o_start = o_val == -1 ? 0 : o_val; s_start = s_val == -1 ? 0 : s_val; for (i_d = d_start; i_d < NS_NDIRS && (i_d == d_val || d_val == -1); i_d++) { levels[3] = (char *)slm_nslogst_acts[i_d]; for (i_o = o_start; i_o < NS_NOPS + 1 && (i_o == o_val || o_val == -1); i_o++) { levels[4] = (char *)slm_nslogst_ops[i_o]; for (i_s = s_start; i_s < NS_NSUMS && (i_s == s_val || s_val == -1); i_s++) { levels[5] = (char *) slm_nslogst_fields[i_s]; snprintf(nbuf, sizeof(nbuf), "%d", psc_atomic32_read( &st->ns_stats[i_d][i_o][i_s])); if (!psc_ctlmsg_param_send(fd, mh, pcp, PCTHRNAME_EVERYONE, levels, 6, nbuf)) return (0); } } } return (1); }