[I doubt that this lock-the-whole-range-at-once approach is the best way of doing I/O]
This would be an unnecessary optimization for obscenely large I/O requests, causing unnecessary complication of the storage stack. Otherwise if you lock pages as you go, you can't do asynchronous I/O. Welcome to early single-threaded UNIX.