All of lore.kernel.org
 help / color / mirror / Atom feed
From: Amir Goldstein <amir73il@gmail.com>
To: Jan Kara <jack@suse.cz>
Cc: Miklos Szeredi <miklos@szeredi.hu>,
	Marko Rauhamaa <marko.rauhamaa@f-secure.com>,
	linux-fsdevel@vger.kernel.org
Subject: [PATCH v2 19/20] fanotify: factor out helpers to add/remove mark
Date: Thu,  5 Apr 2018 16:18:20 +0300	[thread overview]
Message-ID: <1522934301-6520-20-git-send-email-amir73il@gmail.com> (raw)
In-Reply-To: <1522934301-6520-1-git-send-email-amir73il@gmail.com>

Factor out helpers fanotify_add_mark() and fanotify_remove_mark()
to reduce duplicated code.

These helpers are going to be used for adding functions to add/remove
a super block mark.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
---
 fs/notify/fanotify/fanotify_user.c | 90 ++++++++++++++------------------------
 1 file changed, 32 insertions(+), 58 deletions(-)

diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c
index 9f2e7e2c33b3..5e78f6672da2 100644
--- a/fs/notify/fanotify/fanotify_user.c
+++ b/fs/notify/fanotify/fanotify_user.c
@@ -524,16 +524,16 @@ static __u32 fanotify_mark_remove_from_mask(struct fsnotify_mark *fsn_mark,
 	return mask & oldmask;
 }
 
-static int fanotify_remove_vfsmount_mark(struct fsnotify_group *group,
-					 struct vfsmount *mnt, __u32 mask,
-					 unsigned int flags)
+static int fanotify_remove_mark(struct fsnotify_group *group,
+				struct fsnotify_obj *obj,
+				__u32 mask, unsigned int flags)
 {
 	struct fsnotify_mark *fsn_mark = NULL;
 	__u32 removed;
 	int destroy_mark;
 
 	mutex_lock(&group->mark_mutex);
-	fsn_mark = fsnotify_find_mark(&real_mount(mnt)->mnt_fsnotify, group);
+	fsn_mark = fsnotify_find_mark(obj, group);
 	if (!fsn_mark) {
 		mutex_unlock(&group->mark_mutex);
 		return -ENOENT;
@@ -541,47 +541,32 @@ static int fanotify_remove_vfsmount_mark(struct fsnotify_group *group,
 
 	removed = fanotify_mark_remove_from_mask(fsn_mark, mask, flags,
 						 &destroy_mark);
-	if (removed & real_mount(mnt)->mnt_fsnotify.mask)
-		fsnotify_recalc_mask(&real_mount(mnt)->mnt_fsnotify);
+	if (removed & obj->mask)
+		fsnotify_recalc_mask(obj);
 	if (destroy_mark)
 		fsnotify_detach_mark(fsn_mark);
 	mutex_unlock(&group->mark_mutex);
 	if (destroy_mark)
 		fsnotify_free_mark(fsn_mark);
 
+	/* matches the fsnotify_find_mark() */
 	fsnotify_put_mark(fsn_mark);
 	return 0;
 }
 
+static int fanotify_remove_vfsmount_mark(struct fsnotify_group *group,
+					 struct vfsmount *mnt, __u32 mask,
+					 unsigned int flags)
+{
+	return fanotify_remove_mark(group, &real_mount(mnt)->mnt_fsnotify,
+				    mask, flags);
+}
+
 static int fanotify_remove_inode_mark(struct fsnotify_group *group,
 				      struct inode *inode, __u32 mask,
 				      unsigned int flags)
 {
-	struct fsnotify_mark *fsn_mark = NULL;
-	__u32 removed;
-	int destroy_mark;
-
-	mutex_lock(&group->mark_mutex);
-	fsn_mark = fsnotify_find_mark(&inode->i_fsnotify, group);
-	if (!fsn_mark) {
-		mutex_unlock(&group->mark_mutex);
-		return -ENOENT;
-	}
-
-	removed = fanotify_mark_remove_from_mask(fsn_mark, mask, flags,
-						 &destroy_mark);
-	if (removed & inode->i_fsnotify.mask)
-		fsnotify_recalc_mask(&inode->i_fsnotify);
-	if (destroy_mark)
-		fsnotify_detach_mark(fsn_mark);
-	mutex_unlock(&group->mark_mutex);
-	if (destroy_mark)
-		fsnotify_free_mark(fsn_mark);
-
-	/* matches the fsnotify_find_mark() */
-	fsnotify_put_mark(fsn_mark);
-
-	return 0;
+	return fanotify_remove_mark(group, &inode->i_fsnotify, mask, flags);
 }
 
 static __u32 fanotify_mark_add_to_mask(struct fsnotify_mark *fsn_mark,
@@ -638,40 +623,43 @@ static struct fsnotify_mark *fanotify_add_new_mark(struct fsnotify_group *group,
 }
 
 
-static int fanotify_add_vfsmount_mark(struct fsnotify_group *group,
-				      struct vfsmount *mnt, __u32 mask,
-				      unsigned int flags)
+static int fanotify_add_mark(struct fsnotify_group *group,
+			     struct fsnotify_obj *obj, unsigned int type,
+			     __u32 mask, unsigned int flags)
 {
-	struct fsnotify_obj *obj = &real_mount(mnt)->mnt_fsnotify;
 	struct fsnotify_mark *fsn_mark;
 	__u32 added;
 
 	mutex_lock(&group->mark_mutex);
 	fsn_mark = fsnotify_find_mark(obj, group);
 	if (!fsn_mark) {
-		fsn_mark = fanotify_add_new_mark(group, obj, FSNOTIFY_OBJ_TYPE_VFSMOUNT);
+		fsn_mark = fanotify_add_new_mark(group, obj, type);
 		if (IS_ERR(fsn_mark)) {
 			mutex_unlock(&group->mark_mutex);
 			return PTR_ERR(fsn_mark);
 		}
 	}
 	added = fanotify_mark_add_to_mask(fsn_mark, mask, flags);
-	if (added & ~real_mount(mnt)->mnt_fsnotify.mask)
-		fsnotify_recalc_mask(&real_mount(mnt)->mnt_fsnotify);
+	if (added & ~obj->mask)
+		fsnotify_recalc_mask(obj);
 	mutex_unlock(&group->mark_mutex);
 
 	fsnotify_put_mark(fsn_mark);
 	return 0;
 }
 
+static int fanotify_add_vfsmount_mark(struct fsnotify_group *group,
+				      struct vfsmount *mnt, __u32 mask,
+				      unsigned int flags)
+{
+	return fanotify_add_mark(group, &real_mount(mnt)->mnt_fsnotify,
+				 FSNOTIFY_OBJ_TYPE_VFSMOUNT, mask, flags);
+}
+
 static int fanotify_add_inode_mark(struct fsnotify_group *group,
 				   struct inode *inode, __u32 mask,
 				   unsigned int flags)
 {
-	struct fsnotify_obj *obj = &inode->i_fsnotify;
-	struct fsnotify_mark *fsn_mark;
-	__u32 added;
-
 	pr_debug("%s: group=%p inode=%p\n", __func__, group, inode);
 
 	/*
@@ -684,22 +672,8 @@ static int fanotify_add_inode_mark(struct fsnotify_group *group,
 	    (atomic_read(&inode->i_writecount) > 0))
 		return 0;
 
-	mutex_lock(&group->mark_mutex);
-	fsn_mark = fsnotify_find_mark(obj, group);
-	if (!fsn_mark) {
-		fsn_mark = fanotify_add_new_mark(group, obj, FSNOTIFY_OBJ_TYPE_INODE);
-		if (IS_ERR(fsn_mark)) {
-			mutex_unlock(&group->mark_mutex);
-			return PTR_ERR(fsn_mark);
-		}
-	}
-	added = fanotify_mark_add_to_mask(fsn_mark, mask, flags);
-	if (added & ~inode->i_fsnotify.mask)
-		fsnotify_recalc_mask(&inode->i_fsnotify);
-	mutex_unlock(&group->mark_mutex);
-
-	fsnotify_put_mark(fsn_mark);
-	return 0;
+	return fanotify_add_mark(group, &inode->i_fsnotify,
+				 FSNOTIFY_OBJ_TYPE_INODE, mask, flags);
 }
 
 /* fanotify syscalls */
-- 
2.7.4

  parent reply	other threads:[~2018-04-05 13:17 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-05 13:18 [PATCH v2 00/20] fanotify: super block mark Amir Goldstein
2018-04-05 13:18 ` [PATCH v2 01/20] fanotify: fix logic of events on child Amir Goldstein
2018-04-09  3:37   ` Sasha Levin
2018-04-13 13:50   ` Jan Kara
2018-04-05 13:18 ` [PATCH v2 02/20] fsnotify: fix ignore mask logic in send_to_group() Amir Goldstein
2018-04-13 13:53   ` Jan Kara
2018-04-05 13:18 ` [PATCH v2 03/20] fsnotify: fix typo in a comment about mark->g_list Amir Goldstein
2018-04-13 13:56   ` Jan Kara
2018-04-05 13:18 ` [PATCH v2 04/20] MAINTAINERS: add an entry for FSNOTIFY infrastructure Amir Goldstein
2018-04-13 13:56   ` Jan Kara
2018-04-05 13:18 ` [PATCH v2 05/20] fsnotify: use type id to identify connector object type Amir Goldstein
2018-04-17 16:26   ` Jan Kara
2018-04-17 17:45     ` Amir Goldstein
2018-04-05 13:18 ` [PATCH v2 06/20] fsnotify: remove redundant arguments to handle_event() Amir Goldstein
2018-04-17 16:33   ` Jan Kara
2018-04-17 17:59     ` Amir Goldstein
2018-04-05 13:18 ` [PATCH v2 07/20] fsnotify: introduce marks iteration helpers Amir Goldstein
2018-04-17 16:38   ` Jan Kara
2018-04-17 18:37     ` Amir Goldstein
2018-04-05 13:18 ` [PATCH v2 08/20] fsnotify: generalize iteration of marks by object type Amir Goldstein
2018-04-17 17:01   ` Jan Kara
2018-04-17 19:11     ` Amir Goldstein
2018-04-18  8:34       ` Jan Kara
2018-04-18 12:31         ` Amir Goldstein
2018-04-05 13:18 ` [PATCH v2 09/20] fsnotify: generalize send_to_group() Amir Goldstein
2018-04-05 13:18 ` [PATCH v2 10/20] fanotify: generalize fanotify_should_send_event() Amir Goldstein
2018-04-05 13:18 ` [PATCH v2 11/20] fsnotify: add fsnotify_add_inode_mark() wrappers Amir Goldstein
2018-04-05 13:18 ` [PATCH v2 12/20] fsnotify: introduce prototype struct fsnotify_obj Amir Goldstein
2018-04-19 12:14   ` Jan Kara
2018-04-05 13:18 ` [PATCH v2 13/20] fsnotify: pass fsnotify_obj instead of **connp argument Amir Goldstein
2018-04-05 13:18 ` [PATCH v2 14/20] fsnotify: pass object and object type to fsnotify_add_mark() Amir Goldstein
2018-04-19 12:23   ` Jan Kara
2018-04-19 14:28     ` Amir Goldstein
2018-04-05 13:18 ` [PATCH v2 15/20] fsnotify: make fsnotify_recalc_mask() unaware of object type Amir Goldstein
2018-04-06  9:03   ` kbuild test robot
2018-04-05 13:18 ` [PATCH v2 16/20] fsnotify: generalize fsnotify_detach_connector_from_object() Amir Goldstein
2018-04-19 13:59   ` Jan Kara
2018-04-19 14:07     ` Amir Goldstein
2018-04-05 13:18 ` [PATCH v2 17/20] fsnotify: add super block object type Amir Goldstein
2018-04-06  6:01   ` kbuild test robot
2018-04-06 11:04     ` Amir Goldstein
2018-04-19 12:41       ` Jan Kara
2018-04-19 14:27         ` Amir Goldstein
2018-04-19 12:39   ` Jan Kara
2018-04-05 13:18 ` [PATCH v2 18/20] fsnotify: send path type events to group with super block marks Amir Goldstein
2018-04-19 13:49   ` Jan Kara
2018-04-19 14:19     ` Amir Goldstein
2018-04-05 13:18 ` Amir Goldstein [this message]
2018-04-05 13:18 ` [PATCH v2 20/20] fanotify: add API to attach/detach super block mark Amir Goldstein

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1522934301-6520-20-git-send-email-amir73il@gmail.com \
    --to=amir73il@gmail.com \
    --cc=jack@suse.cz \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=marko.rauhamaa@f-secure.com \
    --cc=miklos@szeredi.hu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.