diff --git a/src/slurmctld/job_mgr.c b/src/slurmctld/job_mgr.c
index 4e1bcaa72559609ffe3ef463a3d9af63f5950013..2637f6e05502b3ccfdab8948d9b611acff23d6e9 100644
--- a/src/slurmctld/job_mgr.c
+++ b/src/slurmctld/job_mgr.c
@@ -1464,6 +1464,7 @@ extern int job_signal(uint32_t job_id, uint16_t signal, uint16_t batch_flag,
 {
 	struct job_record *job_ptr;
 	time_t now = time(NULL);
+	bool super_user;
 
 	job_ptr = find_job_record(job_id);
 	if (job_ptr == NULL) {
@@ -1471,11 +1472,18 @@ extern int job_signal(uint32_t job_id, uint16_t signal, uint16_t batch_flag,
 		return ESLURM_INVALID_JOB_ID;
 	}
 
-	if ((job_ptr->user_id != uid) && (uid != 0) && (uid != getuid())) {
+	super_user = ((uid == 0) || (uid == getuid()));
+	if ((job_ptr->user_id != uid) && (!super_user)) {
 		error("Security violation, JOB_CANCEL RPC from uid %d",
 		      uid);
 		return ESLURM_USER_ID_MISSING;
 	}
+	if ((!super_user) && job_ptr->part_ptr
+	&&  (job_ptr->part_ptr->root_only)) {
+		info("Attempt to cancel job in RootOnly partition from uid %d",
+			uid);
+		return ESLURM_USER_ID_MISSING;
+	}
 
 	if (IS_JOB_FINISHED(job_ptr))
 		return ESLURM_ALREADY_DONE;