All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kara <jack@suse.cz>
To: <linux-fsdevel@vger.kernel.org>
Cc: Christoph Hellwig <hch@infradead.org>, Jan Kara <jack@suse.cz>
Subject: [PATCH 05/10] udf: Convert all file types to use udf_write_end()
Date: Tue, 24 Jan 2023 13:06:16 +0100	[thread overview]
Message-ID: <20230124120628.24449-5-jack@suse.cz> (raw)
In-Reply-To: <20230124120221.31585-1-jack@suse.cz>

Switching address_space_operations while a file is used is difficult to
do in a race-free way. To be able to use single address_space_operations
in UDF, create udf_write_end() function that is able to handle both
normal and in-ICB files.

Signed-off-by: Jan Kara <jack@suse.cz>
---
 fs/udf/file.c    | 16 +---------------
 fs/udf/inode.c   | 22 +++++++++++++++++++++-
 fs/udf/udfdecl.h |  3 +++
 3 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/fs/udf/file.c b/fs/udf/file.c
index 16aecf4b2387..8a37cd593883 100644
--- a/fs/udf/file.c
+++ b/fs/udf/file.c
@@ -57,27 +57,13 @@ void udf_adinicb_readpage(struct page *page)
 	kunmap_atomic(kaddr);
 }
 
-static int udf_adinicb_write_end(struct file *file, struct address_space *mapping,
-				 loff_t pos, unsigned len, unsigned copied,
-				 struct page *page, void *fsdata)
-{
-	struct inode *inode = page->mapping->host;
-	loff_t last_pos = pos + copied;
-	if (last_pos > inode->i_size)
-		i_size_write(inode, last_pos);
-	set_page_dirty(page);
-	unlock_page(page);
-	put_page(page);
-	return copied;
-}
-
 const struct address_space_operations udf_adinicb_aops = {
 	.dirty_folio	= block_dirty_folio,
 	.invalidate_folio = block_invalidate_folio,
 	.read_folio	= udf_read_folio,
 	.writepages	= udf_writepages,
 	.write_begin	= udf_write_begin,
-	.write_end	= udf_adinicb_write_end,
+	.write_end	= udf_write_end,
 	.direct_IO	= udf_direct_IO,
 };
 
diff --git a/fs/udf/inode.c b/fs/udf/inode.c
index 7f5b2b1f9847..91758c8d77e5 100644
--- a/fs/udf/inode.c
+++ b/fs/udf/inode.c
@@ -257,6 +257,26 @@ int udf_write_begin(struct file *file, struct address_space *mapping,
 	return 0;
 }
 
+int udf_write_end(struct file *file, struct address_space *mapping,
+		  loff_t pos, unsigned len, unsigned copied,
+		  struct page *page, void *fsdata)
+{
+	struct inode *inode = file_inode(file);
+	loff_t last_pos;
+
+	if (UDF_I(inode)->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB)
+		return generic_write_end(file, mapping, pos, len, copied, page,
+					 fsdata);
+	last_pos = pos + copied;
+	if (last_pos > inode->i_size)
+		i_size_write(inode, last_pos);
+	set_page_dirty(page);
+	unlock_page(page);
+	put_page(page);
+
+	return copied;
+}
+
 ssize_t udf_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
 {
 	struct file *file = iocb->ki_filp;
@@ -286,7 +306,7 @@ const struct address_space_operations udf_aops = {
 	.readahead	= udf_readahead,
 	.writepages	= udf_writepages,
 	.write_begin	= udf_write_begin,
-	.write_end	= generic_write_end,
+	.write_end	= udf_write_end,
 	.direct_IO	= udf_direct_IO,
 	.bmap		= udf_bmap,
 	.migrate_folio	= buffer_migrate_folio,
diff --git a/fs/udf/udfdecl.h b/fs/udf/udfdecl.h
index 32decf6b6a21..304c2ec81589 100644
--- a/fs/udf/udfdecl.h
+++ b/fs/udf/udfdecl.h
@@ -164,6 +164,9 @@ int udf_writepages(struct address_space *mapping, struct writeback_control *wbc)
 int udf_write_begin(struct file *file, struct address_space *mapping,
 			loff_t pos, unsigned len,
 			struct page **pagep, void **fsdata);
+int udf_write_end(struct file *file, struct address_space *mapping,
+		  loff_t pos, unsigned len, unsigned copied,
+		  struct page *page, void *fsdata);
 ssize_t udf_direct_IO(struct kiocb *iocb, struct iov_iter *iter);
 extern int8_t inode_bmap(struct inode *, sector_t, struct extent_position *,
 			 struct kernel_lb_addr *, uint32_t *, sector_t *);
-- 
2.35.3


  parent reply	other threads:[~2023-01-24 12:06 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-24 12:06 [PATCH 0/10] udf: Unify aops Jan Kara
2023-01-24 12:06 ` [PATCH 01/10] udf: Unify .read_folio for normal and in-ICB files Jan Kara
2023-01-24 13:22   ` Christoph Hellwig
2023-01-24 12:06 ` [PATCH 02/10] udf: Convert in-ICB files to use udf_writepages() Jan Kara
2023-01-24 13:25   ` Christoph Hellwig
2023-01-25  9:28     ` Jan Kara
2023-01-24 12:06 ` [PATCH 03/10] udf: Convert in-ICB files to use udf_direct_IO() Jan Kara
2023-01-24 13:25   ` Christoph Hellwig
2023-01-24 12:06 ` [PATCH 04/10] udf: Convert in-ICB files to use udf_write_begin() Jan Kara
2023-01-24 13:26   ` Christoph Hellwig
2023-01-24 12:06 ` Jan Kara [this message]
2023-01-24 13:27   ` [PATCH 05/10] udf: Convert all file types to use udf_write_end() Christoph Hellwig
2023-01-24 12:06 ` [PATCH 06/10] udf: Add handling of in-ICB files to udf_bmap() Jan Kara
2023-01-24 13:27   ` Christoph Hellwig
2023-01-24 12:06 ` [PATCH 07/10] udf: Switch to single address_space_operations Jan Kara
2023-01-24 13:28   ` Christoph Hellwig
2023-01-24 12:06 ` [PATCH 08/10] udf: Mark aops implementation static Jan Kara
2023-01-24 13:28   ` Christoph Hellwig
2023-01-24 12:06 ` [PATCH 09/10] udf: Move udf_adinicb_readpage() to inode.c Jan Kara
2023-01-24 13:28   ` Christoph Hellwig
2023-01-24 12:06 ` [PATCH 10/10] udf: Switch udf_adinicb_readpage() to kmap_local_page() Jan Kara
2023-01-24 13:29   ` Christoph Hellwig

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=20230124120628.24449-5-jack@suse.cz \
    --to=jack@suse.cz \
    --cc=hch@infradead.org \
    --cc=linux-fsdevel@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.