Commit 6a0e3826 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'for-6.11-rc2-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux

Pull btrfs fixes from David Sterba:

 - fix double inode unlock for direct IO sync writes (reported by
   syzbot)

 - fix root tree id/name map definitions, don't use fixed size buffers
   for name (reported by -Werror=unterminated-string-initialization)

 - fix qgroup reserve leaks in bufferd write path

 - update scrub status structure more often so it can be reported in
   user space more accurately and let 'resume' not repeat work

 - in preparation to remove space cache v1 in the future print a warning
   if it's detected

* tag 'for-6.11-rc2-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux:
  btrfs: avoid using fixed char array size for tree names
  btrfs: fix double inode unlock for direct IO sync writes
  btrfs: emit a warning about space cache v1 being deprecated
  btrfs: fix qgroup reserve leaks in cow_file_range
  btrfs: implement launder_folio for clearing dirty page reserve
  btrfs: scrub: update last_physical after scrubbing one stripe
  btrfs: factor out stripe length calculation into a helper
parents 94a8ee19 12653ec3
...@@ -1868,6 +1868,9 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) ...@@ -1868,6 +1868,9 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
out_release_extents: out_release_extents:
btrfs_release_log_ctx_extents(&ctx); btrfs_release_log_ctx_extents(&ctx);
if (skip_ilock)
up_write(&inode->i_mmap_lock);
else
btrfs_inode_unlock(inode, BTRFS_ILOCK_MMAP); btrfs_inode_unlock(inode, BTRFS_ILOCK_MMAP);
goto out; goto out;
} }
......
...@@ -1585,6 +1585,7 @@ static noinline int cow_file_range(struct btrfs_inode *inode, ...@@ -1585,6 +1585,7 @@ static noinline int cow_file_range(struct btrfs_inode *inode,
locked_page, &cached, locked_page, &cached,
clear_bits, clear_bits,
page_ops); page_ops);
btrfs_qgroup_free_data(inode, NULL, start, cur_alloc_size, NULL);
start += cur_alloc_size; start += cur_alloc_size;
} }
...@@ -1598,6 +1599,7 @@ static noinline int cow_file_range(struct btrfs_inode *inode, ...@@ -1598,6 +1599,7 @@ static noinline int cow_file_range(struct btrfs_inode *inode,
clear_bits |= EXTENT_CLEAR_DATA_RESV; clear_bits |= EXTENT_CLEAR_DATA_RESV;
extent_clear_unlock_delalloc(inode, start, end, locked_page, extent_clear_unlock_delalloc(inode, start, end, locked_page,
&cached, clear_bits, page_ops); &cached, clear_bits, page_ops);
btrfs_qgroup_free_data(inode, NULL, start, cur_alloc_size, NULL);
} }
return ret; return ret;
} }
...@@ -2259,6 +2261,7 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode, ...@@ -2259,6 +2261,7 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode,
EXTENT_DO_ACCOUNTING, PAGE_UNLOCK | EXTENT_DO_ACCOUNTING, PAGE_UNLOCK |
PAGE_START_WRITEBACK | PAGE_START_WRITEBACK |
PAGE_END_WRITEBACK); PAGE_END_WRITEBACK);
btrfs_qgroup_free_data(inode, NULL, cur_offset, end - cur_offset + 1, NULL);
} }
btrfs_free_path(path); btrfs_free_path(path);
return ret; return ret;
...@@ -7202,6 +7205,12 @@ static void wait_subpage_spinlock(struct page *page) ...@@ -7202,6 +7205,12 @@ static void wait_subpage_spinlock(struct page *page)
spin_unlock_irq(&subpage->lock); spin_unlock_irq(&subpage->lock);
} }
static int btrfs_launder_folio(struct folio *folio)
{
return btrfs_qgroup_free_data(folio_to_inode(folio), NULL, folio_pos(folio),
PAGE_SIZE, NULL);
}
static bool __btrfs_release_folio(struct folio *folio, gfp_t gfp_flags) static bool __btrfs_release_folio(struct folio *folio, gfp_t gfp_flags)
{ {
if (try_release_extent_mapping(&folio->page, gfp_flags)) { if (try_release_extent_mapping(&folio->page, gfp_flags)) {
...@@ -10137,6 +10146,7 @@ static const struct address_space_operations btrfs_aops = { ...@@ -10137,6 +10146,7 @@ static const struct address_space_operations btrfs_aops = {
.writepages = btrfs_writepages, .writepages = btrfs_writepages,
.readahead = btrfs_readahead, .readahead = btrfs_readahead,
.invalidate_folio = btrfs_invalidate_folio, .invalidate_folio = btrfs_invalidate_folio,
.launder_folio = btrfs_launder_folio,
.release_folio = btrfs_release_folio, .release_folio = btrfs_release_folio,
.migrate_folio = btrfs_migrate_folio, .migrate_folio = btrfs_migrate_folio,
.dirty_folio = filemap_dirty_folio, .dirty_folio = filemap_dirty_folio,
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
struct root_name_map { struct root_name_map {
u64 id; u64 id;
char name[16]; const char *name;
}; };
static const struct root_name_map root_map[] = { static const struct root_name_map root_map[] = {
......
...@@ -1648,14 +1648,20 @@ static void scrub_reset_stripe(struct scrub_stripe *stripe) ...@@ -1648,14 +1648,20 @@ static void scrub_reset_stripe(struct scrub_stripe *stripe)
} }
} }
static u32 stripe_length(const struct scrub_stripe *stripe)
{
ASSERT(stripe->bg);
return min(BTRFS_STRIPE_LEN,
stripe->bg->start + stripe->bg->length - stripe->logical);
}
static void scrub_submit_extent_sector_read(struct scrub_ctx *sctx, static void scrub_submit_extent_sector_read(struct scrub_ctx *sctx,
struct scrub_stripe *stripe) struct scrub_stripe *stripe)
{ {
struct btrfs_fs_info *fs_info = stripe->bg->fs_info; struct btrfs_fs_info *fs_info = stripe->bg->fs_info;
struct btrfs_bio *bbio = NULL; struct btrfs_bio *bbio = NULL;
unsigned int nr_sectors = min(BTRFS_STRIPE_LEN, stripe->bg->start + unsigned int nr_sectors = stripe_length(stripe) >> fs_info->sectorsize_bits;
stripe->bg->length - stripe->logical) >>
fs_info->sectorsize_bits;
u64 stripe_len = BTRFS_STRIPE_LEN; u64 stripe_len = BTRFS_STRIPE_LEN;
int mirror = stripe->mirror_num; int mirror = stripe->mirror_num;
int i; int i;
...@@ -1729,9 +1735,7 @@ static void scrub_submit_initial_read(struct scrub_ctx *sctx, ...@@ -1729,9 +1735,7 @@ static void scrub_submit_initial_read(struct scrub_ctx *sctx,
{ {
struct btrfs_fs_info *fs_info = sctx->fs_info; struct btrfs_fs_info *fs_info = sctx->fs_info;
struct btrfs_bio *bbio; struct btrfs_bio *bbio;
unsigned int nr_sectors = min(BTRFS_STRIPE_LEN, stripe->bg->start + unsigned int nr_sectors = stripe_length(stripe) >> fs_info->sectorsize_bits;
stripe->bg->length - stripe->logical) >>
fs_info->sectorsize_bits;
int mirror = stripe->mirror_num; int mirror = stripe->mirror_num;
ASSERT(stripe->bg); ASSERT(stripe->bg);
...@@ -1871,6 +1875,9 @@ static int flush_scrub_stripes(struct scrub_ctx *sctx) ...@@ -1871,6 +1875,9 @@ static int flush_scrub_stripes(struct scrub_ctx *sctx)
stripe = &sctx->stripes[i]; stripe = &sctx->stripes[i];
wait_scrub_stripe_io(stripe); wait_scrub_stripe_io(stripe);
spin_lock(&sctx->stat_lock);
sctx->stat.last_physical = stripe->physical + stripe_length(stripe);
spin_unlock(&sctx->stat_lock);
scrub_reset_stripe(stripe); scrub_reset_stripe(stripe);
} }
out: out:
...@@ -2139,7 +2146,9 @@ static int scrub_simple_mirror(struct scrub_ctx *sctx, ...@@ -2139,7 +2146,9 @@ static int scrub_simple_mirror(struct scrub_ctx *sctx,
cur_physical, &found_logical); cur_physical, &found_logical);
if (ret > 0) { if (ret > 0) {
/* No more extent, just update the accounting */ /* No more extent, just update the accounting */
spin_lock(&sctx->stat_lock);
sctx->stat.last_physical = physical + logical_length; sctx->stat.last_physical = physical + logical_length;
spin_unlock(&sctx->stat_lock);
ret = 0; ret = 0;
break; break;
} }
...@@ -2336,6 +2345,10 @@ static noinline_for_stack int scrub_stripe(struct scrub_ctx *sctx, ...@@ -2336,6 +2345,10 @@ static noinline_for_stack int scrub_stripe(struct scrub_ctx *sctx,
stripe_logical += chunk_logical; stripe_logical += chunk_logical;
ret = scrub_raid56_parity_stripe(sctx, scrub_dev, bg, ret = scrub_raid56_parity_stripe(sctx, scrub_dev, bg,
map, stripe_logical); map, stripe_logical);
spin_lock(&sctx->stat_lock);
sctx->stat.last_physical = min(physical + BTRFS_STRIPE_LEN,
physical_end);
spin_unlock(&sctx->stat_lock);
if (ret) if (ret)
goto out; goto out;
goto next; goto next;
......
...@@ -683,8 +683,11 @@ bool btrfs_check_options(const struct btrfs_fs_info *info, ...@@ -683,8 +683,11 @@ bool btrfs_check_options(const struct btrfs_fs_info *info,
ret = false; ret = false;
if (!test_bit(BTRFS_FS_STATE_REMOUNTING, &info->fs_state)) { if (!test_bit(BTRFS_FS_STATE_REMOUNTING, &info->fs_state)) {
if (btrfs_raw_test_opt(*mount_opt, SPACE_CACHE)) if (btrfs_raw_test_opt(*mount_opt, SPACE_CACHE)) {
btrfs_info(info, "disk space caching is enabled"); btrfs_info(info, "disk space caching is enabled");
btrfs_warn(info,
"space cache v1 is being deprecated and will be removed in a future release, please use -o space_cache=v2");
}
if (btrfs_raw_test_opt(*mount_opt, FREE_SPACE_TREE)) if (btrfs_raw_test_opt(*mount_opt, FREE_SPACE_TREE))
btrfs_info(info, "using free-space-tree"); btrfs_info(info, "using free-space-tree");
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment