mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
btrfs: move fiemap code into its own file
Currently the core of the fiemap code lives in extent_io.c, which does not make any sense because it's not related to extent IO at all (and it was not as well before the big rewrite of fiemap I did some time ago). The entry point for fiemap, btrfs_fiemap(), lives in inode.c since it's an inode operation. Since there's a significant amount of fiemap code, move all of it into a dedicated file, including its entry point inode.c:btrfs_fiemap(). Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: Filipe Manana <fdmanana@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
committed by
David Sterba
parent
f9763e4d15
commit
8996f61ab9
@@ -33,7 +33,7 @@ btrfs-y += super.o ctree.o extent-tree.o print-tree.o root-tree.o dir-item.o \
|
||||
uuid-tree.o props.o free-space-tree.o tree-checker.o space-info.o \
|
||||
block-rsv.o delalloc-space.o block-group.o discard.o reflink.o \
|
||||
subpage.o tree-mod-log.o extent-io-tree.o fs.o messages.o bio.o \
|
||||
lru_cache.o raid-stripe-tree.o
|
||||
lru_cache.o raid-stripe-tree.o fiemap.o
|
||||
|
||||
btrfs-$(CONFIG_BTRFS_FS_POSIX_ACL) += acl.o
|
||||
btrfs-$(CONFIG_BTRFS_FS_REF_VERIFY) += ref-verify.o
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -242,8 +242,6 @@ int btrfs_writepages(struct address_space *mapping, struct writeback_control *wb
|
||||
int btree_write_cache_pages(struct address_space *mapping,
|
||||
struct writeback_control *wbc);
|
||||
void btrfs_readahead(struct readahead_control *rac);
|
||||
int extent_fiemap(struct btrfs_inode *inode, struct fiemap_extent_info *fieinfo,
|
||||
u64 start, u64 len);
|
||||
int set_folio_extent_mapped(struct folio *folio);
|
||||
int set_page_extent_mapped(struct page *page);
|
||||
void clear_page_extent_mapped(struct page *page);
|
||||
|
||||
930
fs/btrfs/fiemap.c
Normal file
930
fs/btrfs/fiemap.c
Normal file
File diff suppressed because it is too large
Load Diff
11
fs/btrfs/fiemap.h
Normal file
11
fs/btrfs/fiemap.h
Normal file
@@ -0,0 +1,11 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
#ifndef BTRFS_FIEMAP_H
|
||||
#define BTRFS_FIEMAP_H
|
||||
|
||||
#include <linux/fiemap.h>
|
||||
|
||||
int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
||||
u64 start, u64 len);
|
||||
|
||||
#endif /* BTRFS_FIEMAP_H */
|
||||
@@ -70,6 +70,7 @@
|
||||
#include "orphan.h"
|
||||
#include "backref.h"
|
||||
#include "raid-stripe-tree.h"
|
||||
#include "fiemap.h"
|
||||
|
||||
struct btrfs_iget_args {
|
||||
u64 ino;
|
||||
@@ -7929,57 +7930,6 @@ struct iomap_dio *btrfs_dio_write(struct kiocb *iocb, struct iov_iter *iter,
|
||||
IOMAP_DIO_PARTIAL, &data, done_before);
|
||||
}
|
||||
|
||||
static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
||||
u64 start, u64 len)
|
||||
{
|
||||
struct btrfs_inode *btrfs_inode = BTRFS_I(inode);
|
||||
int ret;
|
||||
|
||||
ret = fiemap_prep(inode, fieinfo, start, &len, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* fiemap_prep() called filemap_write_and_wait() for the whole possible
|
||||
* file range (0 to LLONG_MAX), but that is not enough if we have
|
||||
* compression enabled. The first filemap_fdatawrite_range() only kicks
|
||||
* in the compression of data (in an async thread) and will return
|
||||
* before the compression is done and writeback is started. A second
|
||||
* filemap_fdatawrite_range() is needed to wait for the compression to
|
||||
* complete and writeback to start. We also need to wait for ordered
|
||||
* extents to complete, because our fiemap implementation uses mainly
|
||||
* file extent items to list the extents, searching for extent maps
|
||||
* only for file ranges with holes or prealloc extents to figure out
|
||||
* if we have delalloc in those ranges.
|
||||
*/
|
||||
if (fieinfo->fi_flags & FIEMAP_FLAG_SYNC) {
|
||||
ret = btrfs_wait_ordered_range(btrfs_inode, 0, LLONG_MAX);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
btrfs_inode_lock(btrfs_inode, BTRFS_ILOCK_SHARED);
|
||||
|
||||
/*
|
||||
* We did an initial flush to avoid holding the inode's lock while
|
||||
* triggering writeback and waiting for the completion of IO and ordered
|
||||
* extents. Now after we locked the inode we do it again, because it's
|
||||
* possible a new write may have happened in between those two steps.
|
||||
*/
|
||||
if (fieinfo->fi_flags & FIEMAP_FLAG_SYNC) {
|
||||
ret = btrfs_wait_ordered_range(btrfs_inode, 0, LLONG_MAX);
|
||||
if (ret) {
|
||||
btrfs_inode_unlock(btrfs_inode, BTRFS_ILOCK_SHARED);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
ret = extent_fiemap(btrfs_inode, fieinfo, start, len);
|
||||
btrfs_inode_unlock(btrfs_inode, BTRFS_ILOCK_SHARED);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* For release_folio() and invalidate_folio() we have a race window where
|
||||
* folio_end_writeback() is called but the subpage spinlock is not yet released.
|
||||
|
||||
Reference in New Issue
Block a user