int ProcFamily::freezer_cgroup(const char * state) { // According to kernel docs, freezer will either succeed // or return EBUSY in the errno. // // This function either returns 0 (success), a positive value (fatal error) // or -EBUSY. int err = 0; struct cgroup_controller* freezer; struct cgroup *cgroup = cgroup_new_cgroup(m_cgroup_string.c_str()); ASSERT (cgroup != NULL); if (!m_cm.isMounted(CgroupManager::FREEZE_CONTROLLER)) { err = 1; goto ret; } freezer = cgroup_add_controller(cgroup, FREEZE_CONTROLLER_STR); if (NULL == freezer) { dprintf(D_ALWAYS, "Unable to access the freezer subsystem for ProcFamily %u " "for cgroup %s\n", m_root_pid, m_cgroup_string.c_str()); err = 2; goto ret; } if ((err = cgroup_add_value_string(freezer, "freezer.state", state))) { dprintf(D_ALWAYS, "Unable to write %s to freezer for cgroup %s (ProcFamily %u). %u %s\n", state, m_cgroup_string.c_str(), m_root_pid, err, cgroup_strerror(err)); err = 3; goto ret; } if ((err = cgroup_modify_cgroup(cgroup))) { if (ECGROUPVALUENOTEXIST == err) { dprintf(D_ALWAYS, "Does not appear condor_procd is allowed to freeze" " cgroup %s (ProcFamily %u).\n", m_cgroup_string.c_str(), m_root_pid); } else if ((ECGOTHER == err) && (EBUSY == cgroup_get_last_errno())) { dprintf(D_ALWAYS, "Kernel was unable to freeze cgroup %s " "(ProcFamily %u) due to process state; signal delivery " "won't be atomic\n", m_cgroup_string.c_str(), m_root_pid); err = -EBUSY; } else { dprintf(D_ALWAYS, "Unable to commit freezer change %s for cgroup %s (ProcFamily %u). %u %s\n", state, m_cgroup_string.c_str(), m_root_pid, err, cgroup_strerror(err)); } err = 4; goto ret; } ret: cgroup_free(&cgroup); return err; }
// error handling static int l_cgroup_strerror (lua_State *L) { int eint = 0; const char *out = NULL; if(lua_isnumber(L, 1)) eint = lua_tointeger(L, 1); else eint = cgroup_get_last_errno(); out = cgroup_strerror(eint); if(out) { lua_pushstring(L, out); return 1; } return 0; }
static int l_cgroup_get_last_errno(lua_State *L) { lua_pushinteger(L, cgroup_get_last_errno()); return 1; }