All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gabriel Krisman Bertazi <krisman@collabora.com>
To: amir73il@gmail.com
Cc: kernel@collabora.com, djwong@kernel.org, tytso@mit.edu,
	david@fromorbit.com, jack@suse.com, dhowells@redhat.com,
	khazhy@google.com, linux-fsdevel@vger.kernel.org,
	linux-ext4@vger.kernel.org,
	Gabriel Krisman Bertazi <krisman@collabora.com>
Subject: [PATCH v2 04/14] fanotify: Split superblock marks out to a new cache
Date: Tue, 15 Jun 2021 19:55:46 -0400	[thread overview]
Message-ID: <20210615235556.970928-5-krisman@collabora.com> (raw)
In-Reply-To: <20210615235556.970928-1-krisman@collabora.com>

FAN_ERROR will require an error structure to be stored per mark.  But,
since FAN_ERROR doesn't apply to inode/mount marks, it should suffice to
only expose this information for superblock marks. Therefore, wrap this
kind of marks into a container and plumb it for the future.

Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com>

---
Changes since v1:
  - Only extend superblock marks
---
 fs/notify/fanotify/fanotify.c      | 10 ++++++++--
 fs/notify/fanotify/fanotify.h      | 11 +++++++++++
 fs/notify/fanotify/fanotify_user.c | 29 ++++++++++++++++++++++++++++-
 include/linux/fsnotify_backend.h   |  1 +
 4 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c
index 057abd2cf887..f85efb24cfb4 100644
--- a/fs/notify/fanotify/fanotify.c
+++ b/fs/notify/fanotify/fanotify.c
@@ -867,9 +867,15 @@ static void fanotify_freeing_mark(struct fsnotify_mark *mark,
 		dec_ucount(group->fanotify_data.ucounts, UCOUNT_FANOTIFY_MARKS);
 }
 
-static void fanotify_free_mark(struct fsnotify_mark *fsn_mark)
+static void fanotify_free_mark(struct fsnotify_mark *mark)
 {
-	kmem_cache_free(fanotify_mark_cache, fsn_mark);
+	if (mark->flags & FSNOTIFY_MARK_FLAG_SB) {
+		struct fanotify_sb_mark *fa_mark = FANOTIFY_SB_MARK(mark);
+
+		kmem_cache_free(fanotify_sb_mark_cache, fa_mark);
+	} else {
+		kmem_cache_free(fanotify_mark_cache, mark);
+	}
 }
 
 const struct fsnotify_ops fanotify_fsnotify_ops = {
diff --git a/fs/notify/fanotify/fanotify.h b/fs/notify/fanotify/fanotify.h
index 4a5e555dc3d2..aec05e21d5a9 100644
--- a/fs/notify/fanotify/fanotify.h
+++ b/fs/notify/fanotify/fanotify.h
@@ -6,6 +6,7 @@
 #include <linux/hashtable.h>
 
 extern struct kmem_cache *fanotify_mark_cache;
+extern struct kmem_cache *fanotify_sb_mark_cache;
 extern struct kmem_cache *fanotify_fid_event_cachep;
 extern struct kmem_cache *fanotify_path_event_cachep;
 extern struct kmem_cache *fanotify_perm_event_cachep;
@@ -129,6 +130,16 @@ static inline void fanotify_info_copy_name(struct fanotify_info *info,
 	       name->name);
 }
 
+struct fanotify_sb_mark {
+	struct fsnotify_mark fsn_mark;
+};
+
+static inline
+struct fanotify_sb_mark *FANOTIFY_SB_MARK(struct fsnotify_mark *mark)
+{
+	return container_of(mark, struct fanotify_sb_mark, fsn_mark);
+}
+
 /*
  * Common structure for fanotify events. Concrete structs are allocated in
  * fanotify_handle_event() and freed when the information is retrieved by
diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c
index af518790a80f..db378480f1b1 100644
--- a/fs/notify/fanotify/fanotify_user.c
+++ b/fs/notify/fanotify/fanotify_user.c
@@ -99,6 +99,7 @@ struct ctl_table fanotify_table[] = {
 extern const struct fsnotify_ops fanotify_fsnotify_ops;
 
 struct kmem_cache *fanotify_mark_cache __read_mostly;
+struct kmem_cache *fanotify_sb_mark_cache __read_mostly;
 struct kmem_cache *fanotify_fid_event_cachep __read_mostly;
 struct kmem_cache *fanotify_path_event_cachep __read_mostly;
 struct kmem_cache *fanotify_perm_event_cachep __read_mostly;
@@ -915,6 +916,27 @@ static __u32 fanotify_mark_add_to_mask(struct fsnotify_mark *fsn_mark,
 	return mask & ~oldmask;
 }
 
+static struct fsnotify_mark *fanotify_alloc_mark(unsigned int type)
+{
+	struct fanotify_sb_mark *sb_mark;
+
+	switch (type) {
+	case FSNOTIFY_OBJ_TYPE_SB:
+		sb_mark = kmem_cache_zalloc(fanotify_sb_mark_cache, GFP_KERNEL);
+		if (!sb_mark)
+			return NULL;
+		return &sb_mark->fsn_mark;
+
+	case FSNOTIFY_OBJ_TYPE_INODE:
+	case FSNOTIFY_OBJ_TYPE_PARENT:
+	case FSNOTIFY_OBJ_TYPE_VFSMOUNT:
+		return kmem_cache_alloc(fanotify_mark_cache, GFP_KERNEL);
+	default:
+		WARN_ON(1);
+		return NULL;
+	}
+}
+
 static struct fsnotify_mark *fanotify_add_new_mark(struct fsnotify_group *group,
 						   fsnotify_connp_t *connp,
 						   unsigned int type,
@@ -933,13 +955,16 @@ static struct fsnotify_mark *fanotify_add_new_mark(struct fsnotify_group *group,
 	    !inc_ucount(ucounts->ns, ucounts->uid, UCOUNT_FANOTIFY_MARKS))
 		return ERR_PTR(-ENOSPC);
 
-	mark = kmem_cache_alloc(fanotify_mark_cache, GFP_KERNEL);
+	mark = fanotify_alloc_mark(type);
 	if (!mark) {
 		ret = -ENOMEM;
 		goto out_dec_ucounts;
 	}
 
 	fsnotify_init_mark(mark, group);
+	if (type == FSNOTIFY_OBJ_TYPE_SB)
+		mark->flags |= FSNOTIFY_MARK_FLAG_SB;
+
 	ret = fsnotify_add_mark_locked(mark, connp, type, 0, fsid);
 	if (ret) {
 		fsnotify_put_mark(mark);
@@ -1497,6 +1522,8 @@ static int __init fanotify_user_setup(void)
 
 	fanotify_mark_cache = KMEM_CACHE(fsnotify_mark,
 					 SLAB_PANIC|SLAB_ACCOUNT);
+	fanotify_sb_mark_cache = KMEM_CACHE(fanotify_sb_mark,
+					    SLAB_PANIC|SLAB_ACCOUNT);
 	fanotify_fid_event_cachep = KMEM_CACHE(fanotify_fid_event,
 					       SLAB_PANIC);
 	fanotify_path_event_cachep = KMEM_CACHE(fanotify_path_event,
diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h
index 1ce66748a2d2..c4473b467c28 100644
--- a/include/linux/fsnotify_backend.h
+++ b/include/linux/fsnotify_backend.h
@@ -401,6 +401,7 @@ struct fsnotify_mark {
 #define FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY	0x01
 #define FSNOTIFY_MARK_FLAG_ALIVE		0x02
 #define FSNOTIFY_MARK_FLAG_ATTACHED		0x04
+#define FSNOTIFY_MARK_FLAG_SB			0x08
 	unsigned int flags;		/* flags [mark->lock] */
 };
 
-- 
2.31.0


  parent reply	other threads:[~2021-06-15 23:56 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-15 23:55 [PATCH v2 00/14] File system wide monitoring Gabriel Krisman Bertazi
2021-06-15 23:55 ` [PATCH v2 01/14] fsnotify: Don't call insert hook for overflow events Gabriel Krisman Bertazi
2021-06-16  7:49   ` Amir Goldstein
2021-06-15 23:55 ` [PATCH v2 02/14] fanotify: Fold event size calculation to its own function Gabriel Krisman Bertazi
2021-06-15 23:55 ` [PATCH v2 03/14] fanotify: Split fsid check from other fid mode checks Gabriel Krisman Bertazi
2021-06-16  8:07   ` Amir Goldstein
2021-06-15 23:55 ` Gabriel Krisman Bertazi [this message]
2021-06-16  9:16   ` [PATCH v2 04/14] fanotify: Split superblock marks out to a new cache Amir Goldstein
2021-06-15 23:55 ` [PATCH v2 05/14] inotify: Don't force FS_IN_IGNORED Gabriel Krisman Bertazi
2021-06-15 23:55 ` [PATCH v2 06/14] fsnotify: Add helper to detect overflow_event Gabriel Krisman Bertazi
2021-06-16  9:23   ` Amir Goldstein
2021-06-15 23:55 ` [PATCH v2 07/14] fsnotify: pass arguments of fsnotify() in struct fsnotify_event_info Gabriel Krisman Bertazi
2021-06-16  9:26   ` Amir Goldstein
2021-06-16 10:11   ` kernel test robot
2021-06-16 10:11     ` kernel test robot
2021-06-15 23:55 ` [PATCH v2 08/14] fsnotify: Support passing argument to insert callback on add_event Gabriel Krisman Bertazi
2021-06-15 23:55 ` [PATCH v2 09/14] fsnotify: Support FS_ERROR event type Gabriel Krisman Bertazi
2021-06-16  9:29   ` Amir Goldstein
2021-06-15 23:55 ` [PATCH v2 10/14] fsnotify: Introduce helpers to send error_events Gabriel Krisman Bertazi
2021-06-16  9:38   ` Amir Goldstein
2021-06-15 23:55 ` [PATCH v2 11/14] fanotify: Introduce FAN_FS_ERROR event Gabriel Krisman Bertazi
2021-06-16 11:02   ` Amir Goldstein
2021-06-15 23:55 ` [PATCH v2 12/14] ext4: Send notifications on error Gabriel Krisman Bertazi
2021-06-15 23:55 ` [PATCH v2 13/14] samples: Add fs error monitoring example Gabriel Krisman Bertazi
2021-06-16 13:04   ` kernel test robot
2021-06-16 13:04     ` kernel test robot
2021-06-15 23:55 ` [PATCH v2 14/14] Documentation: Document the FAN_FS_ERROR event Gabriel Krisman Bertazi

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=20210615235556.970928-5-krisman@collabora.com \
    --to=krisman@collabora.com \
    --cc=amir73il@gmail.com \
    --cc=david@fromorbit.com \
    --cc=dhowells@redhat.com \
    --cc=djwong@kernel.org \
    --cc=jack@suse.com \
    --cc=kernel@collabora.com \
    --cc=khazhy@google.com \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=tytso@mit.edu \
    /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.