Thread (59 messages) 59 messages, 4 authors, 2021-10-28

Re: [PATCH v8 27/32] fanotify: Report fid info for file related file system errors

From: Amir Goldstein <amir73il@gmail.com>
Date: 2021-10-19 06:07:46
Also in: linux-api, linux-fsdevel

On Tue, Oct 19, 2021 at 3:04 AM Gabriel Krisman Bertazi
[off-list ref] wrote:
Plumb the pieces to add a FID report to error records.  Since all error
event memory must be pre-allocated, we pre-allocate the maximum file
handle size possible, such that it should always fit.

For errors that don't expose a file handle report it with an invalid
FID.

Signed-off-by: Gabriel Krisman Bertazi <redacted>
Reviewed-by: Amir Goldstein <amir73il@gmail.com>

with minor nit below..
quoted hunk ↗ jump to hunk
---
Changes since v7:
  - Move WARN_ON to separate patch (Amir)
  - Avoid duplication in the structure definition (Amir)
Changes since v6:
  - pass fsid from handle_events
Changes since v5:
  - Use preallocated MAX_HANDLE_SZ FH buffer
  - Report superblock errors with a zerolength INVALID FID (jan, amir)
---
 fs/notify/fanotify/fanotify.c | 10 ++++++++++
 fs/notify/fanotify/fanotify.h | 11 +++++++++++
 2 files changed, 21 insertions(+)
diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c
index 45df610debbe..335ce8f88eb8 100644
--- a/fs/notify/fanotify/fanotify.c
+++ b/fs/notify/fanotify/fanotify.c
@@ -609,7 +609,9 @@ static struct fanotify_event *fanotify_alloc_error_event(
 {
        struct fs_error_report *report =
                        fsnotify_data_error_report(data, data_type);
+       struct inode *inode = report->inode;
        struct fanotify_error_event *fee;
+       int fh_len;

        if (WARN_ON_ONCE(!report))
                return NULL;
@@ -622,6 +624,14 @@ static struct fanotify_event *fanotify_alloc_error_event(
        fee->err_count = 1;
        fee->fsid = *fsid;

+       fh_len = fanotify_encode_fh_len(inode);
+
+       /* Bad fh_len. Fallback to using an invalid fh. Should never happen. */
+       if (!fh_len && inode)
+               inode = NULL;
+
+       fanotify_encode_fh(&fee->object_fh, inode, fh_len, NULL, 0);
+
        *hash ^= fanotify_hash_fsid(fsid);

        return &fee->fae;
diff --git a/fs/notify/fanotify/fanotify.h b/fs/notify/fanotify/fanotify.h
index bdf01ad4f9bf..4246a34667b5 100644
--- a/fs/notify/fanotify/fanotify.h
+++ b/fs/notify/fanotify/fanotify.h
@@ -209,6 +209,9 @@ struct fanotify_error_event {
        u32 err_count; /* Suppressed errors count */

        __kernel_fsid_t fsid; /* FSID this error refers to. */
+
+       /* This must be the last element of the structure. */
+       FANOTIFY_INLINE_FH(MAX_HANDLE_SZ);
Does not really have to be last but certainly doesn't hurt

Thanks,
Amir.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help