lets avoid hacks with data copy from fiemap buffer to kernel
space by using an ldiskfs_map_blocks directly.
It might code lots clear.
Fixes:
5cd5a49c7213 ("LU-16321 osd: Allow fiemap on kernel buffers")
HPe-bug-id: LUS-11645
Signed-off-by: Alexey Lyashkov <alexey.lyashkov@hpe.com>
Change-Id: I1c527ce653b8943801e5bf56fd172a5f05e22dfc
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/51146
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Alexander Zarochentsev <alexander.zarochentsev@hpe.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
};
#define osd_dirty_inode(inode, flag) (inode)->i_sb->s_op->dirty_inode((inode), flag)
};
#define osd_dirty_inode(inode, flag) (inode)->i_sb->s_op->dirty_inode((inode), flag)
+#define osd_i_blocks(inode, size) ((size) >> (inode)->i_blkbits)
+
#ifdef HAVE_INODE_TIMESPEC64
# define osd_timespec timespec64
#ifdef HAVE_INODE_TIMESPEC64
# define osd_timespec timespec64
-struct osd_fextent {
- sector_t start;
- sector_t end;
- __u32 flags;
- unsigned int mapped:1;
-};
-
-#define DECLARE_MM_SEGMENT_T(name) mm_segment_t name
+#define DECLARE_MM_SEGMENT_T(name) mm_segment_t name
#define access_set_kernel(saved_fs, fei) \
do { \
saved_fs = get_fs(); \
set_fs(KERNEL_DS); \
} while (0)
#define access_set_kernel(saved_fs, fei) \
do { \
saved_fs = get_fs(); \
set_fs(KERNEL_DS); \
} while (0)
-#define access_unset_kernel(saved_fs, fei) set_fs((saved_fs))
+#define access_unset_kernel(saved_fs, fei) set_fs((saved_fs))
#else
#define DECLARE_MM_SEGMENT_T(name)
#define access_set_kernel(saved_fs, fei) \
#else
#define DECLARE_MM_SEGMENT_T(name)
#define access_set_kernel(saved_fs, fei) \
#endif /* KERNEL_DS */
static int osd_is_mapped(struct dt_object *dt, __u64 offset,
#endif /* KERNEL_DS */
static int osd_is_mapped(struct dt_object *dt, __u64 offset,
- struct osd_fextent *cached_extent)
+ struct ldiskfs_map_blocks *map)
{
struct inode *inode = osd_dt_obj(dt)->oo_inode;
{
struct inode *inode = osd_dt_obj(dt)->oo_inode;
- sector_t block = offset >> inode->i_blkbits;
- sector_t start;
- struct fiemap_extent_info fei = { 0 };
- struct fiemap_extent fe = { 0 };
- int rc;
- DECLARE_MM_SEGMENT_T(saved_fs);
-
- if (block >= cached_extent->start && block < cached_extent->end)
- return cached_extent->mapped;
+ int mapped;
+ sector_t block = osd_i_blocks(inode, offset);
+ sector_t end;
if (i_size_read(inode) == 0)
return 0;
/* Beyond EOF, must not be mapped */
if (i_size_read(inode) == 0)
return 0;
/* Beyond EOF, must not be mapped */
- if (((i_size_read(inode) - 1) >> inode->i_blkbits) < block)
+ if ((i_size_read(inode) - 1) < offset)
- fei.fi_extents_max = 1;
- fei.fi_extents_start = &fe;
- access_set_kernel(saved_fs, &fei);
- rc = inode->i_op->fiemap(inode, &fei, offset, FIEMAP_MAX_OFFSET-offset);
- access_unset_kernel(saved_fs, &fei);
- if (rc != 0)
- return 0;
+ end = map->m_lblk + map->m_len;
+ if (block >= map->m_lblk && block < end)
+ return map->m_flags & LDISKFS_MAP_MAPPED;
- start = fe.fe_logical >> inode->i_blkbits;
- cached_extent->flags = fe.fe_flags;
- if (fei.fi_extents_mapped == 0) {
- /* a special case - no extent found at this offset and forward.
- * we can consider this as a hole to EOF. it's safe to cache
- * as other threads can not allocate/punch blocks this thread
- * is working on (LDLM). */
- cached_extent->start = block;
- cached_extent->end = i_size_read(inode) >> inode->i_blkbits;
- cached_extent->mapped = 0;
- return 0;
- }
+ map->m_lblk = block;
+ map->m_len = INT_MAX;
- if (start > block) {
- cached_extent->start = block;
- cached_extent->end = start;
- cached_extent->mapped = 0;
- } else {
- cached_extent->start = start;
- cached_extent->end = (fe.fe_logical + fe.fe_length) >>
- inode->i_blkbits;
- cached_extent->mapped = 1;
+ mapped = ldiskfs_map_blocks(NULL, inode, map, 0);
+ if (mapped < 0) {
+ map->m_len = 0;
+ return 0;
- return cached_extent->mapped;
+ return map->m_flags & LDISKFS_MAP_MAPPED;
}
#define MAX_EXTENTS_PER_WRITE 100
}
#define MAX_EXTENTS_PER_WRITE 100
int rc = 0;
int credits = 0;
long long quota_space = 0;
int rc = 0;
int credits = 0;
long long quota_space = 0;
- struct osd_fextent mapped = { 0 }, extent = { 0 };
+ struct ldiskfs_map_blocks map;
enum osd_quota_local_flags local_flags = 0;
enum osd_qid_declare_flags declare_flags = OSD_QID_BLK;
unsigned int extent_bytes;
enum osd_quota_local_flags local_flags = 0;
enum osd_qid_declare_flags declare_flags = OSD_QID_BLK;
unsigned int extent_bytes;
+ loff_t extent_start = 0;
+ loff_t extent_end = 0;
ENTRY;
LASSERT(handle != NULL);
ENTRY;
LASSERT(handle != NULL);
* Convert unwritten extent might need split extents, could
* not skip it.
*/
* Convert unwritten extent might need split extents, could
* not skip it.
*/
- if (osd_is_mapped(dt, lnb[i].lnb_file_offset, &mapped) &&
- !(mapped.flags & FIEMAP_EXTENT_UNWRITTEN)) {
+ if (osd_is_mapped(dt, lnb[i].lnb_file_offset, &map) &&
+ !(map.m_flags & LDISKFS_MAP_UNWRITTEN)) {
lnb[i].lnb_flags |= OBD_BRW_MAPPED;
continue;
}
lnb[i].lnb_flags |= OBD_BRW_MAPPED;
continue;
}
/* count only unmapped changes */
new_blocks++;
/* count only unmapped changes */
new_blocks++;
- if (lnb[i].lnb_file_offset != extent.end || extent.end == 0) {
- if (extent.end != 0)
- extents += (extent.end - extent.start +
+ if (lnb[i].lnb_file_offset != extent_end || extent_end == 0) {
+ if (extent_end != 0)
+ extents += (extent_end - extent_start +
extent_bytes - 1) / extent_bytes;
extent_bytes - 1) / extent_bytes;
- extent.start = lnb[i].lnb_file_offset;
- extent.end = lnb[i].lnb_file_offset + lnb[i].lnb_len;
+ extent_start = lnb[i].lnb_file_offset;
+ extent_end = lnb[i].lnb_file_offset + lnb[i].lnb_len;
- extent.end += lnb[i].lnb_len;
+ extent_end += lnb[i].lnb_len;
}
quota_space += PAGE_SIZE;
}
quota_space += PAGE_SIZE;
* overwrite case, no need to modify tree and
* allocate blocks.
*/
* overwrite case, no need to modify tree and
* allocate blocks.
*/
- extents += (extent.end - extent.start +
+ extents += (extent_end - extent_start +
extent_bytes - 1) / extent_bytes;
/**
* with system space usage growing up, mballoc codes won't
extent_bytes - 1) / extent_bytes;
/**
* with system space usage growing up, mballoc codes won't
- boff = start >> inode->i_blkbits;
- blen = (ALIGN(end, 1 << inode->i_blkbits) >> inode->i_blkbits) - boff;
+ boff = osd_i_blocks(inode, start);
+ blen = osd_i_blocks(inode, ALIGN(end, 1 << inode->i_blkbits)) - boff;
/* Create and mark new extents as either zero or unwritten */
flags = (osd_dev(dt->do_lu.lo_dev)->od_fallocate_zero_blocks ||
/* Create and mark new extents as either zero or unwritten */
flags = (osd_dev(dt->do_lu.lo_dev)->od_fallocate_zero_blocks ||