276 kmem_free(krde, sizeof (rctl_dict_entry_t));
277 return (set_errno(ESRCH));
278 }
279 mutex_enter(&rset->rcs_lock);
280 if (rctl_set_find(rset, hndl, &rctl) == -1) {
281 mutex_exit(&rset->rcs_lock);
282 mutex_exit(&curproc->p_lock);
283 kmem_free(krde, sizeof (rctl_dict_entry_t));
284 return (set_errno(ESRCH));
285 }
286 if (RCTLOP_NO_USAGE(rctl)) {
287 mutex_exit(&rset->rcs_lock);
288 mutex_exit(&curproc->p_lock);
289 kmem_free(krde, sizeof (rctl_dict_entry_t));
290 return (set_errno(ENOTSUP));
291 }
292 usage = RCTLOP_GET_USAGE(rctl, curproc);
293 mutex_exit(&rset->rcs_lock);
294 mutex_exit(&curproc->p_lock);
295
296 nblk = kmem_alloc(sizeof (rctl_opaque_t), KM_SLEEP);
297 bzero(nblk, sizeof (rctl_opaque_t));
298 nblk->rcq_value = usage;
299
300 ret = copyout(nblk, new_rblk, sizeof (rctl_opaque_t));
301 kmem_free(nblk, sizeof (rctl_opaque_t));
302 kmem_free(krde, sizeof (rctl_dict_entry_t));
303 return (ret == 0 ? 0 : set_errno(EFAULT));
304 } else if (action == RCTL_FIRST) {
305
306 mutex_enter(&curproc->p_lock);
307 if (ret = rctl_local_get(hndl, NULL, nval, curproc)) {
308 mutex_exit(&curproc->p_lock);
309 kmem_cache_free(rctl_val_cache, nval);
310 kmem_free(krde, sizeof (rctl_dict_entry_t));
311 return (set_errno(ret));
312 }
313 mutex_exit(&curproc->p_lock);
314 } else {
315 /*
316 * RCTL_NEXT
317 */
|
276 kmem_free(krde, sizeof (rctl_dict_entry_t));
277 return (set_errno(ESRCH));
278 }
279 mutex_enter(&rset->rcs_lock);
280 if (rctl_set_find(rset, hndl, &rctl) == -1) {
281 mutex_exit(&rset->rcs_lock);
282 mutex_exit(&curproc->p_lock);
283 kmem_free(krde, sizeof (rctl_dict_entry_t));
284 return (set_errno(ESRCH));
285 }
286 if (RCTLOP_NO_USAGE(rctl)) {
287 mutex_exit(&rset->rcs_lock);
288 mutex_exit(&curproc->p_lock);
289 kmem_free(krde, sizeof (rctl_dict_entry_t));
290 return (set_errno(ENOTSUP));
291 }
292 usage = RCTLOP_GET_USAGE(rctl, curproc);
293 mutex_exit(&rset->rcs_lock);
294 mutex_exit(&curproc->p_lock);
295
296 nblk = kmem_zalloc(sizeof (rctl_opaque_t), KM_SLEEP);
297 nblk->rcq_value = usage;
298
299 ret = copyout(nblk, new_rblk, sizeof (rctl_opaque_t));
300 kmem_free(nblk, sizeof (rctl_opaque_t));
301 kmem_free(krde, sizeof (rctl_dict_entry_t));
302 return (ret == 0 ? 0 : set_errno(EFAULT));
303 } else if (action == RCTL_FIRST) {
304
305 mutex_enter(&curproc->p_lock);
306 if (ret = rctl_local_get(hndl, NULL, nval, curproc)) {
307 mutex_exit(&curproc->p_lock);
308 kmem_cache_free(rctl_val_cache, nval);
309 kmem_free(krde, sizeof (rctl_dict_entry_t));
310 return (set_errno(ret));
311 }
312 mutex_exit(&curproc->p_lock);
313 } else {
314 /*
315 * RCTL_NEXT
316 */
|