From: Stefan Roesch <shr@fb.com>
To: <io-uring@vger.kernel.org>, <kernel-team@fb.com>,
<linux-mm@kvack.org>, <linux-xfs@vger.kernel.org>,
<linux-fsdevel@vger.kernel.org>
Cc: <shr@fb.com>, <david@fromorbit.com>
Subject: [RFC PATCH v1 08/18] fs: split off need_file_update_time and do_file_update_time
Date: Tue, 26 Apr 2022 10:43:25 -0700 [thread overview]
Message-ID: <20220426174335.4004987-9-shr@fb.com> (raw)
In-Reply-To: <20220426174335.4004987-1-shr@fb.com>
This splits off the functions need_file_update_time() and
do_file_update_time() from the function file_update_time().
This is required to support async buffered writes.
No intended functional changes in this patch.
Signed-off-by: Stefan Roesch <shr@fb.com>
---
fs/inode.c | 72 ++++++++++++++++++++++++++++++----------------
include/linux/fs.h | 5 ++++
2 files changed, 52 insertions(+), 25 deletions(-)
diff --git a/fs/inode.c b/fs/inode.c
index 79c5702ef7c3..64047bb0b9f8 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -2054,35 +2054,22 @@ int file_remove_privs(struct file *file)
}
EXPORT_SYMBOL(file_remove_privs);
-/**
- * file_update_time - update mtime and ctime time
- * @file: file accessed
- *
- * Update the mtime and ctime members of an inode and mark the inode
- * for writeback. Note that this function is meant exclusively for
- * usage in the file write path of filesystems, and filesystems may
- * choose to explicitly ignore update via this function with the
- * S_NOCMTIME inode flag, e.g. for network filesystem where these
- * timestamps are handled by the server. This can return an error for
- * file systems who need to allocate space in order to update an inode.
- */
-
-int file_update_time(struct file *file)
+int need_file_update_time(struct inode *inode, struct file *file,
+ struct timespec64 *now)
{
- struct inode *inode = file_inode(file);
- struct timespec64 now;
int sync_it = 0;
- int ret;
+
+ if (unlikely(file->f_mode & FMODE_NOCMTIME))
+ return 0;
/* First try to exhaust all avenues to not sync */
if (IS_NOCMTIME(inode))
return 0;
- now = current_time(inode);
- if (!timespec64_equal(&inode->i_mtime, &now))
+ if (!timespec64_equal(&inode->i_mtime, now))
sync_it = S_MTIME;
- if (!timespec64_equal(&inode->i_ctime, &now))
+ if (!timespec64_equal(&inode->i_ctime, now))
sync_it |= S_CTIME;
if (IS_I_VERSION(inode) && inode_iversion_need_inc(inode))
@@ -2091,24 +2078,58 @@ int file_update_time(struct file *file)
if (!sync_it)
return 0;
+ return sync_it;
+}
+
+int do_file_update_time(struct inode *inode, struct file *file,
+ struct timespec64 *now, int sync_mode)
+{
+ int ret;
+
/* Finally allowed to write? Takes lock. */
if (__mnt_want_write_file(file))
return 0;
- ret = inode_update_time(inode, &now, sync_it);
+ ret = inode_update_time(inode, now, sync_mode);
__mnt_drop_write_file(file);
return ret;
}
+
+/**
+ * file_update_time - update mtime and ctime time
+ * @file: file accessed
+ *
+ * Update the mtime and ctime members of an inode and mark the inode
+ * for writeback. Note that this function is meant exclusively for
+ * usage in the file write path of filesystems, and filesystems may
+ * choose to explicitly ignore update via this function with the
+ * S_NOCMTIME inode flag, e.g. for network filesystem where these
+ * timestamps are handled by the server. This can return an error for
+ * file systems who need to allocate space in order to update an inode.
+ */
+
+int file_update_time(struct file *file)
+{
+ int err;
+ struct inode *inode = file_inode(file);
+ struct timespec64 now = current_time(inode);
+
+ err = need_file_update_time(inode, file, &now);
+ if (err < 0)
+ return err;
+
+ return do_file_update_time(inode, file, &now, err);
+}
EXPORT_SYMBOL(file_update_time);
/* Caller must hold the file's inode lock */
int file_modified(struct file *file)
{
- int err;
int ret;
struct dentry *dentry = file_dentry(file);
struct inode *inode = file_inode(file);
+ struct timespec64 now = current_time(inode);
/*
* Clear the security bits if the process is not being run by root.
@@ -2123,10 +2144,11 @@ int file_modified(struct file *file)
return ret;
}
- if (unlikely(file->f_mode & FMODE_NOCMTIME))
- return 0;
+ ret = need_file_update_time(inode, file, &now);
+ if (ret <= 0)
+ return ret;
- return file_update_time(file);
+ return do_file_update_time(inode, file, &now, ret);
}
EXPORT_SYMBOL(file_modified);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index c2992d12601f..e268a1a50357 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2384,6 +2384,11 @@ static inline void file_accessed(struct file *file)
extern int need_file_remove_privs(struct inode *inode, struct dentry *dentry);
extern int do_file_remove_privs(struct file *file, struct inode *inode,
struct dentry *dentry, int kill);
+extern int need_file_update_time(struct inode *inode, struct file *file,
+ struct timespec64 *now);
+extern int do_file_update_time(struct inode *inode, struct file *file,
+ struct timespec64 *now, int sync_mode);
+
extern int file_modified(struct file *file);
int sync_inode_metadata(struct inode *inode, int wait);
--
2.30.2
next prev parent reply other threads:[~2022-04-26 17:44 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-26 17:43 [RFC PATCH v1 00/18] io-uring/xfs: support async buffered writes Stefan Roesch
2022-04-26 17:43 ` [RFC PATCH v1 01/18] block: add check for async buffered writes to generic_write_checks Stefan Roesch
2022-04-26 17:43 ` [RFC PATCH v1 02/18] mm: add FGP_ATOMIC flag to __filemap_get_folio() Stefan Roesch
2022-04-26 19:06 ` Matthew Wilcox
2022-04-28 19:54 ` Stefan Roesch
2022-04-26 17:43 ` [RFC PATCH v1 03/18] iomap: add iomap_page_create_gfp to allocate iomap_pages Stefan Roesch
2022-04-26 17:43 ` [RFC PATCH v1 04/18] iomap: use iomap_page_create_gfp() in __iomap_write_begin Stefan Roesch
2022-04-26 17:43 ` [RFC PATCH v1 05/18] iomap: add async buffered write support Stefan Roesch
2022-04-26 17:43 ` [RFC PATCH v1 06/18] xfs: add iomap " Stefan Roesch
2022-04-26 22:54 ` Dave Chinner
2022-04-28 20:03 ` Stefan Roesch
2022-04-28 21:44 ` Dave Chinner
2022-04-26 17:43 ` [RFC PATCH v1 07/18] fs: split off need_remove_file_privs() do_remove_file_privs() Stefan Roesch
2022-04-26 17:43 ` Stefan Roesch [this message]
2022-04-26 17:43 ` [RFC PATCH v1 09/18] fs: add pending file update time flag Stefan Roesch
2022-04-26 17:43 ` [RFC PATCH v1 10/18] xfs: Enable async write file modification handling Stefan Roesch
2022-04-26 22:55 ` Dave Chinner
2022-04-27 12:07 ` Christian Brauner
2022-04-27 15:05 ` kernel test robot
2022-04-26 17:43 ` [RFC PATCH v1 11/18] xfs: add async buffered write support Stefan Roesch
2022-04-26 22:56 ` Dave Chinner
2022-04-28 19:58 ` Stefan Roesch
2022-04-28 21:54 ` Dave Chinner
2022-05-02 21:21 ` Stefan Roesch
2022-05-06 9:29 ` Dave Chinner
2022-05-09 19:32 ` Stefan Roesch
2022-05-09 23:24 ` Dave Chinner
2022-05-09 23:44 ` Darrick J. Wong
2022-05-10 1:12 ` Dave Chinner
2022-05-10 6:47 ` Christoph Hellwig
2022-05-16 2:24 ` Dave Chinner
2022-05-16 13:39 ` Christoph Hellwig
2022-04-26 17:43 ` [RFC PATCH v1 12/18] io_uring: add support for async buffered writes Stefan Roesch
2022-04-26 17:43 ` [RFC PATCH v1 13/18] io_uring: add tracepoint for short writes Stefan Roesch
2022-04-26 17:43 ` [RFC PATCH v1 14/18] sched: add new fields to task_struct Stefan Roesch
2022-04-26 17:43 ` [RFC PATCH v1 15/18] mm: support write throttling for async buffered writes Stefan Roesch
2022-04-28 17:47 ` Jan Kara
2022-04-28 20:16 ` Stefan Roesch
2022-05-10 9:50 ` Jan Kara
2022-05-10 20:16 ` Stefan Roesch
2022-05-11 10:38 ` Jan Kara
2022-05-13 18:57 ` Stefan Roesch
2022-04-26 17:43 ` [RFC PATCH v1 16/18] iomap: User " Stefan Roesch
2022-04-26 17:43 ` [RFC PATCH v1 17/18] io_uring: support write " Stefan Roesch
2022-04-26 17:43 ` [RFC PATCH v1 18/18] xfs: enable async buffered write support Stefan Roesch
2022-04-26 22:37 ` [RFC PATCH v1 00/18] io-uring/xfs: support async buffered writes Dave Chinner
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=20220426174335.4004987-9-shr@fb.com \
--to=shr@fb.com \
--cc=david@fromorbit.com \
--cc=io-uring@vger.kernel.org \
--cc=kernel-team@fb.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-xfs@vger.kernel.org \
/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.