Please read this quoted text of how a system call normally works:
The system call handler gains control when a user program starts a
system call. The system call handler changes the protection domain
from the caller protection domain, user, to the system call protection
domain, kernel, and switches to a protected stack.
The system call handler then calls the function supporting the system
call. The loader maintains a table of the currently defined system
calls for this purpose.
The system call runs within the calling process, but with more
privilege than the calling process. This is because the protection
domain has changed from user to kernel.
The system call function returns to the system call handler when it
has performed its operation. The system call handler then restores the
state of the process and returns to the user program.
Now, there are two types of kernels regarding context switching during a system call.
Preemptive and non-preemptive kernels(roughly speaking; as this sometimes also applies to threads/processes executing a critical section of code).
The former is common among RTOS(Real-time OSs) while the later is common among the most common OSs we know.
In preemptive kernels the scheduler is allowed to opt-out a thread executing a system call for the favor of a thread with a higher priority.
The latter doesn't allow this kind of preemption, as in; if a thread is currently executing a system call all others should wait till it finishes its kernel-mode work.
To sum it up, normally in a non-RT system, if a thread executes a system call, it should finish its work before being dispatched.
Now notice something, some system calls may be blocking!
What does this mean? It means they'll halt till an Interrupt happens, when then they'll be back in execution till they're done doing their work.
An example of that is read(), where it'll block till the data a user requests is ready; meanwhile other threads can be scheduled to run but once an interrupt comes to that read() it'll start running again and no one can dispatch it(again, only in non-preemptive environments) till it returns to user land the results.