![Al Viro](/assets/img/avatar_default.png)
As it is, default ->i_fop has NULL ->open() (along with all other methods). The only case where it matters is reopening (via procfs symlink) a file that didn't get its ->f_op from ->i_fop - anything else will have ->i_fop assigned to something sane (default would fail on read/write/ioctl/etc.). Unfortunately, such case exists - alloc_file() users, especially anon_get_file() ones. There we have tons of opened files of very different kinds sharing the same inode. As the result, attempt to reopen those via procfs succeeds and you get a descriptor you can't do anything with. Moreover, in case of sockets we set ->i_fop that will only be used on such reopen attempts - and put a failing ->open() into it to make sure those do not succeed. It would be simpler to put such ->open() into default ->i_fop and leave it unchanged both for anon inode (as we do anyway) and for socket ones. Result: * everything going through do_dentry_open() works as it used to * sock_no_open() kludge is gone * attempts to reopen anon-inode files fail as they really ought to * ditto for aio_private_file() * ditto for perfmon - this one actually tried to imitate sock_no_open() trick, but failed to set ->i_fop, so in the current tree reopens succeed and yield completely useless descriptor. Intent clearly had been to fail with -ENXIO on such reopens; now it actually does. * everything else that used alloc_file() keeps working - it has ->i_fop set for its inodes anyway Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
74 lines
2.1 KiB
Makefile
74 lines
2.1 KiB
Makefile
#
|
|
# Makefile for the linux networking.
|
|
#
|
|
# 2 Sep 2000, Christoph Hellwig <hch@infradead.org>
|
|
# Rewritten to use lists instead of if-statements.
|
|
#
|
|
|
|
obj-$(CONFIG_NET) := socket.o core/
|
|
|
|
tmp-$(CONFIG_COMPAT) := compat.o
|
|
obj-$(CONFIG_NET) += $(tmp-y)
|
|
|
|
# LLC has to be linked before the files in net/802/
|
|
obj-$(CONFIG_LLC) += llc/
|
|
obj-$(CONFIG_NET) += ethernet/ 802/ sched/ netlink/
|
|
obj-$(CONFIG_NETFILTER) += netfilter/
|
|
obj-$(CONFIG_INET) += ipv4/
|
|
obj-$(CONFIG_XFRM) += xfrm/
|
|
obj-$(CONFIG_UNIX) += unix/
|
|
obj-$(CONFIG_NET) += ipv6/
|
|
obj-$(CONFIG_PACKET) += packet/
|
|
obj-$(CONFIG_NET_KEY) += key/
|
|
obj-$(CONFIG_BRIDGE) += bridge/
|
|
obj-$(CONFIG_NET_DSA) += dsa/
|
|
obj-$(CONFIG_IPX) += ipx/
|
|
obj-$(CONFIG_ATALK) += appletalk/
|
|
obj-$(CONFIG_X25) += x25/
|
|
obj-$(CONFIG_LAPB) += lapb/
|
|
obj-$(CONFIG_NETROM) += netrom/
|
|
obj-$(CONFIG_ROSE) += rose/
|
|
obj-$(CONFIG_AX25) += ax25/
|
|
obj-$(CONFIG_CAN) += can/
|
|
obj-$(CONFIG_IRDA) += irda/
|
|
obj-$(CONFIG_BT) += bluetooth/
|
|
obj-$(CONFIG_SUNRPC) += sunrpc/
|
|
obj-$(CONFIG_AF_RXRPC) += rxrpc/
|
|
obj-$(CONFIG_ATM) += atm/
|
|
obj-$(CONFIG_L2TP) += l2tp/
|
|
obj-$(CONFIG_DECNET) += decnet/
|
|
obj-$(CONFIG_PHONET) += phonet/
|
|
ifneq ($(CONFIG_VLAN_8021Q),)
|
|
obj-y += 8021q/
|
|
endif
|
|
obj-$(CONFIG_IP_DCCP) += dccp/
|
|
obj-$(CONFIG_IP_SCTP) += sctp/
|
|
obj-$(CONFIG_RDS) += rds/
|
|
obj-$(CONFIG_WIRELESS) += wireless/
|
|
obj-$(CONFIG_MAC80211) += mac80211/
|
|
obj-$(CONFIG_TIPC) += tipc/
|
|
obj-$(CONFIG_NETLABEL) += netlabel/
|
|
obj-$(CONFIG_IUCV) += iucv/
|
|
obj-$(CONFIG_RFKILL) += rfkill/
|
|
obj-$(CONFIG_NET_9P) += 9p/
|
|
obj-$(CONFIG_CAIF) += caif/
|
|
ifneq ($(CONFIG_DCB),)
|
|
obj-y += dcb/
|
|
endif
|
|
obj-$(CONFIG_6LOWPAN) += 6lowpan/
|
|
obj-$(CONFIG_IEEE802154) += ieee802154/
|
|
obj-$(CONFIG_MAC802154) += mac802154/
|
|
|
|
ifeq ($(CONFIG_NET),y)
|
|
obj-$(CONFIG_SYSCTL) += sysctl_net.o
|
|
endif
|
|
obj-$(CONFIG_WIMAX) += wimax/
|
|
obj-$(CONFIG_DNS_RESOLVER) += dns_resolver/
|
|
obj-$(CONFIG_CEPH_LIB) += ceph/
|
|
obj-$(CONFIG_BATMAN_ADV) += batman-adv/
|
|
obj-$(CONFIG_NFC) += nfc/
|
|
obj-$(CONFIG_OPENVSWITCH) += openvswitch/
|
|
obj-$(CONFIG_VSOCKETS) += vmw_vsock/
|
|
obj-$(CONFIG_NET_MPLS_GSO) += mpls/
|
|
obj-$(CONFIG_HSR) += hsr/
|