#define DEBUG_SUBSYSTEM S_RPC
#include <linux/user_namespace.h>
-#ifdef HAVE_UIDGID_HEADER
#include <linux/uidgid.h>
-#endif
#include <linux/utsname.h>
#include <libcfs/libcfs.h>
*/
int jobid_get_from_environ(char *jobid_var, char *jobid, int *jobid_len)
{
- static bool printed;
int rc;
rc = cfs_get_environ(jobid_var, jobid, jobid_len);
if (!rc)
goto out;
- if (unlikely(rc == -EOVERFLOW && !printed)) {
+ if (rc == -EOVERFLOW) {
/* For the PBS_JOBID and LOADL_STEP_ID keys (which are
* variable length strings instead of just numbers), it
* might make sense to keep the unique parts for JobID,
* larger temp buffer for cfs_get_environ(), then
* truncating the string at some separator to fit into
* the specified jobid_len. Fix later if needed. */
- LCONSOLE_WARN("jobid: '%s' value too large (%d)\n",
- obd_jobid_var, *jobid_len);
- printed = true;
+ static ktime_t printed;
+
+ if (unlikely(ktime_to_ns(printed) == 0 ||
+ ktime_after(ktime_get(),
+ ktime_add_ns(printed,
+ 3600ULL * 24 * NSEC_PER_SEC)))) {
+ LCONSOLE_WARN("jobid: '%s' value too large (%d)\n",
+ obd_jobid_var, *jobid_len);
+ printed = ktime_get();
+ }
+
rc = 0;
- }
- if (rc) {
- CDEBUG((rc == -ENOENT || rc == -EINVAL ||
- rc == -EDEADLK) ? D_INFO : D_ERROR,
- "jobid: get '%s' failed: rc = %d\n",
- obd_jobid_var, rc);
+ } else {
+ CDEBUG_LIMIT((rc == -ENOENT || rc == -EINVAL ||
+ rc == -EDEADLK) ? D_INFO : D_ERROR,
+ "jobid: get '%s' failed: rc = %d\n",
+ obd_jobid_var, rc);
}
out:
{
static time64_t last_expire;
bool expire_cache = false;
- pid_t pid = current_pid();
+ pid_t pid = current->pid;
struct jobid_pid_map *pidmap = NULL;
time64_t now = ktime_get_real_seconds();
int rc = 0;
* %e = executable
* %g = gid
* %h = hostname
+ * %H = short hostname
* %j = jobid from environment
* %p = pid
* %u = uid
char c;
while ((c = *jobfmt++) && joblen > 1) {
- char f;
+ char f, *p;
int l;
if (isspace(c)) /* Don't allow embedded spaces */
*jobid = c;
joblen--;
jobid++;
+ *jobid = '\0';
continue;
}
switch ((f = *jobfmt++)) {
case 'e': /* executable name */
- l = snprintf(jobid, joblen, "%s", current_comm());
+ l = snprintf(jobid, joblen, "%s", current->comm);
break;
case 'g': /* group ID */
l = snprintf(jobid, joblen, "%u",
l = snprintf(jobid, joblen, "%s",
init_utsname()->nodename);
break;
+ case 'H': /* short hostname. Cut at first dot */
+ l = snprintf(jobid, joblen, "%s",
+ init_utsname()->nodename);
+ p = strnchr(jobid, joblen, '.');
+ if (p) {
+ *p = '\0';
+ l = p - jobid;
+ }
+ break;
case 'j': /* jobid stored in process environment */
l = jobid_get_from_cache(jobid, joblen);
if (l < 0)
l = 0;
break;
case 'p': /* process ID */
- l = snprintf(jobid, joblen, "%u", current_pid());
+ l = snprintf(jobid, joblen, "%u", current->pid);
break;
case 'u': /* user ID */
l = snprintf(jobid, joblen, "%u",
rc = jobid_interpret_string(obd_jobid_name, jobid, joblen);
} else if (strcmp(obd_jobid_var, JOBSTATS_PROCNAME_UID) == 0) {
rc = jobid_interpret_string("%e.%u", jobid, joblen);
- } else if (strcmp(obd_jobid_var, JOBSTATS_SESSION) == 0) {
- char *jid;
-
- rcu_read_lock();
- jid = jobid_current();
- if (jid)
- strlcpy(jobid, jid, sizeof(jobid));
- rcu_read_unlock();
- } else if (jobid_name_is_valid(current_comm())) {
+ } else if (strcmp(obd_jobid_var, JOBSTATS_SESSION) == 0 ||
+ jobid_name_is_valid(current->comm)) {
/*
- * obd_jobid_var holds the jobid environment variable name.
- * Skip initial check if obd_jobid_name already uses "%j",
- * otherwise try just "%j" first, then fall back to whatever
- * is in obd_jobid_name if obd_jobid_var is not found.
+ * per-process jobid wanted, either from environment or from
+ * per-session setting.
+ * If obd_jobid_name contains "%j" or if getting the pre-process
+ * jobid directly fails, fall back to using obd_jobid_name.
*/
rc = -EAGAIN;
if (!strnstr(obd_jobid_name, "%j", joblen))
rc = jobid_get_from_cache(jobid, joblen);
- /* fall back to jobid_node if jobid_var not in environment */
+ /* fall back to jobid_node if jobid_var not available */
if (rc < 0) {
int rc2 = jobid_interpret_string(obd_jobid_name,
jobid, joblen);