Maybe? You're probably locking each block at a time in the buffer cache during reads anyway.
if((ip->i_mode&(IFCHR&IFBLK)) == 0)
plock(ip);
if(mode == FREAD)
readi(ip);
else
writei(ip);
if((ip->i_mode&(IFCHR&IFBLK)) == 0)
prele(ip);
I imagine a more serious bottleneck to random read/write concurrency would have been disk performance.Average seek time / rotational latency (years by manual copyright, so estimated):
RL02 (1978): 55 ms / 12.5 ms RK07 (1978): 36.5 ms / 12.5 ms RA81 (1982): 28 ms / 8.3 ms RA92 (1989): 16 ms / 8.3 ms.
Note that the RL02 (and V7) and RA92 mentioned in the article are separated by about a decade.
[1] https://github.com/dspinellis/unix-history-repo/blob/Researc...
I'm sure you could define a more granular format to address all elements within a file individually (for example, a lot of files in a typical Unix /etc directory have rows and fields), but people would call that interface an object store rather than a filesystem.
So like how the OS pretends filesystems are in a tape, the filesystem pretends that the files are in a tape.
And tape splicer is optional with a not-standard interface (logical volume management, fallocate, etc).