Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp3556154ybi; Mon, 10 Jun 2019 12:16:16 -0700 (PDT) X-Google-Smtp-Source: APXvYqzxYKp5b2flD0czExj2rsb3xyS2v0Jx9jTlXKmsT32os5gI1vRCDEuO5ulZOBKqCby/qYV4 X-Received: by 2002:a17:90a:9d81:: with SMTP id k1mr22691036pjp.63.1560194176647; Mon, 10 Jun 2019 12:16:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1560194176; cv=none; d=google.com; s=arc-20160816; b=BdGgyecPYDkU6lpIz2PcW4eS+1yvZZg3Oi6S8GKu5/lbEHABw4570yts/9vu0rnZX+ uQ59o8hcKMYLPoyLjVi1xVHdggjGSrDRQRM8SaNXbUXJWcb3I4iFmGfQRs8uN9tnvpic Jsu3BpdgGCLuZQm8oimDqmaGoQ9ieK88LzMnT6vTtEpTm+FQSxdtTPHnLU8hZ7OGgxi3 Ap7PHl17KtfUwYLNmIHxhFDLA4mtc8m68iLGYecdqIGchL2078TyPBotgT9LMI8sC9fK lzEoomSGjN1N8a15Rg3s/WNMUMLT+00J5cnztukbErLuShVVE5D6x2+YKfVJ9nV1AZ9H Gi4A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=aR//uD4NhWFMVjpTld02Vmm29l8MHQS0/NqSGli70F8=; b=exML0+efu+32lFSVpzafZLDoVOIG3gSXnNlk8U3v8arIX1E8TcauRN/xa+Y9qn8Lsk 28txN0XPqzl5gB04eF02w4eyPX5GUgza6U/96OcpQ7jjRHWmqMRscV0429+8CCgak/YQ 4hsGrGfxvDRD7yEpT00CcpmUnXR9/wcbJTYJPB1fxFJcbRV/b8LGvEm9uD/eGWhd7Vi7 wRcGLDQBCWZOohaUKIkDYMzzjL18A3anQtV4/muo6VUH2TvSipNCUT4Iq6yUxyDiQqbl dPJb3w0q0aFf5Am4y6DtrY46sEjqbwZN5X0d6XQLQUbDnXbuQgrxEQ/+n5bjJ6MbQ4i0 5xDw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=PGcOELLZ; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 92si5553741plc.217.2019.06.10.12.16.01; Mon, 10 Jun 2019 12:16:16 -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; dkim=pass header.i=@gmail.com header.s=20161025 header.b=PGcOELLZ; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389603AbfFJTP3 (ORCPT + 99 others); Mon, 10 Jun 2019 15:15:29 -0400 Received: from mail-vs1-f67.google.com ([209.85.217.67]:39098 "EHLO mail-vs1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389210AbfFJTOg (ORCPT ); Mon, 10 Jun 2019 15:14:36 -0400 Received: by mail-vs1-f67.google.com with SMTP id n2so6215954vso.6; Mon, 10 Jun 2019 12:14:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=aR//uD4NhWFMVjpTld02Vmm29l8MHQS0/NqSGli70F8=; b=PGcOELLZdo4Kg9v3G6sVPoxRniXMINmFDyPMiPzN6isPtueXfeYgWgOyCx0uoSur6Y BXjfDo4sohWRnSKAPm3pnL13BdVoyTCx9qi/EqPsq03d/dFrAs4Dw0EAGhJO2s387BYa wkV4b6w1U/1tnm5eMOEcF6yk3uvrsTIBW7Bt6MF6DiKLaIrGx+8/XpDIebBQ0XvBKqA2 6UlHky1ZYmBRQDGoZ9N5kdM7QbeeK997QHERdJ2a1GzdhnDrpD/fmkI82eyHpQCrU58+ JOuVu272wM6Iye9GuJvp5FN9pnJlXOLfJUu6wCw5V/p9PXENnGZ2zaqXM5WkdrjhfesR FngA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=aR//uD4NhWFMVjpTld02Vmm29l8MHQS0/NqSGli70F8=; b=qc+9CS/YgIyfnPGJWqynPr/2+8P20ILz1kbFGF7oSdFKVZ/YvN+aDXtcibXSzWqwUM MB+eo6C5JcQQgvUmCJcA4qN0n5aM4UIGR7wLH5AcVr5Fw3H/dEqAeOPDDKjwKvz7pwTb xsREjvaM5Jx2+btcH+Pd2QDxduCh+ilwOzKdz0KAQjw9giupxSJnlMD1KyHVF9H8kvuu Ssa0mZn5JlJJ9/rzUxIjQrzFQeZ/Tb5geElnSheC3TykChSPxcGbgzAT7hkxq4OhXiP/ HUFJE95HKPDvvBCxz29h1T+mNikgAPgGNNZbbRQKty5gjtT3VKEbccPx9gIoyFm6L4iY AaUQ== X-Gm-Message-State: APjAAAVtCqmFXJ/P7M9kFsLQSG5ZCFfrx+73frVe+MsNGMYTm/vQCUb+ r62gx9nap9VK/N/9PSxDuujpWdVXlQ== X-Received: by 2002:a67:f911:: with SMTP id t17mr3355111vsq.128.1560194074584; Mon, 10 Jun 2019 12:14:34 -0700 (PDT) Received: from kmo-pixel.hsd1.vt.comcast.net (c-71-234-172-214.hsd1.vt.comcast.net. [71.234.172.214]) by smtp.gmail.com with ESMTPSA id t20sm4834014vkd.53.2019.06.10.12.14.33 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Mon, 10 Jun 2019 12:14:33 -0700 (PDT) From: Kent Overstreet To: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-bcache@vger.kernel.org Cc: Kent Overstreet Subject: [PATCH 05/12] fs: insert_inode_locked2() Date: Mon, 10 Jun 2019 15:14:13 -0400 Message-Id: <20190610191420.27007-6-kent.overstreet@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190610191420.27007-1-kent.overstreet@gmail.com> References: <20190610191420.27007-1-kent.overstreet@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org New helper for bcachefs, so that when we race inserting an inode we can atomically grab a ref to the inode already in the inode cache. Signed-off-by: Kent Overstreet --- fs/inode.c | 40 ++++++++++++++++++++++++++++++++++++++++ include/linux/fs.h | 1 + 2 files changed, 41 insertions(+) diff --git a/fs/inode.c b/fs/inode.c index 8881dc551f..cc44f345e0 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1479,6 +1479,46 @@ int insert_inode_locked(struct inode *inode) } EXPORT_SYMBOL(insert_inode_locked); +struct inode *insert_inode_locked2(struct inode *inode) +{ + struct super_block *sb = inode->i_sb; + ino_t ino = inode->i_ino; + struct hlist_head *head = inode_hashtable + hash(sb, ino); + + while (1) { + struct inode *old = NULL; + spin_lock(&inode_hash_lock); + hlist_for_each_entry(old, head, i_hash) { + if (old->i_ino != ino) + continue; + if (old->i_sb != sb) + continue; + spin_lock(&old->i_lock); + if (old->i_state & (I_FREEING|I_WILL_FREE)) { + spin_unlock(&old->i_lock); + continue; + } + break; + } + if (likely(!old)) { + spin_lock(&inode->i_lock); + inode->i_state |= I_NEW | I_CREATING; + hlist_add_head(&inode->i_hash, head); + spin_unlock(&inode->i_lock); + spin_unlock(&inode_hash_lock); + return NULL; + } + __iget(old); + spin_unlock(&old->i_lock); + spin_unlock(&inode_hash_lock); + wait_on_inode(old); + if (unlikely(!inode_unhashed(old))) + return old; + iput(old); + } +} +EXPORT_SYMBOL(insert_inode_locked2); + int insert_inode_locked4(struct inode *inode, unsigned long hashval, int (*test)(struct inode *, void *), void *data) { diff --git a/include/linux/fs.h b/include/linux/fs.h index a88d994751..d5d12d6981 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -3010,6 +3010,7 @@ extern struct inode *find_inode_nowait(struct super_block *, void *data); extern int insert_inode_locked4(struct inode *, unsigned long, int (*test)(struct inode *, void *), void *); extern int insert_inode_locked(struct inode *); +extern struct inode *insert_inode_locked2(struct inode *); #ifdef CONFIG_DEBUG_LOCK_ALLOC extern void lockdep_annotate_inode_mutex_key(struct inode *inode); #else -- 2.20.1