Description for this pull request:

- Fix xfstests generic/482 test failure.
 - Fix double free in delayed_free.
 -----BEGIN PGP SIGNATURE-----
 
 iQJKBAABCgA0FiEE6NzKS6Uv/XAAGHgyZwv7A1FEIQgFAmg1BJgWHGxpbmtpbmpl
 b25Aa2VybmVsLm9yZwAKCRBnC/sDUUQhCGtXD/9ZIcwcPFqAs08LU8XXi6PXw5/6
 UbA868SO1tI1aOc5IzMZWmIc0tRYaDHigWazO1DHIENt/UvixVOdOuOgn/BcCjv+
 2bZdrId3H2n6JaDu9XR/yYZl7iotYtNpxNC1TKBGXF9ah3uZc6LTHAxVAgkPfWY/
 1mr6vLF1+K+Z5GRtC/U0HBkkdMcmd5pJUYWH0aZPUJnP/6drfbrzvIsI3m01xqWZ
 B/+TnjOmFQLBlv7mIabIqE2O/oERHVLjMRNwdkQOrpGLqtfJiHAs6O4NluVvBeQ1
 sNUkAPl/2R/ya8CZdDpZYsDWTjJ7PHyHuUrCCj47A8lC/rAwOXidqUckSaGNtJDN
 Zk10N/ciiXgjuCBR6SoJrQHmHacCvyo/bamHzP23yevKxIY2t4DGuiOrYWZ7aXSZ
 T7WoptzxrhxGuIhV5l/req97ZNE2WOe3OkSRacAVjtHxmsjL/+/gGF//bupRIILt
 xEsZNvaxo84U468+O4FXZvaYlwCk31Jj6ihglnHmyGoCy14P9v/Ksf9DTZYYTZvm
 OVkaSa7B/+w10q/43u5V0FCwyfgk8KiPI/rgwi3KaAUhMbg+6EKhwwj651KytCuf
 xPyGvHmvvXR8h1fbm8pSX7R11jDBcM2nP2YxX3AJK/K8m5pW/+Dhi6iYXnjITJ8C
 vNPgd2OSyqzXOB/gOg==
 =p5zT
 -----END PGP SIGNATURE-----

Merge tag 'exfat-for-6.16-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/linkinjeon/exfat

Pull exfat updates from Namjae Jeon:

 - Fix xfstests generic/482 test failure

 - Fix double free in delayed_free

* tag 'exfat-for-6.16-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/linkinjeon/exfat:
  exfat: do not clear volume dirty flag during sync
  exfat: fix double free in delayed_free
pull/1112/head
Linus Torvalds 2025-05-28 12:02:04 -07:00
commit c69d8e9de0
2 changed files with 8 additions and 23 deletions

View File

@ -801,4 +801,5 @@ load_default:
void exfat_free_upcase_table(struct exfat_sb_info *sbi) void exfat_free_upcase_table(struct exfat_sb_info *sbi)
{ {
kvfree(sbi->vol_utbl); kvfree(sbi->vol_utbl);
sbi->vol_utbl = NULL;
} }

View File

@ -36,31 +36,12 @@ static void exfat_put_super(struct super_block *sb)
struct exfat_sb_info *sbi = EXFAT_SB(sb); struct exfat_sb_info *sbi = EXFAT_SB(sb);
mutex_lock(&sbi->s_lock); mutex_lock(&sbi->s_lock);
exfat_clear_volume_dirty(sb);
exfat_free_bitmap(sbi); exfat_free_bitmap(sbi);
brelse(sbi->boot_bh); brelse(sbi->boot_bh);
mutex_unlock(&sbi->s_lock); mutex_unlock(&sbi->s_lock);
} }
static int exfat_sync_fs(struct super_block *sb, int wait)
{
struct exfat_sb_info *sbi = EXFAT_SB(sb);
int err = 0;
if (unlikely(exfat_forced_shutdown(sb)))
return 0;
if (!wait)
return 0;
/* If there are some dirty buffers in the bdev inode */
mutex_lock(&sbi->s_lock);
sync_blockdev(sb->s_bdev);
if (exfat_clear_volume_dirty(sb))
err = -EIO;
mutex_unlock(&sbi->s_lock);
return err;
}
static int exfat_statfs(struct dentry *dentry, struct kstatfs *buf) static int exfat_statfs(struct dentry *dentry, struct kstatfs *buf)
{ {
struct super_block *sb = dentry->d_sb; struct super_block *sb = dentry->d_sb;
@ -219,7 +200,6 @@ static const struct super_operations exfat_sops = {
.write_inode = exfat_write_inode, .write_inode = exfat_write_inode,
.evict_inode = exfat_evict_inode, .evict_inode = exfat_evict_inode,
.put_super = exfat_put_super, .put_super = exfat_put_super,
.sync_fs = exfat_sync_fs,
.statfs = exfat_statfs, .statfs = exfat_statfs,
.show_options = exfat_show_options, .show_options = exfat_show_options,
.shutdown = exfat_shutdown, .shutdown = exfat_shutdown,
@ -751,10 +731,14 @@ static void exfat_free(struct fs_context *fc)
static int exfat_reconfigure(struct fs_context *fc) static int exfat_reconfigure(struct fs_context *fc)
{ {
struct super_block *sb = fc->root->d_sb;
fc->sb_flags |= SB_NODIRATIME; fc->sb_flags |= SB_NODIRATIME;
/* volume flag will be updated in exfat_sync_fs */ sync_filesystem(sb);
sync_filesystem(fc->root->d_sb); mutex_lock(&EXFAT_SB(sb)->s_lock);
exfat_clear_volume_dirty(sb);
mutex_unlock(&EXFAT_SB(sb)->s_lock);
return 0; return 0;
} }