[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <xgojnbtlup4oubcgkpkwtcoga4cpicqfrxo2oybldfswi3bdg6@avth2jykicg7>
Date: Tue, 7 Jan 2025 11:54:58 +0100
From: Jan Kara <jack@...e.cz>
To: Julian Sun <sunjunchao2870@...il.com>
Cc: linux-ext4@...r.kernel.org, tytso@....edu, adilger.kernel@...ger.ca,
jack@...e.cz
Subject: Re: [PATCH v2 4/5] ext4: Replace ext4_da_write_inline_data_begin()
with ext4_generic_write_inline_data().
On Tue 07-01-25 12:57:10, Julian Sun wrote:
> Replace the call to ext4_da_write_inline_data_begin() with
> ext4_generic_write_inline_data(), and delete the
> ext4_da_write_inline_data_begin().
>
> Signed-off-by: Julian Sun <sunjunchao2870@...il.com>
Looks good. Feel free to add:
Reviewed-by: Jan Kara <jack@...e.cz>
Honza
> ---
> fs/ext4/ext4.h | 10 ++---
> fs/ext4/inline.c | 98 +++++-------------------------------------------
> fs/ext4/inode.c | 4 +-
> 3 files changed, 16 insertions(+), 96 deletions(-)
>
> diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
> index 44b0d418143c..78dd3408ff39 100644
> --- a/fs/ext4/ext4.h
> +++ b/fs/ext4/ext4.h
> @@ -3569,11 +3569,11 @@ extern int ext4_try_to_write_inline_data(struct address_space *mapping,
> struct folio **foliop);
> int ext4_write_inline_data_end(struct inode *inode, loff_t pos, unsigned len,
> unsigned copied, struct folio *folio);
> -extern int ext4_da_write_inline_data_begin(struct address_space *mapping,
> - struct inode *inode,
> - loff_t pos, unsigned len,
> - struct folio **foliop,
> - void **fsdata);
> +extern int ext4_generic_write_inline_data(struct address_space *mapping,
> + struct inode *inode,
> + loff_t pos, unsigned len,
> + struct folio **foliop,
> + void **fsdata, bool da);
> extern int ext4_try_add_inline_entry(handle_t *handle,
> struct ext4_filename *fname,
> struct inode *dir, struct inode *inode);
> diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c
> index 3e103e003afb..58d8fcfbecba 100644
> --- a/fs/ext4/inline.c
> +++ b/fs/ext4/inline.c
> @@ -657,7 +657,15 @@ static int ext4_convert_inline_data_to_extent(struct address_space *mapping,
> return ret;
> }
>
> -static int ext4_generic_write_inline_data(struct address_space *mapping,
> +/*
> + * Prepare the write for the inline data.
> + * If the data can be written into the inode, we just read
> + * the page and make it uptodate, and start the journal.
> + * Otherwise read the page, makes it dirty so that it can be
> + * handle in writepages(the i_disksize update is left to the
> + * normal ext4_da_write_end).
> + */
> +int ext4_generic_write_inline_data(struct address_space *mapping,
> struct inode *inode,
> loff_t pos, unsigned len,
> struct folio **foliop,
> @@ -967,94 +975,6 @@ static int ext4_da_convert_inline_data_to_extent(struct address_space *mapping,
> return ret;
> }
>
> -/*
> - * Prepare the write for the inline data.
> - * If the data can be written into the inode, we just read
> - * the page and make it uptodate, and start the journal.
> - * Otherwise read the page, makes it dirty so that it can be
> - * handle in writepages(the i_disksize update is left to the
> - * normal ext4_da_write_end).
> - */
> -int ext4_da_write_inline_data_begin(struct address_space *mapping,
> - struct inode *inode,
> - loff_t pos, unsigned len,
> - struct folio **foliop,
> - void **fsdata)
> -{
> - int ret;
> - handle_t *handle;
> - struct folio *folio;
> - struct ext4_iloc iloc;
> - int retries = 0;
> -
> - ret = ext4_get_inode_loc(inode, &iloc);
> - if (ret)
> - return ret;
> -
> -retry_journal:
> - handle = ext4_journal_start(inode, EXT4_HT_INODE, 1);
> - if (IS_ERR(handle)) {
> - ret = PTR_ERR(handle);
> - goto out;
> - }
> -
> - ret = ext4_prepare_inline_data(handle, inode, pos + len);
> - if (ret && ret != -ENOSPC)
> - goto out_journal;
> -
> - if (ret == -ENOSPC) {
> - ext4_journal_stop(handle);
> - ret = ext4_da_convert_inline_data_to_extent(mapping,
> - inode,
> - fsdata);
> - if (ret == -ENOSPC &&
> - ext4_should_retry_alloc(inode->i_sb, &retries))
> - goto retry_journal;
> - goto out;
> - }
> -
> - /*
> - * We cannot recurse into the filesystem as the transaction
> - * is already started.
> - */
> - folio = __filemap_get_folio(mapping, 0, FGP_WRITEBEGIN | FGP_NOFS,
> - mapping_gfp_mask(mapping));
> - if (IS_ERR(folio)) {
> - ret = PTR_ERR(folio);
> - goto out_journal;
> - }
> -
> - down_read(&EXT4_I(inode)->xattr_sem);
> - if (!ext4_has_inline_data(inode)) {
> - ret = 0;
> - goto out_release_page;
> - }
> -
> - if (!folio_test_uptodate(folio)) {
> - ret = ext4_read_inline_folio(inode, folio);
> - if (ret < 0)
> - goto out_release_page;
> - }
> - ret = ext4_journal_get_write_access(handle, inode->i_sb, iloc.bh,
> - EXT4_JTR_NONE);
> - if (ret)
> - goto out_release_page;
> -
> - up_read(&EXT4_I(inode)->xattr_sem);
> - *foliop = folio;
> - brelse(iloc.bh);
> - return 1;
> -out_release_page:
> - up_read(&EXT4_I(inode)->xattr_sem);
> - folio_unlock(folio);
> - folio_put(folio);
> -out_journal:
> - ext4_journal_stop(handle);
> -out:
> - brelse(iloc.bh);
> - return ret;
> -}
> -
> #ifdef INLINE_DIR_DEBUG
> void ext4_show_inline_dir(struct inode *dir, struct buffer_head *bh,
> void *inline_start, int inline_size)
> diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
> index 54bdd4884fe6..24a3b0ff4c8a 100644
> --- a/fs/ext4/inode.c
> +++ b/fs/ext4/inode.c
> @@ -2918,8 +2918,8 @@ static int ext4_da_write_begin(struct file *file, struct address_space *mapping,
> trace_ext4_da_write_begin(inode, pos, len);
>
> if (ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) {
> - ret = ext4_da_write_inline_data_begin(mapping, inode, pos, len,
> - foliop, fsdata);
> + ret = ext4_generic_write_inline_data(mapping, inode, pos, len,
> + foliop, fsdata, true);
> if (ret < 0)
> return ret;
> if (ret == 1)
> --
> 2.39.5
>
--
Jan Kara <jack@...e.com>
SUSE Labs, CR
Powered by blists - more mailing lists