Received: by 2002:a25:f815:0:0:0:0:0 with SMTP id u21csp2295458ybd; Thu, 27 Jun 2019 09:57:40 -0700 (PDT) X-Google-Smtp-Source: APXvYqwxKQ5xY3tcLtd0QS4X86ZRoqRdpru+BwopsTAPKb9cOOuay9nqToQg3+g7QStFPV/LA2ty X-Received: by 2002:a17:90a:1ae2:: with SMTP id p89mr6870402pjp.26.1561654660346; Thu, 27 Jun 2019 09:57:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561654660; cv=none; d=google.com; s=arc-20160816; b=t3wZCi5Ra1/x16lhnu46jcgTcVye3xQL66giUo5kmqZCyYhDcNZGQrr+rjtXCewHBa 9vqVqgfqtkvcTtPW6+m8Pr3Ncf62A4spP2XYsj4wjGtT8W3ZQdYlkWXwyDa0SRUY5TDz YL6Yp9s3XQ2hOazxwZKlwGnrlqcI7DNGGED9w4doK1xRjeYoS6YjJByyQ0YnX9doG4zX GvkMbsj9JJ6GunZTCNenq/ThUMcwsS8s7Z15bLc/RdnjYye5jgROvYuFzdXcXXjGW+pf ymoHkiRmLUhDE0GNdE3y3IckkvfeDZM/QEPzaDBrgyuMu7uBuz5xjna918U4qhSBo+vV YZ0w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-transfer-encoding:content-disposition:mime-version :references:message-id:subject:cc:to:from:date; bh=5oIADsxyRe3p1NIYkhHaNgVahToTF1pvF3z8kCnqask=; b=fkJxFg6il6hOkNlEVeWCUTRj8AjMTxnzOoTuwcNGYh37ONcdfRiIJvTM1OSYWsQZCd Gx6u+5CjI4IkpGl08qyY3QsONz4sTvAnXjVOCaYn2vDzyyjLAG+F+QIYk5TMJLKVyXu4 b+FIiwilemVXcqL64pcpPJbWrNLiEs6ydJcBiUrID/AHnTDMuqJ6Yls4McBcdhQSLCTq XE4SwL1FeQ5UoJzMw+uNMhsuJlape8CcYQRcBfUz+MiDmJYl2KaHaiPuqHVeUUC49hPL rfLo5TvYDyVhrCj51o62aqbmd7EdUQs+Yycvq9IWE1gHotnR6Jh7Msi7+9Nz/TcYEk37 esJg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 15si2490639pgb.546.2019.06.27.09.57.23; Thu, 27 Jun 2019 09:57:40 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726549AbfF0Q5R (ORCPT + 99 others); Thu, 27 Jun 2019 12:57:17 -0400 Received: from zeniv.linux.org.uk ([195.92.253.2]:47906 "EHLO ZenIV.linux.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726425AbfF0Q5R (ORCPT ); Thu, 27 Jun 2019 12:57:17 -0400 Received: from viro by ZenIV.linux.org.uk with local (Exim 4.92 #3 (Red Hat Linux)) id 1hgXhQ-00066m-Ks; Thu, 27 Jun 2019 16:56:40 +0000 Date: Thu, 27 Jun 2019 17:56:40 +0100 From: Al Viro To: =?iso-8859-1?Q?Micka=EBl_Sala=FCn?= Cc: =?iso-8859-1?Q?Micka=EBl_Sala=FCn?= , linux-kernel@vger.kernel.org, Aleksa Sarai , Alexei Starovoitov , Andrew Morton , Andy Lutomirski , Arnaldo Carvalho de Melo , Casey Schaufler , Daniel Borkmann , David Drysdale , "David S . Miller" , "Eric W . Biederman" , James Morris , Jann Horn , John Johansen , Jonathan Corbet , Kees Cook , Michael Kerrisk , Paul Moore , Sargun Dhillon , "Serge E . Hallyn" , Shuah Khan , Stephen Smalley , Tejun Heo , Tetsuo Handa , Thomas Graf , Tycho Andersen , Will Drewry , kernel-hardening@lists.openwall.com, linux-api@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-security-module@vger.kernel.org, netdev@vger.kernel.org Subject: Re: [PATCH bpf-next v9 05/10] bpf,landlock: Add a new map type: inode Message-ID: <20190627165640.GQ17978@ZenIV.linux.org.uk> References: <20190625215239.11136-1-mic@digikod.net> <20190625215239.11136-6-mic@digikod.net> <20190625225201.GJ17978@ZenIV.linux.org.uk> <79bac827-4092-8a4d-9dc6-6019419b2486@ssi.gouv.fr> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <79bac827-4092-8a4d-9dc6-6019419b2486@ssi.gouv.fr> User-Agent: Mutt/1.11.3 (2019-02-01) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Jun 27, 2019 at 06:18:12PM +0200, Micka?l Sala?n wrote: > >> +/* called from syscall */ > >> +static int sys_inode_map_delete_elem(struct bpf_map *map, struct inode *key) > >> +{ > >> + struct inode_array *array = container_of(map, struct inode_array, map); > >> + struct inode *inode; > >> + int i; > >> + > >> + WARN_ON_ONCE(!rcu_read_lock_held()); > >> + for (i = 0; i < array->map.max_entries; i++) { > >> + if (array->elems[i].inode == key) { > >> + inode = xchg(&array->elems[i].inode, NULL); > >> + array->nb_entries--; > > > > Umm... Is that intended to be atomic in any sense? > > nb_entries is not used as a bound check but to avoid walking uselessly > through the (pre-allocated) array when adding a new element, but I'll > use an atomic to avoid inconsistencies anyway. > > Wait a sec... So we have those beasties that can have long-term > > references to arbitrary inodes stuck in them? What will happen > > if you get umount(2) called while such a thing exists? > > I though an umount would be denied but no, we get a self-destructed busy > inode and a bug! > What about wrapping the inode's superblock->s_op->destroy_inode() to > first remove the element from the map and then call the real > destroy_inode(), if any? What do you mean, _the_ map? I don't see anything to prevent insertion of references to the same inode into any number of those... > Or I could update fs/inode.c:destroy_inode() to call inode->free_inode() > if it is set, and set it when such inode is referenced by a map? > Or maybe I could hold the referencing file in the map and then wrap its > f_op? First of all, anything including the word "wrap" is a non-starter. We really don't need the headache associated with the locking needed to replace the method tables on the fly, or with the code checking that ->f_op points to given method table, etc. That's not going to fly, especially since you'd end up _chaining_ those (again, the same reference can go in more than once). Nothing is allowed to change the method tables of live objects, period. Once a struct file is opened, its ->f_op is never going to change and it entirely belongs to the device driver or filesystem it resides on. Nothing else (not VFS, not VM, not some LSM module, etc.) has any business touching that. The same goes for inodes, dentries, etc. What kind of behaviour do you want there? Do you want the inodes you've referenced there to be forgotten on e.g. memory pressure? The thing is, I don't see how "it's getting freed" could map onto any semantics that might be useful for you - it looks like the wrong event for that.