From: Christoph Hellwig <hch@lst.de> To: Andrew Morton <akpm@linux-foundation.org>, Chris Mason <clm@fb.com>, Josef Bacik <josef@toxicpanda.com>, David Sterba <dsterba@suse.com>, Dave Kleikamp <shaggy@kernel.org>, Mark Fasheh <mark@fasheh.com>, Joel Becker <jlbec@evilplan.org>, Joseph Qi <joseph.qi@linux.alibaba.com>, Evgeniy Dushistov <dushistov@mail.ru>, "Matthew Wilcox (Oracle)" <willy@infradead.org> Cc: linux-btrfs@vger.kernel.org, jfs-discussion@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH 5/7] ufs: don't flush page immediately for DIRSYNC directories Date: Sun, 8 Jan 2023 17:56:43 +0100 [thread overview] Message-ID: <20230108165645.381077-6-hch@lst.de> (raw) In-Reply-To: <20230108165645.381077-1-hch@lst.de> We do not need to writeout modified directory blocks immediately when modifying them while the page is locked. It is enough to do the flush somewhat later which has the added benefit that inode times can be flushed as well. It also allows us to stop depending on write_one_page() function. Ported from an ext2 patch by Jan Kara. Signed-off-by: Christoph Hellwig <hch@lst.de> --- fs/ufs/dir.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/fs/ufs/dir.c b/fs/ufs/dir.c index 391efaf1d52897..379d75796a5ce3 100644 --- a/fs/ufs/dir.c +++ b/fs/ufs/dir.c @@ -42,11 +42,10 @@ static inline int ufs_match(struct super_block *sb, int len, return !memcmp(name, de->d_name, len); } -static int ufs_commit_chunk(struct page *page, loff_t pos, unsigned len) +static void ufs_commit_chunk(struct page *page, loff_t pos, unsigned len) { struct address_space *mapping = page->mapping; struct inode *dir = mapping->host; - int err = 0; inode_inc_iversion(dir); block_write_end(NULL, mapping, pos, len, len, page, NULL); @@ -54,10 +53,16 @@ static int ufs_commit_chunk(struct page *page, loff_t pos, unsigned len) i_size_write(dir, pos+len); mark_inode_dirty(dir); } - if (IS_DIRSYNC(dir)) - err = write_one_page(page); - else - unlock_page(page); + unlock_page(page); +} + +static int ufs_handle_dirsync(struct inode *dir) +{ + int err; + + err = filemap_write_and_wait(dir->i_mapping); + if (!err) + err = sync_inode_metadata(dir, 1); return err; } @@ -99,11 +104,12 @@ void ufs_set_link(struct inode *dir, struct ufs_dir_entry *de, de->d_ino = cpu_to_fs32(dir->i_sb, inode->i_ino); ufs_set_de_type(dir->i_sb, de, inode->i_mode); - err = ufs_commit_chunk(page, pos, len); + ufs_commit_chunk(page, pos, len); ufs_put_page(page); if (update_times) dir->i_mtime = dir->i_ctime = current_time(dir); mark_inode_dirty(dir); + ufs_handle_dirsync(dir); } @@ -390,10 +396,11 @@ int ufs_add_link(struct dentry *dentry, struct inode *inode) de->d_ino = cpu_to_fs32(sb, inode->i_ino); ufs_set_de_type(sb, de, inode->i_mode); - err = ufs_commit_chunk(page, pos, rec_len); + ufs_commit_chunk(page, pos, rec_len); dir->i_mtime = dir->i_ctime = current_time(dir); mark_inode_dirty(dir); + err = ufs_handle_dirsync(dir); /* OFFSET_CACHE */ out_put: ufs_put_page(page); @@ -531,9 +538,10 @@ int ufs_delete_entry(struct inode *inode, struct ufs_dir_entry *dir, if (pde) pde->d_reclen = cpu_to_fs16(sb, to - from); dir->d_ino = 0; - err = ufs_commit_chunk(page, pos, to - from); + ufs_commit_chunk(page, pos, to - from); inode->i_ctime = inode->i_mtime = current_time(inode); mark_inode_dirty(inode); + err = ufs_handle_dirsync(inode); out: ufs_put_page(page); UFSD("EXIT\n"); @@ -579,7 +587,8 @@ int ufs_make_empty(struct inode * inode, struct inode *dir) strcpy (de->d_name, ".."); kunmap(page); - err = ufs_commit_chunk(page, 0, chunk_size); + ufs_commit_chunk(page, 0, chunk_size); + err = ufs_handle_dirsync(inode); fail: put_page(page); return err; -- 2.35.1
WARNING: multiple messages have this Message-ID (diff)
From: Christoph Hellwig via Ocfs2-devel <ocfs2-devel@oss.oracle.com> To: Andrew Morton <akpm@linux-foundation.org>, Chris Mason <clm@fb.com>, Josef Bacik <josef@toxicpanda.com>, David Sterba <dsterba@suse.com>, Dave Kleikamp <shaggy@kernel.org>, Mark Fasheh <mark@fasheh.com>, Joel Becker <jlbec@evilplan.org>, Joseph Qi <joseph.qi@linux.alibaba.com>, Evgeniy Dushistov <dushistov@mail.ru>, "Matthew Wilcox (Oracle)" <willy@infradead.org> Cc: linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, jfs-discussion@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, linux-btrfs@vger.kernel.org Subject: [Ocfs2-devel] [PATCH 5/7] ufs: don't flush page immediately for DIRSYNC directories Date: Sun, 8 Jan 2023 17:56:43 +0100 [thread overview] Message-ID: <20230108165645.381077-6-hch@lst.de> (raw) In-Reply-To: <20230108165645.381077-1-hch@lst.de> We do not need to writeout modified directory blocks immediately when modifying them while the page is locked. It is enough to do the flush somewhat later which has the added benefit that inode times can be flushed as well. It also allows us to stop depending on write_one_page() function. Ported from an ext2 patch by Jan Kara. Signed-off-by: Christoph Hellwig <hch@lst.de> --- fs/ufs/dir.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/fs/ufs/dir.c b/fs/ufs/dir.c index 391efaf1d52897..379d75796a5ce3 100644 --- a/fs/ufs/dir.c +++ b/fs/ufs/dir.c @@ -42,11 +42,10 @@ static inline int ufs_match(struct super_block *sb, int len, return !memcmp(name, de->d_name, len); } -static int ufs_commit_chunk(struct page *page, loff_t pos, unsigned len) +static void ufs_commit_chunk(struct page *page, loff_t pos, unsigned len) { struct address_space *mapping = page->mapping; struct inode *dir = mapping->host; - int err = 0; inode_inc_iversion(dir); block_write_end(NULL, mapping, pos, len, len, page, NULL); @@ -54,10 +53,16 @@ static int ufs_commit_chunk(struct page *page, loff_t pos, unsigned len) i_size_write(dir, pos+len); mark_inode_dirty(dir); } - if (IS_DIRSYNC(dir)) - err = write_one_page(page); - else - unlock_page(page); + unlock_page(page); +} + +static int ufs_handle_dirsync(struct inode *dir) +{ + int err; + + err = filemap_write_and_wait(dir->i_mapping); + if (!err) + err = sync_inode_metadata(dir, 1); return err; } @@ -99,11 +104,12 @@ void ufs_set_link(struct inode *dir, struct ufs_dir_entry *de, de->d_ino = cpu_to_fs32(dir->i_sb, inode->i_ino); ufs_set_de_type(dir->i_sb, de, inode->i_mode); - err = ufs_commit_chunk(page, pos, len); + ufs_commit_chunk(page, pos, len); ufs_put_page(page); if (update_times) dir->i_mtime = dir->i_ctime = current_time(dir); mark_inode_dirty(dir); + ufs_handle_dirsync(dir); } @@ -390,10 +396,11 @@ int ufs_add_link(struct dentry *dentry, struct inode *inode) de->d_ino = cpu_to_fs32(sb, inode->i_ino); ufs_set_de_type(sb, de, inode->i_mode); - err = ufs_commit_chunk(page, pos, rec_len); + ufs_commit_chunk(page, pos, rec_len); dir->i_mtime = dir->i_ctime = current_time(dir); mark_inode_dirty(dir); + err = ufs_handle_dirsync(dir); /* OFFSET_CACHE */ out_put: ufs_put_page(page); @@ -531,9 +538,10 @@ int ufs_delete_entry(struct inode *inode, struct ufs_dir_entry *dir, if (pde) pde->d_reclen = cpu_to_fs16(sb, to - from); dir->d_ino = 0; - err = ufs_commit_chunk(page, pos, to - from); + ufs_commit_chunk(page, pos, to - from); inode->i_ctime = inode->i_mtime = current_time(inode); mark_inode_dirty(inode); + err = ufs_handle_dirsync(inode); out: ufs_put_page(page); UFSD("EXIT\n"); @@ -579,7 +587,8 @@ int ufs_make_empty(struct inode * inode, struct inode *dir) strcpy (de->d_name, ".."); kunmap(page); - err = ufs_commit_chunk(page, 0, chunk_size); + ufs_commit_chunk(page, 0, chunk_size); + err = ufs_handle_dirsync(inode); fail: put_page(page); return err; -- 2.35.1 _______________________________________________ Ocfs2-devel mailing list Ocfs2-devel@oss.oracle.com https://oss.oracle.com/mailman/listinfo/ocfs2-devel
next prev parent reply other threads:[~2023-01-08 16:57 UTC|newest] Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-01-08 16:56 remove write_one_page / folio_write_one Christoph Hellwig 2023-01-08 16:56 ` [Ocfs2-devel] " Christoph Hellwig via Ocfs2-devel 2023-01-08 16:56 ` [PATCH 1/7] btrfs: don't read the disk superblock for zoned devices in btrfs_scratch_superblocks Christoph Hellwig 2023-01-08 16:56 ` [Ocfs2-devel] " Christoph Hellwig via Ocfs2-devel 2023-01-08 16:56 ` [PATCH 2/7] btrfs: stop using write_one_page in btrfs_scratch_superblock Christoph Hellwig 2023-01-08 16:56 ` [Ocfs2-devel] " Christoph Hellwig via Ocfs2-devel 2023-01-08 21:13 ` Matthew Wilcox via Ocfs2-devel 2023-01-08 21:13 ` Matthew Wilcox 2023-01-08 16:56 ` [PATCH 3/7] minix: don't flush page immediately for DIRSYNC directories Christoph Hellwig 2023-01-08 16:56 ` [Ocfs2-devel] " Christoph Hellwig via Ocfs2-devel 2023-01-08 21:17 ` Matthew Wilcox 2023-01-08 21:17 ` [Ocfs2-devel] " Matthew Wilcox via Ocfs2-devel 2023-01-10 8:22 ` Christoph Hellwig 2023-01-10 8:22 ` [Ocfs2-devel] " Christoph Hellwig via Ocfs2-devel 2023-01-11 2:20 ` Al Viro 2023-01-11 2:20 ` [Ocfs2-devel] " Al Viro via Ocfs2-devel 2023-01-11 4:26 ` Christoph Hellwig via Ocfs2-devel 2023-01-11 4:26 ` Christoph Hellwig 2023-01-11 4:58 ` Al Viro 2023-01-11 4:58 ` [Ocfs2-devel] " Al Viro via Ocfs2-devel 2023-01-08 16:56 ` [PATCH 4/7] sysv: " Christoph Hellwig 2023-01-08 16:56 ` [Ocfs2-devel] " Christoph Hellwig via Ocfs2-devel 2023-01-08 21:19 ` Matthew Wilcox 2023-01-08 21:19 ` [Ocfs2-devel] " Matthew Wilcox via Ocfs2-devel 2023-01-10 8:24 ` Christoph Hellwig via Ocfs2-devel 2023-01-10 8:24 ` Christoph Hellwig 2023-01-08 16:56 ` Christoph Hellwig [this message] 2023-01-08 16:56 ` [Ocfs2-devel] [PATCH 5/7] ufs: " Christoph Hellwig via Ocfs2-devel 2023-01-08 16:56 ` [PATCH 6/7] ocfs2: don't use write_one_page in ocfs2_duplicate_clusters_by_page Christoph Hellwig 2023-01-08 16:56 ` [Ocfs2-devel] " Christoph Hellwig via Ocfs2-devel 2023-01-09 17:03 ` Jan Kara via Ocfs2-devel 2023-01-09 17:03 ` Jan Kara 2023-01-10 3:03 ` [Ocfs2-devel] " Joseph Qi via Ocfs2-devel 2023-01-10 3:03 ` Joseph Qi 2023-01-08 16:56 ` [PATCH 7/7] mm,jfs: move write_one_page/folio_write_one to jfs Christoph Hellwig 2023-01-08 16:56 ` [Ocfs2-devel] [PATCH 7/7] mm, jfs: " Christoph Hellwig via Ocfs2-devel 2023-01-08 21:31 ` remove write_one_page / folio_write_one Matthew Wilcox 2023-01-08 21:31 ` [Ocfs2-devel] " Matthew Wilcox via Ocfs2-devel 2023-01-09 19:53 ` David Sterba 2023-01-09 19:53 ` [Ocfs2-devel] " David Sterba via Ocfs2-devel 2023-01-10 8:16 ` Christoph Hellwig 2023-01-10 8:16 ` [Ocfs2-devel] " Christoph Hellwig via Ocfs2-devel 2023-01-10 13:00 ` David Sterba 2023-01-10 13:00 ` [Ocfs2-devel] " David Sterba via Ocfs2-devel 2023-01-10 15:32 ` Christoph Hellwig via Ocfs2-devel 2023-01-10 15:32 ` Christoph Hellwig 2023-01-11 19:20 ` David Sterba 2023-01-11 19:20 ` [Ocfs2-devel] " David Sterba via Ocfs2-devel 2023-01-12 8:02 ` Christoph Hellwig 2023-01-12 8:02 ` [Ocfs2-devel] " Christoph Hellwig via Ocfs2-devel
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=20230108165645.381077-6-hch@lst.de \ --to=hch@lst.de \ --cc=akpm@linux-foundation.org \ --cc=clm@fb.com \ --cc=dsterba@suse.com \ --cc=dushistov@mail.ru \ --cc=jfs-discussion@lists.sourceforge.net \ --cc=jlbec@evilplan.org \ --cc=josef@toxicpanda.com \ --cc=joseph.qi@linux.alibaba.com \ --cc=linux-btrfs@vger.kernel.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=mark@fasheh.com \ --cc=ocfs2-devel@oss.oracle.com \ --cc=shaggy@kernel.org \ --cc=willy@infradead.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: linkBe 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.