Merge tag 'for-4.16-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux
Pull btrfs updates from David Sterba: "Features or user visible changes: - fallocate: implement zero range mode - avoid losing data raid profile when deleting a device - tree item checker: more checks for directory items and xattrs Notable fixes: - raid56 recovery: don't use cached stripes, that could be potentially changed and a later RMW or recovery would lead to corruptions or failures - let raid56 try harder to rebuild damaged data, reading from all stripes if necessary - fix scrub to repair raid56 in a similar way as in the case above Other: - cleanups: device freeing, removed some call indirections, redundant bio_put/_get, unused parameters, refactorings and renames - RCU list traversal fixups - simplify mount callchain, remove recursing back when mounting a subvolume - plug for fsync, may improve bio merging on multiple devices - compression heurisic: replace heap sort with radix sort, gains some performance - add extent map selftests, buffered write vs dio" * tag 'for-4.16-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux: (155 commits) btrfs: drop devid as device_list_add() arg btrfs: get device pointer from device_list_add() btrfs: set the total_devices in device_list_add() btrfs: move pr_info into device_list_add btrfs: make btrfs_free_stale_devices() to match the path btrfs: rename btrfs_free_stale_devices() arg to skip_dev btrfs: make btrfs_free_stale_devices() argument optional btrfs: make btrfs_free_stale_device() to iterate all stales btrfs: no need to check for btrfs_fs_devices::seeding btrfs: Use IS_ALIGNED in btrfs_truncate_block instead of opencoding it Btrfs: noinline merge_extent_mapping Btrfs: add WARN_ONCE to detect unexpected error from merge_extent_mapping Btrfs: extent map selftest: dio write vs dio read Btrfs: extent map selftest: buffered write vs dio read Btrfs: add extent map selftests Btrfs: move extent map specific code to extent_map.c Btrfs: add helper for em merge logic Btrfs: fix unexpected EEXIST from btrfs_get_extent Btrfs: fix incorrect block_len in merge_extent_mapping btrfs: Remove unused readahead spinlock ...
This commit is contained in:
@@ -1174,19 +1174,15 @@ next:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int extref_get_fields(struct extent_buffer *eb, int slot,
|
||||
unsigned long ref_ptr, u32 *namelen, char **name,
|
||||
u64 *index, u64 *parent_objectid)
|
||||
static int extref_get_fields(struct extent_buffer *eb, unsigned long ref_ptr,
|
||||
u32 *namelen, char **name, u64 *index,
|
||||
u64 *parent_objectid)
|
||||
{
|
||||
struct btrfs_inode_extref *extref;
|
||||
|
||||
extref = (struct btrfs_inode_extref *)ref_ptr;
|
||||
|
||||
*namelen = btrfs_inode_extref_name_len(eb, extref);
|
||||
if (!btrfs_is_name_len_valid(eb, slot, (unsigned long)&extref->name,
|
||||
*namelen))
|
||||
return -EIO;
|
||||
|
||||
*name = kmalloc(*namelen, GFP_NOFS);
|
||||
if (*name == NULL)
|
||||
return -ENOMEM;
|
||||
@@ -1201,19 +1197,14 @@ static int extref_get_fields(struct extent_buffer *eb, int slot,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ref_get_fields(struct extent_buffer *eb, int slot,
|
||||
unsigned long ref_ptr, u32 *namelen, char **name,
|
||||
u64 *index)
|
||||
static int ref_get_fields(struct extent_buffer *eb, unsigned long ref_ptr,
|
||||
u32 *namelen, char **name, u64 *index)
|
||||
{
|
||||
struct btrfs_inode_ref *ref;
|
||||
|
||||
ref = (struct btrfs_inode_ref *)ref_ptr;
|
||||
|
||||
*namelen = btrfs_inode_ref_name_len(eb, ref);
|
||||
if (!btrfs_is_name_len_valid(eb, slot, (unsigned long)(ref + 1),
|
||||
*namelen))
|
||||
return -EIO;
|
||||
|
||||
*name = kmalloc(*namelen, GFP_NOFS);
|
||||
if (*name == NULL)
|
||||
return -ENOMEM;
|
||||
@@ -1288,8 +1279,8 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans,
|
||||
|
||||
while (ref_ptr < ref_end) {
|
||||
if (log_ref_ver) {
|
||||
ret = extref_get_fields(eb, slot, ref_ptr, &namelen,
|
||||
&name, &ref_index, &parent_objectid);
|
||||
ret = extref_get_fields(eb, ref_ptr, &namelen, &name,
|
||||
&ref_index, &parent_objectid);
|
||||
/*
|
||||
* parent object can change from one array
|
||||
* item to another.
|
||||
@@ -1301,8 +1292,8 @@ static noinline int add_inode_ref(struct btrfs_trans_handle *trans,
|
||||
goto out;
|
||||
}
|
||||
} else {
|
||||
ret = ref_get_fields(eb, slot, ref_ptr, &namelen,
|
||||
&name, &ref_index);
|
||||
ret = ref_get_fields(eb, ref_ptr, &namelen, &name,
|
||||
&ref_index);
|
||||
}
|
||||
if (ret)
|
||||
goto out;
|
||||
@@ -1836,7 +1827,6 @@ static noinline int replay_one_dir_item(struct btrfs_trans_handle *trans,
|
||||
struct extent_buffer *eb, int slot,
|
||||
struct btrfs_key *key)
|
||||
{
|
||||
struct btrfs_fs_info *fs_info = root->fs_info;
|
||||
int ret = 0;
|
||||
u32 item_size = btrfs_item_size_nr(eb, slot);
|
||||
struct btrfs_dir_item *di;
|
||||
@@ -1849,8 +1839,6 @@ static noinline int replay_one_dir_item(struct btrfs_trans_handle *trans,
|
||||
ptr_end = ptr + item_size;
|
||||
while (ptr < ptr_end) {
|
||||
di = (struct btrfs_dir_item *)ptr;
|
||||
if (verify_dir_item(fs_info, eb, slot, di))
|
||||
return -EIO;
|
||||
name_len = btrfs_dir_name_len(eb, di);
|
||||
ret = replay_one_name(trans, root, path, eb, di, key);
|
||||
if (ret < 0)
|
||||
@@ -2025,11 +2013,6 @@ again:
|
||||
ptr_end = ptr + item_size;
|
||||
while (ptr < ptr_end) {
|
||||
di = (struct btrfs_dir_item *)ptr;
|
||||
if (verify_dir_item(fs_info, eb, slot, di)) {
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
name_len = btrfs_dir_name_len(eb, di);
|
||||
name = kmalloc(name_len, GFP_NOFS);
|
||||
if (!name) {
|
||||
@@ -2110,7 +2093,6 @@ static int replay_xattr_deletes(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_path *path,
|
||||
const u64 ino)
|
||||
{
|
||||
struct btrfs_fs_info *fs_info = root->fs_info;
|
||||
struct btrfs_key search_key;
|
||||
struct btrfs_path *log_path;
|
||||
int i;
|
||||
@@ -2152,11 +2134,6 @@ process_leaf:
|
||||
u32 this_len = sizeof(*di) + name_len + data_len;
|
||||
char *name;
|
||||
|
||||
ret = verify_dir_item(fs_info, path->nodes[0], i, di);
|
||||
if (ret) {
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
name = kmalloc(name_len, GFP_NOFS);
|
||||
if (!name) {
|
||||
ret = -ENOMEM;
|
||||
@@ -4574,12 +4551,6 @@ static int btrfs_check_ref_name_override(struct extent_buffer *eb,
|
||||
this_len = sizeof(*extref) + this_name_len;
|
||||
}
|
||||
|
||||
ret = btrfs_is_name_len_valid(eb, slot, name_ptr,
|
||||
this_name_len);
|
||||
if (!ret) {
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
if (this_name_len > name_len) {
|
||||
char *new_name;
|
||||
|
||||
@@ -5434,11 +5405,10 @@ static int btrfs_log_inode_parent(struct btrfs_trans_handle *trans,
|
||||
struct dentry *parent,
|
||||
const loff_t start,
|
||||
const loff_t end,
|
||||
int exists_only,
|
||||
int inode_only,
|
||||
struct btrfs_log_ctx *ctx)
|
||||
{
|
||||
struct btrfs_fs_info *fs_info = root->fs_info;
|
||||
int inode_only = exists_only ? LOG_INODE_EXISTS : LOG_INODE_ALL;
|
||||
struct super_block *sb;
|
||||
struct dentry *old_parent = NULL;
|
||||
int ret = 0;
|
||||
@@ -5604,7 +5574,7 @@ int btrfs_log_dentry_safe(struct btrfs_trans_handle *trans,
|
||||
int ret;
|
||||
|
||||
ret = btrfs_log_inode_parent(trans, root, BTRFS_I(d_inode(dentry)),
|
||||
parent, start, end, 0, ctx);
|
||||
parent, start, end, LOG_INODE_ALL, ctx);
|
||||
dput(parent);
|
||||
|
||||
return ret;
|
||||
@@ -5867,6 +5837,6 @@ int btrfs_log_new_name(struct btrfs_trans_handle *trans,
|
||||
return 0;
|
||||
|
||||
return btrfs_log_inode_parent(trans, root, inode, parent, 0,
|
||||
LLONG_MAX, 1, NULL);
|
||||
LLONG_MAX, LOG_INODE_EXISTS, NULL);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user