A quote1 from Ron Minnich about Plan 9’s design:
interesting questions. They kind of resonate with a discussion I had with someone recently. The question of feature(X) in linux came up, as feature(X) was not available in Plan 9. It doesn’t much matter what feature(X) is in this case, since the question is so frequent.
As it happens, feature(X) is not really uniformly available in Linux either. It sorta works on some types of things, and does not really work on most others. Take a simple one: select on an open file. Doesn’t really work, might be useful, so we get inotify. Well, but, inotify doesn’t work on most things, but for those things it doesn’t work on, well, maybe select will work. You end up with the tangled thicket of overlapping, but incompatible, feature sets that are almost, but not quite entirely, unlike what Unix was supposed to be: that’s Linux today.
This made me think about the design rules for Linux and Plan 9. From what I can see on Linux, the rule is: if it will work on something and make it better, do it. It may not work on most things, but as long as it works on one, go ahead and plug it in. The Linux rules also happen to make those few things feature(X) works on fast for some cases. Put together enough special cases and for those uses that conform to those cases, you’ve got a very fast and capable system. Which Linux is. But there is certainly a great deal of ugliness there.
If you look at what a hard link really is, you’ll realize that your two questions are actually the same question.
On Plan 9, the rule tends to be: if feature(X) can’t be implemented in a way that works for everything, don’t do it. No special cases allowed; it’s why mmap is discouraged. This has led to a system that is quite uniform and a pleasure to use, albeit lower performing than its competitors in many places.
If you look at what a hard link is, you’ll realize why they are not in Plan 9.
Just my take, anyway.