On Wed, Oct 26, 2016 at 9:18 PM, David Herrmann <dh.herrm...@gmail.com> wrote: > + /* initialize constant fields */ > + peer->id = atomic64_inc_return(&peer_ids); > + peer->flags = 0; > + peer->cred = get_cred(current_cred()); > + peer->pid_ns = get_pid_ns(task_active_pid_ns(current)); > + peer->user = user; > + peer->debugdir = NULL; > + init_waitqueue_head(&peer->waitq); > + bus1_active_init(&peer->active); > + > + /* initialize data section */ > + mutex_init(&peer->data.lock); > + > + /* initialize peer-private section */ > + mutex_init(&peer->local.lock); > + > + if (!IS_ERR_OR_NULL(bus1_debugdir)) {
How can bus1_debugdir contain an error code? AFACT it is either a valid dentry or NULL. > + char idstr[22]; > + > + snprintf(idstr, sizeof(idstr), "peer-%llx", peer->id); > + > + peer->debugdir = debugfs_create_dir(idstr, bus1_debugdir); > + if (!peer->debugdir) { > + pr_err("cannot create debugfs dir for peer %llx\n", > + peer->id); > + } else if (!IS_ERR_OR_NULL(peer->debugdir)) { > + bus1_debugfs_create_atomic_x("active", S_IRUGO, > + peer->debugdir, > + &peer->active.count); > + } > + } > + > + bus1_active_activate(&peer->active); This is a no-nop since bus1_active_init() set ->count to BUS1_ACTIVE_NEW. > + return peer; > +} > + > +static int bus1_peer_disconnect(struct bus1_peer *peer) > +{ > + bus1_active_deactivate(&peer->active); > + bus1_active_drain(&peer->active, &peer->waitq); > + > + if (!bus1_active_cleanup(&peer->active, &peer->waitq, > + NULL, NULL)) > + return -ESHUTDOWN; > + > + return 0; > +} > + > +/** > + * bus1_peer_free() - destroy peer > + * @peer: peer to destroy, or NULL > + * > + * Destroy a peer object that was previously allocated via bus1_peer_new(). > + * This synchronously waits for any outstanding operations on this peer to > + * finish, then releases all linked resources and deallocates the peer in an > + * rcu-delayed manner. > + * > + * If NULL is passed, this is a no-op. > + * > + * Return: NULL is returned. What about making the function of type void? > +struct bus1_peer *bus1_peer_free(struct bus1_peer *peer) > +{ > + if (!peer) > + return NULL; > + > + /* disconnect from environment */ > + bus1_peer_disconnect(peer); > + > + /* deinitialize peer-private section */ > + mutex_destroy(&peer->local.lock); > + > + /* deinitialize data section */ > + mutex_destroy(&peer->data.lock); > + > + /* deinitialize constant fields */ > + debugfs_remove_recursive(peer->debugdir); > + bus1_active_deinit(&peer->active); > + peer->user = bus1_user_unref(peer->user); > + put_pid_ns(peer->pid_ns); > + put_cred(peer->cred); > + kfree_rcu(peer, rcu); > + > + return NULL; > +} -- Thanks, //richard