From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753591Ab1KWQXR (ORCPT ); Wed, 23 Nov 2011 11:23:17 -0500 Received: from merlin.infradead.org ([205.233.59.134]:36630 "EHLO merlin.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753485Ab1KWQXQ convert rfc822-to-8bit (ORCPT ); Wed, 23 Nov 2011 11:23:16 -0500 Message-ID: <1322065356.14799.81.camel@twins> Subject: Re: [PATCH v7 3.2-rc2 3/30] uprobes: register/unregister probes. From: Peter Zijlstra To: Srikar Dronamraju Cc: Linus Torvalds , Oleg Nesterov , Andrew Morton , LKML , Linux-mm , Ingo Molnar , Andi Kleen , Christoph Hellwig , Steven Rostedt , Roland McGrath , Thomas Gleixner , Masami Hiramatsu , Arnaldo Carvalho de Melo , Anton Arapov , Ananth N Mavinakayanahalli , Jim Keniston , Stephen Wilson Date: Wed, 23 Nov 2011 17:22:36 +0100 In-Reply-To: <20111118110713.10512.9461.sendpatchset@srdronam.in.ibm.com> References: <20111118110631.10512.73274.sendpatchset@srdronam.in.ibm.com> <20111118110713.10512.9461.sendpatchset@srdronam.in.ibm.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8BIT X-Mailer: Evolution 3.2.1- Mime-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 2011-11-18 at 16:37 +0530, Srikar Dronamraju wrote: > +int register_uprobe(struct inode *inode, loff_t offset, > + struct uprobe_consumer *consumer) > +{ > + struct uprobe *uprobe; > + int ret = -EINVAL; > + > + if (!consumer || consumer->next) > + return ret; > + > + inode = igrab(inode); So why are you dealing with !consumer but not with !inode? and why does it make sense to allow !consumer at all? > + if (!inode) > + return ret; > + > + if (offset > i_size_read(inode)) > + goto reg_out; > + > + ret = 0; > + mutex_lock(uprobes_hash(inode)); > + uprobe = alloc_uprobe(inode, offset); > + if (uprobe && !add_consumer(uprobe, consumer)) { > + ret = __register_uprobe(inode, offset, uprobe); > + if (ret) { > + uprobe->consumers = NULL; > + __unregister_uprobe(inode, offset, uprobe); > + } > + } > + > + mutex_unlock(uprobes_hash(inode)); > + put_uprobe(uprobe); > + > +reg_out: > + iput(inode); > + return ret; > +} So if this function returns an error the caller is responsible for cleaning up consumer, otherwise we take responsibility.