From patchwork Wed Mar 15 10:46:13 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kara X-Patchwork-Id: 9625289 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id D8E9660424 for ; Wed, 15 Mar 2017 10:47:28 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D74352854E for ; Wed, 15 Mar 2017 10:47:28 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CAB8B285D1; Wed, 15 Mar 2017 10:47:28 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 696992854E for ; Wed, 15 Mar 2017 10:47:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753373AbdCOKrX (ORCPT ); Wed, 15 Mar 2017 06:47:23 -0400 Received: from mx2.suse.de ([195.135.220.15]:36589 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753172AbdCOKqq (ORCPT ); Wed, 15 Mar 2017 06:46:46 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id F2B37AE09; Wed, 15 Mar 2017 10:46:42 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id CEF6B1E1203; Wed, 15 Mar 2017 11:46:39 +0100 (CET) From: Jan Kara To: Cc: Miklos Szeredi , Amir Goldstein , Paul Moore , Jan Kara Subject: [PATCH 14/33] fsnotify: Remove indirection from fsnotify_detach_mark() Date: Wed, 15 Mar 2017 11:46:13 +0100 Message-Id: <20170315104632.7037-15-jack@suse.cz> X-Mailer: git-send-email 2.10.2 In-Reply-To: <20170315104632.7037-1-jack@suse.cz> References: <20170315104632.7037-1-jack@suse.cz> Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP fsnotify_detach_mark() calls fsnotify_destroy_inode_mark() or fsnotify_destroy_vfsmount_mark() to remove mark from object list. These two functions are however very similar and differ only in the lock they use to protect the object list of marks. Simplify the code by removing the indirection and removing mark from the object list in a common function. Signed-off-by: Jan Kara Reviewed-by: Amir Goldstein --- fs/notify/fsnotify.h | 4 ---- fs/notify/inode_mark.c | 21 --------------------- fs/notify/mark.c | 33 +++++++++++++++++++++++++++------ fs/notify/vfsmount_mark.c | 18 ------------------ 4 files changed, 27 insertions(+), 49 deletions(-) diff --git a/fs/notify/fsnotify.h b/fs/notify/fsnotify.h index 225924274f8a..510f027bdf0f 100644 --- a/fs/notify/fsnotify.h +++ b/fs/notify/fsnotify.h @@ -18,10 +18,6 @@ extern struct srcu_struct fsnotify_mark_srcu; extern int fsnotify_compare_groups(struct fsnotify_group *a, struct fsnotify_group *b); -/* vfsmount specific destruction of a mark */ -extern void fsnotify_destroy_vfsmount_mark(struct fsnotify_mark *mark); -/* inode specific destruction of a mark */ -extern struct inode *fsnotify_destroy_inode_mark(struct fsnotify_mark *mark); /* Find mark belonging to given group in the list of marks */ extern struct fsnotify_mark *fsnotify_find_mark( struct fsnotify_mark_connector *conn, diff --git a/fs/notify/inode_mark.c b/fs/notify/inode_mark.c index f05fc49b8242..080b6d8b9973 100644 --- a/fs/notify/inode_mark.c +++ b/fs/notify/inode_mark.c @@ -35,27 +35,6 @@ void fsnotify_recalc_inode_mask(struct inode *inode) fsnotify_recalc_mask(inode->i_fsnotify_marks); } -struct inode *fsnotify_destroy_inode_mark(struct fsnotify_mark *mark) -{ - struct inode *inode = mark->connector->inode; - bool empty; - - BUG_ON(!mutex_is_locked(&mark->group->mark_mutex)); - assert_spin_locked(&mark->lock); - - spin_lock(&inode->i_lock); - - hlist_del_init_rcu(&mark->obj_list); - empty = hlist_empty(&mark->connector->list); - mark->connector = NULL; - - spin_unlock(&inode->i_lock); - - fsnotify_recalc_mask(inode->i_fsnotify_marks); - - return empty ? inode : NULL; -} - /* * Given a group clear all of the inode marks associated with that group. */ diff --git a/fs/notify/mark.c b/fs/notify/mark.c index e808378e468a..cbc7149e17a3 100644 --- a/fs/notify/mark.c +++ b/fs/notify/mark.c @@ -146,6 +146,31 @@ void fsnotify_recalc_mask(struct fsnotify_mark_connector *conn) } } +static struct inode *fsnotify_detach_from_object(struct fsnotify_mark *mark) +{ + struct fsnotify_mark_connector *conn; + struct inode *inode = NULL; + spinlock_t *lock; + + conn = mark->connector; + if (conn->flags & FSNOTIFY_OBJ_TYPE_INODE) + lock = &conn->inode->i_lock; + else + lock = &conn->mnt->mnt_root->d_lock; + spin_lock(lock); + hlist_del_init_rcu(&mark->obj_list); + if (hlist_empty(&conn->list)) { + if (conn->flags & FSNOTIFY_OBJ_TYPE_INODE) + inode = conn->inode; + } else { + __fsnotify_recalc_mask(conn); + } + mark->connector = NULL; + spin_unlock(lock); + + return inode; +} + /* * Remove mark from inode / vfsmount list, group list, drop inode reference * if we got one. @@ -169,12 +194,8 @@ void fsnotify_detach_mark(struct fsnotify_mark *mark) mark->flags &= ~FSNOTIFY_MARK_FLAG_ATTACHED; - if (mark->connector->flags & FSNOTIFY_OBJ_TYPE_INODE) - inode = fsnotify_destroy_inode_mark(mark); - else if (mark->connector->flags & FSNOTIFY_OBJ_TYPE_VFSMOUNT) - fsnotify_destroy_vfsmount_mark(mark); - else - BUG(); + inode = fsnotify_detach_from_object(mark); + /* * Note that we didn't update flags telling whether inode cares about * what's happening with children. We update these flags from diff --git a/fs/notify/vfsmount_mark.c b/fs/notify/vfsmount_mark.c index 3476ee44b2c5..26da5c209944 100644 --- a/fs/notify/vfsmount_mark.c +++ b/fs/notify/vfsmount_mark.c @@ -39,24 +39,6 @@ void fsnotify_recalc_vfsmount_mask(struct vfsmount *mnt) fsnotify_recalc_mask(real_mount(mnt)->mnt_fsnotify_marks); } -void fsnotify_destroy_vfsmount_mark(struct fsnotify_mark *mark) -{ - struct vfsmount *mnt = mark->connector->mnt; - struct mount *m = real_mount(mnt); - - BUG_ON(!mutex_is_locked(&mark->group->mark_mutex)); - assert_spin_locked(&mark->lock); - - spin_lock(&mnt->mnt_root->d_lock); - - hlist_del_init_rcu(&mark->obj_list); - mark->connector = NULL; - - spin_unlock(&mnt->mnt_root->d_lock); - - fsnotify_recalc_mask(m->mnt_fsnotify_marks); -} - /* * given a group and vfsmount, find the mark associated with that combination. * if found take a reference to that mark and return it, else return NULL