block/ioprio.c
Source file repositories/reference/linux-study-clean/block/ioprio.c
File Facts
- System
- Linux kernel
- Corpus path
block/ioprio.c- Extension
.c- Size
- 5254 bytes
- Lines
- 250
- Domain
- Representative Device Path
- Bucket
- PCIe NVMe Storage Path
- Inferred role
- Representative Device Path: syscall or user/kernel boundary
- Status
- core implementation candidate
Why This File Exists
Part of the selected hardware vertical slice: PCI discovery, driver binding, NVMe queues, block requests, DMA, interrupts, and completion.
- Part of the selected hardware vertical slice: PCI discovery, driver binding, NVMe queues, block requests, DMA, interrupts, and completion.
- Defines or participates in a user/kernel boundary; inspect argument validation, copy_from_user/copy_to_user, credentials, and dispatch target.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/gfp.hlinux/kernel.hlinux/ioprio.hlinux/cred.hlinux/blkdev.hlinux/capability.hlinux/syscalls.hlinux/security.hlinux/pid_namespace.h
Detected Declarations
syscall ioprio_setsyscall ioprio_getfunction ioprio_check_capfunction do_each_pid_threadfunction for_each_process_threadfunction get_task_iopriofunction ioprio_getfunction ioprio_bestfunction do_each_pid_threadfunction for_each_process_thread
Annotated Snippet
SYSCALL_DEFINE3(ioprio_set, int, which, int, who, int, ioprio)
{
struct task_struct *p, *g;
struct user_struct *user;
struct pid *pgrp;
kuid_t uid;
int ret;
ret = ioprio_check_cap(ioprio);
if (ret)
return ret;
ret = -ESRCH;
rcu_read_lock();
switch (which) {
case IOPRIO_WHO_PROCESS:
if (!who)
p = current;
else
p = find_task_by_vpid(who);
if (p)
ret = set_task_ioprio(p, ioprio);
break;
case IOPRIO_WHO_PGRP:
if (!who)
pgrp = task_pgrp(current);
else
pgrp = find_vpid(who);
read_lock(&tasklist_lock);
do_each_pid_thread(pgrp, PIDTYPE_PGID, p) {
ret = set_task_ioprio(p, ioprio);
if (ret) {
read_unlock(&tasklist_lock);
goto out;
}
} while_each_pid_thread(pgrp, PIDTYPE_PGID, p);
read_unlock(&tasklist_lock);
break;
case IOPRIO_WHO_USER:
uid = make_kuid(current_user_ns(), who);
if (!uid_valid(uid))
break;
if (!who)
user = current_user();
else
user = find_user(uid);
if (!user)
break;
for_each_process_thread(g, p) {
if (!uid_eq(task_uid(p), uid) ||
!task_pid_vnr(p))
continue;
ret = set_task_ioprio(p, ioprio);
if (ret)
goto free_uid;
}
free_uid:
if (who)
free_uid(user);
break;
default:
ret = -EINVAL;
}
out:
rcu_read_unlock();
return ret;
}
static int get_task_ioprio(struct task_struct *p)
{
int ret;
ret = security_task_getioprio(p);
if (ret)
goto out;
task_lock(p);
ret = __get_task_ioprio(p);
task_unlock(p);
out:
return ret;
}
/*
* Return raw IO priority value as set by userspace. We use this for
* ioprio_get(pid, IOPRIO_WHO_PROCESS) so that we keep historical behavior and
Annotation
- Immediate include surface: `linux/gfp.h`, `linux/kernel.h`, `linux/ioprio.h`, `linux/cred.h`, `linux/blkdev.h`, `linux/capability.h`, `linux/syscalls.h`, `linux/security.h`.
- Detected declarations: `syscall ioprio_set`, `syscall ioprio_get`, `function ioprio_check_cap`, `function do_each_pid_thread`, `function for_each_process_thread`, `function get_task_ioprio`, `function ioprio_get`, `function ioprio_best`, `function do_each_pid_thread`, `function for_each_process_thread`.
- Atlas domain: Representative Device Path / PCIe NVMe Storage Path.
- Implementation status: core implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.