Received: by 2002:a05:6a10:1d13:0:0:0:0 with SMTP id pp19csp1923651pxb; Mon, 23 Aug 2021 07:50:09 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzjbI2m01Gyvo7r8eBFTs3yDMXjvZO6nvAhLDZ7RHW58RAqedSWtzqsUFfpUbChv3Pouh/m X-Received: by 2002:a50:cc06:: with SMTP id m6mr37367300edi.97.1629730209232; Mon, 23 Aug 2021 07:50:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629730209; cv=none; d=google.com; s=arc-20160816; b=LxXEstMdSPzZrMhNR4EJzzoKgMnVr7AXpC+dEF9ThGj1STFfFIP5hmJ7aKiyXV2Bvo HYom0q1c6OTjqkzrLSwyu1AfvCphRHFCoYUOkuEm7vYkpNvJV09vgngdx8aIzK7LIR4F L2rF+ZGbKS+sgHqZnRifIMlPAlyxBHM9FgSSnt1RaInhs1Ww0PAAT2wOfnwgyDXCXIqf 2LbaqvZMLtEaNJeSUJH/YWOEEVHJRJsixU/MDhGmCIc1yq92zkmvncZQp7LBTjCHfuKE cBgCYN1FpS5NlAAVdD0Sq0vPN4BkYwNjJeKbJYcq/Sdeau97FbUw3JTYNealAAtoJPjK v8yA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:user-agent:message-id:in-reply-to :date:references:organization:subject:cc:to:from; bh=maHf79f4Q9o7XfDWCIsM/aqUOeotlmXZ5doVpKc8OGg=; b=DDuRrWUPoJed9ejeDXVuopohv8BKEBrLZzytrk3KB82NbAtPo5Fzm5CRi7I1KLi8S1 5cW/jH7RlxPxQA2QZrykikc/iXOU/tcsLMh9saIl6LZBxApT3BXDtGPzi8kuT4Dgdl5B dmp6RJvuMMc0aIwiOgzqzbDdYF/fGcK8LhWR+oQw/ZmcN8RW+XGasAzrwZN40smW/MmO 8KwRLXf3Lbj8PRA6hG6XNcbwNg1lxiiodJKhDCvfP7NiFVKQDmL8FgvsXfeAO1qnvdHJ 8XGXX4lAenilkdojYIu7I9cWbhvwNkkwQ6a3OVh1HtB1WFlC23Gg8fhl+n+bUfqVc/55 Sq/A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-ext4-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y12si1123944edl.424.2021.08.23.07.49.41; Mon, 23 Aug 2021 07:50:09 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-ext4-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-ext4-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230141AbhHWOuU (ORCPT + 99 others); Mon, 23 Aug 2021 10:50:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34966 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229726AbhHWOuU (ORCPT ); Mon, 23 Aug 2021 10:50:20 -0400 Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [IPv6:2a00:1098:0:82:1000:25:2eeb:e3e3]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6A3D8C061575; Mon, 23 Aug 2021 07:49:37 -0700 (PDT) Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: krisman) with ESMTPSA id E62A81F41D5B From: Gabriel Krisman Bertazi To: Jan Kara Cc: amir73il@gmail.com, jack@suse.com, linux-api@vger.kernel.org, linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, khazhy@google.com, dhowells@redhat.com, david@fromorbit.com, tytso@mit.edu, djwong@kernel.org, repnop@google.com, kernel@collabora.com Subject: Re: [PATCH v6 20/21] samples: Add fs error monitoring example Organization: Collabora References: <20210812214010.3197279-1-krisman@collabora.com> <20210812214010.3197279-21-krisman@collabora.com> <20210818130251.GD28119@quack2.suse.cz> Date: Mon, 23 Aug 2021 10:49:31 -0400 In-Reply-To: <20210818130251.GD28119@quack2.suse.cz> (Jan Kara's message of "Wed, 18 Aug 2021 15:02:51 +0200") Message-ID: <87fsv02p38.fsf@collabora.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org Jan Kara writes: n > On Thu 12-08-21 17:40:09, Gabriel Krisman Bertazi wrote: >> Introduce an example of a FAN_FS_ERROR fanotify user to track filesystem >> errors. >> >> Reviewed-by: Amir Goldstein >> Signed-off-by: Gabriel Krisman Bertazi > > > >> diff --git a/samples/fanotify/fs-monitor.c b/samples/fanotify/fs-monitor.c >> new file mode 100644 >> index 000000000000..e115053382be >> --- /dev/null >> +++ b/samples/fanotify/fs-monitor.c >> @@ -0,0 +1,138 @@ >> +// SPDX-License-Identifier: GPL-2.0 >> +/* >> + * Copyright 2021, Collabora Ltd. >> + */ >> + >> +#define _GNU_SOURCE >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +#ifndef FAN_FS_ERROR >> +#define FAN_FS_ERROR 0x00008000 >> +#define FAN_EVENT_INFO_TYPE_ERROR 4 >> + >> +struct fanotify_event_info_error { >> + struct fanotify_event_info_header hdr; >> + __s32 error; >> + __u32 error_count; >> +}; >> +#endif > > Shouldn't we get these from uapi headers? But I guess the problem is that > you want this sample to work before glibc picks up the new headers? Is this > meant as a sample code for userspace to copy from or more as a > testcase? Hi, Yes, this will be picked from the uapi headers, but the guards try to guarantee against an older libc. They also have the side effect of silencing the kernel test robot about this patch... :) This is meant as a sample code for users to copy from. it was also used as testing in the beginning but now I have a proper ltp testcase in a different series. >> +#ifndef FILEID_INO32_GEN >> +#define FILEID_INO32_GEN 1 >> +#endif >> + >> +#ifndef FILEID_INVALID >> +#define FILEID_INVALID 0xff >> +#endif >> + >> +static void print_fh(struct file_handle *fh) >> +{ >> + int i; >> + uint32_t *h = (uint32_t *) fh->f_handle; >> + >> + printf("\tfh: "); >> + for (i = 0; i < fh->handle_bytes; i++) >> + printf("%hhx", fh->f_handle[i]); >> + printf("\n"); >> + >> + printf("\tdecoded fh: "); >> + if (fh->handle_type == FILEID_INO32_GEN) >> + printf("inode=%u gen=%u\n", h[0], h[1]); >> + else if (fh->handle_type == FILEID_INVALID && !fh->handle_bytes) >> + printf("Type %d (Superblock error)\n", fh->handle_type); >> + else >> + printf("Type %d (Unknown)\n", fh->handle_type); >> + >> +} >> + >> +static void handle_notifications(char *buffer, int len) >> +{ >> + struct fanotify_event_metadata *metadata; >> + struct fanotify_event_info_error *error; >> + struct fanotify_event_info_fid *fid; >> + char *next; >> + >> + for (metadata = (struct fanotify_event_metadata *) buffer; >> + FAN_EVENT_OK(metadata, len); >> + metadata = FAN_EVENT_NEXT(metadata, len)) { >> + next = (char *)metadata + metadata->event_len; >> + if (metadata->mask != FAN_FS_ERROR) { >> + printf("unexpected FAN MARK: %llx\n", metadata->mask); >> + goto next_event; >> + } else if (metadata->fd != FAN_NOFD) { >> + printf("Unexpected fd (!= FAN_NOFD)\n"); >> + goto next_event; >> + } >> + >> + printf("FAN_FS_ERROR found len=%d\n", metadata->event_len); >> + >> + error = (struct fanotify_event_info_error *) (metadata+1); >> + if (error->hdr.info_type != FAN_EVENT_INFO_TYPE_ERROR) { >> + printf("unknown record: %d (Expecting TYPE_ERROR)\n", >> + error->hdr.info_type); >> + goto next_event; >> + } > > The ordering of additional infos is undefined. Your code must not rely on > the fact that FAN_EVENT_INFO_TYPE_ERROR comes first and > FAN_EVENT_INFO_TYPE_FID second. Also you should ignore (maybe just print > type and len in this sample code) when you see unexpected info types as > later additions to the API may add additional info records Ah, I was really wondering whether the order is guaranteed or not. Even though the current code forces it that way, I couldn't find the man page explicitly saying whether it is guaranteed. Thanks, I will fix it up. -- Gabriel Krisman Bertazi