From patchwork Thu Nov 15 18:45:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 10684841 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9CFAA1709 for ; Thu, 15 Nov 2018 18:45:58 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8AD262CF57 for ; Thu, 15 Nov 2018 18:45:58 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7DD122CF59; Thu, 15 Nov 2018 18:45:58 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,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 011AB2CF68 for ; Thu, 15 Nov 2018 18:45:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388730AbeKPEyw (ORCPT ); Thu, 15 Nov 2018 23:54:52 -0500 Received: from mail-wm1-f67.google.com ([209.85.128.67]:40498 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726453AbeKPEyw (ORCPT ); Thu, 15 Nov 2018 23:54:52 -0500 Received: by mail-wm1-f67.google.com with SMTP id q26so8896682wmf.5; Thu, 15 Nov 2018 10:45:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ruckDpbY0iU70zYuo4mcjgrmbjQQpFPe0tY3azraTfM=; b=nTEIL83Z89nolEhzs3JTFFbr2jDxQm6jw0USOBmswZL3iQ/sSvbSfqCznyP58cD/zg dGq/p0G2Wt5y7eBY1hr48+5OkogQVd4oM9vlTXEYaYPmGKc8yklE7Ef5zm9Qgb8Cdb7y c3kPwPZ1bcFUOxTbxMC1I5N5YdtcNBJSshWibuj8PHShijjxorWil+avY2QRz4UME+k9 MU+eTYlIt1duB0Ek/O/9vgMfsJ2yeiYPn1qE+beENWsdUrJedEs0HCK5u6gksczNLONF v/aGEVlwQlaLeUhv3qDqD+u8xroFLehTml/j5w+jGBAdNbFFDYQNvzYap7VQRZl2gvWn k9Pg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ruckDpbY0iU70zYuo4mcjgrmbjQQpFPe0tY3azraTfM=; b=nRedJb5PTWB45su27jCb/aiHBpDXsa1unil5COXu5YjnJPzSfr2ATo3STP7AGI3DOv ehVN2kOVvbCqR+8EkteLHmotMKgWGQGu9/PqGpQrpiDkQfiK/+m24z1MU42nFQdfKHTa 8hFxjLsy6JvBvjTc/W5m5xPa6YKss8oqmJwC1gkQgZEUwmpduIw5ldysXq7MmVZJl7Pg OV5s0ORr0qgkeSdGrsjG0SzMVW0g+lHus6dm9ThTIdwmmfhuk6lUjWWZgEG62uvcc+Iv nRppBaQordMPV/whe7CNhmuChfY4SDRNPchBt4LKDO9j35kcyN4kBpLXSSWqoV8DXI9K w7aA== X-Gm-Message-State: AGRZ1gJQQiBQmkj/9iy1ZpfZ+O/wZtTUfHSNdTubHMcd0QQwPDnTAkrU Qi+3Rnx9wDtDqscWDaZbWWPBfJI4 X-Google-Smtp-Source: AJdET5dYsJgg2scI2AE2QcITmiK43JffBuM/pC1Jj7lxqCu5bQDl5BpT3pCq3hlurewPSD5l6gQwfg== X-Received: by 2002:a1c:9987:: with SMTP id b129-v6mr139194wme.112.1542307553806; Thu, 15 Nov 2018 10:45:53 -0800 (PST) Received: from localhost.localdomain ([37.46.46.74]) by smtp.gmail.com with ESMTPSA id s1sm13976327wro.9.2018.11.15.10.45.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 15 Nov 2018 10:45:53 -0800 (PST) From: Amir Goldstein To: Jan Kara Cc: Matthew Bobrowski , linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v2 2/9] fanotify: define the structures to report a unique file identifier Date: Thu, 15 Nov 2018 20:45:37 +0200 Message-Id: <20181115184544.30681-3-amir73il@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181115184544.30681-1-amir73il@gmail.com> References: <20181115184544.30681-1-amir73il@gmail.com> 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 When user requests the flag FAN_REPORT_FID in fanotify_init(), a unique file indetifier of the event target object will be reported with the event. This commit only defines the internal and user visible structures used to store and report the unique file identifier. The file identifier includes the filesystem's fsid (i.e. from statfs(2)) and an NFS file handle of the file (i.e. from name_to_handle_at(2)). The file identifier makes holding the path reference and passing a file descriptor to user redundant, so those are disabled in a group with FAN_REPORT_FID. Cc: Signed-off-by: Amir Goldstein --- fs/notify/fanotify/fanotify.c | 2 +- fs/notify/fanotify/fanotify.h | 26 ++++++++++++++++---- fs/notify/fanotify/fanotify_user.c | 5 ++-- include/uapi/linux/fanotify.h | 38 +++++++++++++++++++++++++----- 4 files changed, 57 insertions(+), 14 deletions(-) diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c index ecd5f4aec624..59d093923c97 100644 --- a/fs/notify/fanotify/fanotify.c +++ b/fs/notify/fanotify/fanotify.c @@ -178,7 +178,7 @@ init: __maybe_unused event->pid = get_pid(task_pid(current)); else event->pid = get_pid(task_tgid(current)); - if (path) { + if (path && !FAN_GROUP_FLAG(group, FAN_REPORT_FID)) { event->path = *path; path_get(&event->path); } else { diff --git a/fs/notify/fanotify/fanotify.h b/fs/notify/fanotify/fanotify.h index fb84dd3289f8..2e4fca30afda 100644 --- a/fs/notify/fanotify/fanotify.h +++ b/fs/notify/fanotify/fanotify.h @@ -7,6 +7,14 @@ extern struct kmem_cache *fanotify_mark_cache; extern struct kmem_cache *fanotify_event_cachep; extern struct kmem_cache *fanotify_perm_event_cachep; +/* The size of the variable length buffer storing fsid and file handle */ +#define FANOTIFY_FID_LEN(handle_bytes) \ + (sizeof(struct fanotify_event_fid) + (handle_bytes)) + +struct fanotify_info { + struct fanotify_event_fid *fid; +}; + /* * Structure for normal fanotify events. It gets allocated in * fanotify_handle_event() and freed when the information is retrieved by @@ -14,11 +22,19 @@ extern struct kmem_cache *fanotify_perm_event_cachep; */ struct fanotify_event { struct fsnotify_event fse; - /* - * We hold ref to this path so it may be dereferenced at any point - * during this object's lifetime - */ - struct path path; + union { + /* + * We hold ref to this path so it may be dereferenced at any + * point during this object's lifetime + */ + struct path path; + /* + * With FAN_REPORT_FID, we do not hold any reference on the + * victim object. Instead we store its NFS file handle and its + * filesystem's fsid as a unique identifier. + */ + struct fanotify_info info; + }; struct pid *pid; }; diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index 2dbb2662a92f..93e1aa2a389f 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c @@ -133,9 +133,10 @@ static int fill_event_metadata(struct fsnotify_group *group, metadata->reserved = 0; metadata->mask = fsn_event->mask & FANOTIFY_OUTGOING_EVENTS; metadata->pid = pid_vnr(event->pid); - if (unlikely(fsn_event->mask & FAN_Q_OVERFLOW)) + if (FAN_GROUP_FLAG(group, FAN_REPORT_FID) || + unlikely(fsn_event->mask & FAN_Q_OVERFLOW)) { metadata->fd = FAN_NOFD; - else { + } else { metadata->fd = create_fd(group, event, file); if (metadata->fd < 0) ret = metadata->fd; diff --git a/include/uapi/linux/fanotify.h b/include/uapi/linux/fanotify.h index 909c98fcace2..aa510aec7968 100644 --- a/include/uapi/linux/fanotify.h +++ b/include/uapi/linux/fanotify.h @@ -44,6 +44,7 @@ /* Flags to determine fanotify event format */ #define FAN_REPORT_TID 0x00000100 /* event->pid is thread id */ +#define FAN_REPORT_FID 0x00000200 /* Report unique file id */ /* Deprecated - do not use this in programs and do not add new flags here! */ #define FAN_ALL_INIT_FLAGS (FAN_CLOEXEC | FAN_NONBLOCK | \ @@ -106,6 +107,24 @@ struct fanotify_event_metadata { __s32 pid; }; +#define FAN_EVENT_INFO_TYPE_FID 1 + +/* Variable length info record header following event metadata */ +struct fanotify_event_info { + __u8 info_type; + __u8 reserved; + __u16 info_len; + unsigned char info[0]; +}; + +/* Unique file identifier info record */ +struct fanotify_event_fid { + __kernel_fsid_t fsid; + __u32 handle_bytes; + __s32 handle_type; + unsigned char f_handle[0]; +}; + struct fanotify_response { __s32 fd; __u32 response; @@ -122,12 +141,19 @@ struct fanotify_response { /* Helper functions to deal with fanotify_event_metadata buffers */ #define FAN_EVENT_METADATA_LEN (sizeof(struct fanotify_event_metadata)) -#define FAN_EVENT_NEXT(meta, len) ((len) -= (meta)->event_len, \ - (struct fanotify_event_metadata*)(((char *)(meta)) + \ - (meta)->event_len)) +#define FAN_EVENT_NEXT(meta, len) \ + ((len) -= (meta)->event_len, \ + (struct fanotify_event_metadata *)(((char *)(meta)) + \ + (meta)->event_len)) + +#define FAN_EVENT_OK(meta, len) \ + ((long)(len) >= (long)FAN_EVENT_METADATA_LEN && \ + (long)(meta)->event_len >= (long)FAN_EVENT_METADATA_LEN && \ + (long)(meta)->event_len <= (long)(len)) -#define FAN_EVENT_OK(meta, len) ((long)(len) >= (long)FAN_EVENT_METADATA_LEN && \ - (long)(meta)->event_len >= (long)FAN_EVENT_METADATA_LEN && \ - (long)(meta)->event_len <= (long)(len)) +/* Get the first event info record if one exists */ +#define FAN_EVENT_INFO(meta) \ + ((long)(meta)->event_len > (long)FAN_EVENT_METADATA_LEN ? \ + (struct fanotify_event_info *)((meta) + 1) : NULL) #endif /* _UAPI_LINUX_FANOTIFY_H */