From: Thadeu Lima de Souza Cascardo <cascardo@igalia.com>
To: stable@vger.kernel.org
Cc: Jan Kara <jack@suse.cz>,
kernel-dev@igalia.com,
Thadeu Lima de Souza Cascardo <cascardo@igalia.com>
Subject: [PATCH 6.1 02/19] udf: Convert udf_expand_dir_adinicb() to new directory iteration
Date: Thu, 17 Oct 2024 14:18:58 -0300 [thread overview]
Message-ID: <20241017171915.311132-3-cascardo@igalia.com> (raw)
In-Reply-To: <20241017171915.311132-1-cascardo@igalia.com>
From: Jan Kara <jack@suse.cz>
[ Upstream commit 57bda9fb169d689bff4108265a897d324b5fb8c3 ]
Convert udf_expand_dir_adinicb() to new directory iteration code.
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@igalia.com>
---
fs/udf/inode.c | 66 ++++++++++++++++++++++----------------------------
1 file changed, 29 insertions(+), 37 deletions(-)
diff --git a/fs/udf/inode.c b/fs/udf/inode.c
index b574c2a9ce7b..4db51493e70c 100644
--- a/fs/udf/inode.c
+++ b/fs/udf/inode.c
@@ -331,14 +331,12 @@ struct buffer_head *udf_expand_dir_adinicb(struct inode *inode,
udf_pblk_t newblock;
struct buffer_head *dbh = NULL;
struct kernel_lb_addr eloc;
- uint8_t alloctype;
struct extent_position epos;
-
- struct udf_fileident_bh sfibh, dfibh;
- loff_t f_pos = udf_ext0_offset(inode);
- int size = udf_ext0_offset(inode) + inode->i_size;
- struct fileIdentDesc cfi, *sfi, *dfi;
+ uint8_t alloctype;
struct udf_inode_info *iinfo = UDF_I(inode);
+ struct udf_fileident_iter iter;
+ uint8_t *impuse;
+ int ret;
if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD))
alloctype = ICBTAG_FLAG_AD_SHORT;
@@ -366,38 +364,14 @@ struct buffer_head *udf_expand_dir_adinicb(struct inode *inode,
if (!dbh)
return NULL;
lock_buffer(dbh);
- memset(dbh->b_data, 0x00, inode->i_sb->s_blocksize);
+ memcpy(dbh->b_data, iinfo->i_data, inode->i_size);
+ memset(dbh->b_data + inode->i_size, 0,
+ inode->i_sb->s_blocksize - inode->i_size);
set_buffer_uptodate(dbh);
unlock_buffer(dbh);
- mark_buffer_dirty_inode(dbh, inode);
-
- sfibh.soffset = sfibh.eoffset =
- f_pos & (inode->i_sb->s_blocksize - 1);
- sfibh.sbh = sfibh.ebh = NULL;
- dfibh.soffset = dfibh.eoffset = 0;
- dfibh.sbh = dfibh.ebh = dbh;
- while (f_pos < size) {
- iinfo->i_alloc_type = ICBTAG_FLAG_AD_IN_ICB;
- sfi = udf_fileident_read(inode, &f_pos, &sfibh, &cfi, NULL,
- NULL, NULL, NULL);
- if (!sfi) {
- brelse(dbh);
- return NULL;
- }
- iinfo->i_alloc_type = alloctype;
- sfi->descTag.tagLocation = cpu_to_le32(*block);
- dfibh.soffset = dfibh.eoffset;
- dfibh.eoffset += (sfibh.eoffset - sfibh.soffset);
- dfi = (struct fileIdentDesc *)(dbh->b_data + dfibh.soffset);
- if (udf_write_fi(inode, sfi, dfi, &dfibh, sfi->impUse,
- udf_get_fi_ident(sfi))) {
- iinfo->i_alloc_type = ICBTAG_FLAG_AD_IN_ICB;
- brelse(dbh);
- return NULL;
- }
- }
- mark_buffer_dirty_inode(dbh, inode);
+ /* Drop inline data, add block instead */
+ iinfo->i_alloc_type = alloctype;
memset(iinfo->i_data + iinfo->i_lenEAttr, 0, iinfo->i_lenAlloc);
iinfo->i_lenAlloc = 0;
eloc.logicalBlockNum = *block;
@@ -408,10 +382,28 @@ struct buffer_head *udf_expand_dir_adinicb(struct inode *inode,
epos.block = iinfo->i_location;
epos.offset = udf_file_entry_alloc_offset(inode);
udf_add_aext(inode, &epos, &eloc, inode->i_size, 0);
- /* UniqueID stuff */
-
brelse(epos.bh);
mark_inode_dirty(inode);
+
+ /* Now fixup tags in moved directory entries */
+ for (ret = udf_fiiter_init(&iter, inode, 0);
+ !ret && iter.pos < inode->i_size;
+ ret = udf_fiiter_advance(&iter)) {
+ iter.fi.descTag.tagLocation = cpu_to_le32(*block);
+ if (iter.fi.lengthOfImpUse != cpu_to_le16(0))
+ impuse = dbh->b_data + iter.pos +
+ sizeof(struct fileIdentDesc);
+ else
+ impuse = NULL;
+ udf_fiiter_write_fi(&iter, impuse);
+ }
+ /*
+ * We don't expect the iteration to fail as the directory has been
+ * already verified to be correct
+ */
+ WARN_ON_ONCE(ret);
+ udf_fiiter_release(&iter);
+
return dbh;
}
--
2.34.1
next prev parent reply other threads:[~2024-10-17 17:19 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-17 17:18 [PATCH 6.1 00/19] Fix NULL pointer dereference for corrupted UDF filesystems Thadeu Lima de Souza Cascardo
2024-10-17 17:18 ` [PATCH 6.1 01/19] udf: New directory iteration code Thadeu Lima de Souza Cascardo
2024-10-17 17:18 ` Thadeu Lima de Souza Cascardo [this message]
2024-10-17 17:18 ` [PATCH 6.1 03/19] udf: Move udf_expand_dir_adinicb() to its callsite Thadeu Lima de Souza Cascardo
2024-10-17 17:19 ` [PATCH 6.1 04/19] udf: Implement searching for directory entry using new iteration code Thadeu Lima de Souza Cascardo
2024-10-17 17:19 ` [PATCH 6.1 05/19] udf: Provide function to mark entry as deleted using new directory " Thadeu Lima de Souza Cascardo
2024-10-17 17:19 ` [PATCH 6.1 06/19] udf: Convert udf_rename() to " Thadeu Lima de Souza Cascardo
2024-10-17 17:19 ` [PATCH 6.1 07/19] udf: Convert udf_readdir() to new directory iteration Thadeu Lima de Souza Cascardo
2024-10-17 17:19 ` [PATCH 6.1 08/19] udf: Convert udf_lookup() to use new directory iteration code Thadeu Lima de Souza Cascardo
2024-10-17 17:19 ` [PATCH 6.1 09/19] udf: Convert udf_get_parent() to " Thadeu Lima de Souza Cascardo
2024-10-17 17:19 ` [PATCH 6.1 10/19] udf: Convert empty_dir() " Thadeu Lima de Souza Cascardo
2024-10-17 17:19 ` [PATCH 6.1 11/19] udf: Convert udf_rmdir() " Thadeu Lima de Souza Cascardo
2024-10-17 17:19 ` [PATCH 6.1 12/19] udf: Convert udf_unlink() " Thadeu Lima de Souza Cascardo
2024-10-17 17:19 ` [PATCH 6.1 13/19] udf: Implement adding of dir entries using new " Thadeu Lima de Souza Cascardo
2024-10-17 17:19 ` [PATCH 6.1 14/19] udf: Convert udf_add_nondir() to new directory iteration Thadeu Lima de Souza Cascardo
2024-10-17 17:19 ` [PATCH 6.1 15/19] udf: Convert udf_mkdir() to new directory iteration code Thadeu Lima de Souza Cascardo
2024-10-17 17:19 ` [PATCH 6.1 16/19] udf: Convert udf_link() " Thadeu Lima de Souza Cascardo
2024-10-17 17:19 ` [PATCH 6.1 17/19] udf: Remove old " Thadeu Lima de Souza Cascardo
2024-10-17 17:19 ` [PATCH 6.1 18/19] udf: Handle error when expanding directory Thadeu Lima de Souza Cascardo
2024-10-17 17:19 ` [PATCH 6.1 19/19] udf: Don't return bh from udf_expand_dir_adinicb() Thadeu Lima de Souza Cascardo
2024-10-18 6:41 ` [PATCH 6.1 00/19] Fix NULL pointer dereference for corrupted UDF filesystems Greg KH
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=20241017171915.311132-3-cascardo@igalia.com \
--to=cascardo@igalia.com \
--cc=jack@suse.cz \
--cc=kernel-dev@igalia.com \
--cc=stable@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox