/* * Allocate the socket and allow the family to set things up. if * the protocol is 0, the family is instructed to select an appropriate * default. */ sock = sock_alloc(); if(!sock){ if(net_ratelimit()) printk(KERN_WARNING "socket: no more sockets/n"); return-ENFILE;/* Not exactly a match, but its the closest posix thing */ }
sock->type = type;
#if defined(CONFIG_KMOD) /* Attempt to load a protocol module if the find failed. * * 12/09/1996 Marcin: But! this makes REALLY only sense, if the user * requested real, full-featured networking support upon configuration. * Otherwise module support will break! */ if(net_families[family]== NULL) request_module("net-pf-%d", family); #endif
/* * We will call the ->create function, that possibly is in a loadable * module, so we have to bump that loadable module refcnt first. */ if(!try_module_get(pf->owner)) goto out_release;
/* Now protected by module ref count */ rcu_read_unlock();
/* * Now to bump the refcnt of the [loadable] module that owns this * socket at sock_release time we decrement its refcnt. */ if(!try_module_get(sock->ops->owner)) goto out_module_busy;
/* * Now that we're done with the ->create function, the [loadable] * module can have its refcnt decremented */ module_put(pf->owner); err = security_socket_post_create(sock, family, type, protocol, kern); if(err) goto out_sock_release; *res = sock;