diff options
| -rw-r--r-- | fs/btrfs/tree-log.c | 127 |
1 files changed, 73 insertions, 54 deletions
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 72444811d275..83186c7e45d4 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
| @@ -2952,33 +2952,9 @@ static void fill_inode_item(struct btrfs_trans_handle *trans, | |||
| 2952 | struct btrfs_inode_item *item, | 2952 | struct btrfs_inode_item *item, |
| 2953 | struct inode *inode, int log_inode_only) | 2953 | struct inode *inode, int log_inode_only) |
| 2954 | { | 2954 | { |
| 2955 | btrfs_set_inode_uid(leaf, item, i_uid_read(inode)); | 2955 | struct btrfs_map_token token; |
| 2956 | btrfs_set_inode_gid(leaf, item, i_gid_read(inode)); | 2956 | |
| 2957 | btrfs_set_inode_mode(leaf, item, inode->i_mode); | 2957 | btrfs_init_map_token(&token); |
| 2958 | btrfs_set_inode_nlink(leaf, item, inode->i_nlink); | ||
| 2959 | |||
| 2960 | btrfs_set_timespec_sec(leaf, btrfs_inode_atime(item), | ||
| 2961 | inode->i_atime.tv_sec); | ||
| 2962 | btrfs_set_timespec_nsec(leaf, btrfs_inode_atime(item), | ||
| 2963 | inode->i_atime.tv_nsec); | ||
| 2964 | |||
| 2965 | btrfs_set_timespec_sec(leaf, btrfs_inode_mtime(item), | ||
| 2966 | inode->i_mtime.tv_sec); | ||
| 2967 | btrfs_set_timespec_nsec(leaf, btrfs_inode_mtime(item), | ||
| 2968 | inode->i_mtime.tv_nsec); | ||
| 2969 | |||
| 2970 | btrfs_set_timespec_sec(leaf, btrfs_inode_ctime(item), | ||
| 2971 | inode->i_ctime.tv_sec); | ||
| 2972 | btrfs_set_timespec_nsec(leaf, btrfs_inode_ctime(item), | ||
| 2973 | inode->i_ctime.tv_nsec); | ||
| 2974 | |||
| 2975 | btrfs_set_inode_nbytes(leaf, item, inode_get_bytes(inode)); | ||
| 2976 | |||
| 2977 | btrfs_set_inode_sequence(leaf, item, inode->i_version); | ||
| 2978 | btrfs_set_inode_transid(leaf, item, trans->transid); | ||
| 2979 | btrfs_set_inode_rdev(leaf, item, inode->i_rdev); | ||
| 2980 | btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags); | ||
| 2981 | btrfs_set_inode_block_group(leaf, item, 0); | ||
| 2982 | 2958 | ||
| 2983 | if (log_inode_only) { | 2959 | if (log_inode_only) { |
| 2984 | /* set the generation to zero so the recover code | 2960 | /* set the generation to zero so the recover code |
| @@ -2986,14 +2962,43 @@ static void fill_inode_item(struct btrfs_trans_handle *trans, | |||
| 2986 | * just to say 'this inode exists' and a logging | 2962 | * just to say 'this inode exists' and a logging |
| 2987 | * to say 'update this inode with these values' | 2963 | * to say 'update this inode with these values' |
| 2988 | */ | 2964 | */ |
| 2989 | btrfs_set_inode_generation(leaf, item, 0); | 2965 | btrfs_set_token_inode_generation(leaf, item, 0, &token); |
| 2990 | btrfs_set_inode_size(leaf, item, 0); | 2966 | btrfs_set_token_inode_size(leaf, item, 0, &token); |
| 2991 | } else { | 2967 | } else { |
| 2992 | btrfs_set_inode_generation(leaf, item, | 2968 | btrfs_set_token_inode_generation(leaf, item, |
| 2993 | BTRFS_I(inode)->generation); | 2969 | BTRFS_I(inode)->generation, |
| 2994 | btrfs_set_inode_size(leaf, item, inode->i_size); | 2970 | &token); |
| 2995 | } | 2971 | btrfs_set_token_inode_size(leaf, item, inode->i_size, &token); |
| 2996 | 2972 | } | |
| 2973 | |||
| 2974 | btrfs_set_token_inode_uid(leaf, item, i_uid_read(inode), &token); | ||
| 2975 | btrfs_set_token_inode_gid(leaf, item, i_gid_read(inode), &token); | ||
| 2976 | btrfs_set_token_inode_mode(leaf, item, inode->i_mode, &token); | ||
| 2977 | btrfs_set_token_inode_nlink(leaf, item, inode->i_nlink, &token); | ||
| 2978 | |||
| 2979 | btrfs_set_token_timespec_sec(leaf, btrfs_inode_atime(item), | ||
| 2980 | inode->i_atime.tv_sec, &token); | ||
| 2981 | btrfs_set_token_timespec_nsec(leaf, btrfs_inode_atime(item), | ||
| 2982 | inode->i_atime.tv_nsec, &token); | ||
| 2983 | |||
| 2984 | btrfs_set_token_timespec_sec(leaf, btrfs_inode_mtime(item), | ||
| 2985 | inode->i_mtime.tv_sec, &token); | ||
| 2986 | btrfs_set_token_timespec_nsec(leaf, btrfs_inode_mtime(item), | ||
| 2987 | inode->i_mtime.tv_nsec, &token); | ||
| 2988 | |||
| 2989 | btrfs_set_token_timespec_sec(leaf, btrfs_inode_ctime(item), | ||
| 2990 | inode->i_ctime.tv_sec, &token); | ||
| 2991 | btrfs_set_token_timespec_nsec(leaf, btrfs_inode_ctime(item), | ||
| 2992 | inode->i_ctime.tv_nsec, &token); | ||
| 2993 | |||
| 2994 | btrfs_set_token_inode_nbytes(leaf, item, inode_get_bytes(inode), | ||
| 2995 | &token); | ||
| 2996 | |||
| 2997 | btrfs_set_token_inode_sequence(leaf, item, inode->i_version, &token); | ||
| 2998 | btrfs_set_token_inode_transid(leaf, item, trans->transid, &token); | ||
| 2999 | btrfs_set_token_inode_rdev(leaf, item, inode->i_rdev, &token); | ||
| 3000 | btrfs_set_token_inode_flags(leaf, item, BTRFS_I(inode)->flags, &token); | ||
| 3001 | btrfs_set_token_inode_block_group(leaf, item, 0, &token); | ||
| 2997 | } | 3002 | } |
| 2998 | 3003 | ||
| 2999 | static int log_inode_item(struct btrfs_trans_handle *trans, | 3004 | static int log_inode_item(struct btrfs_trans_handle *trans, |
| @@ -3267,6 +3272,7 @@ static int log_one_extent(struct btrfs_trans_handle *trans, | |||
| 3267 | struct btrfs_file_extent_item *fi; | 3272 | struct btrfs_file_extent_item *fi; |
| 3268 | struct extent_buffer *leaf; | 3273 | struct extent_buffer *leaf; |
| 3269 | struct list_head ordered_sums; | 3274 | struct list_head ordered_sums; |
| 3275 | struct btrfs_map_token token; | ||
| 3270 | struct btrfs_key key; | 3276 | struct btrfs_key key; |
| 3271 | u64 csum_offset = em->mod_start - em->start; | 3277 | u64 csum_offset = em->mod_start - em->start; |
| 3272 | u64 csum_len = em->mod_len; | 3278 | u64 csum_len = em->mod_len; |
| @@ -3276,6 +3282,7 @@ static int log_one_extent(struct btrfs_trans_handle *trans, | |||
| 3276 | bool skip_csum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; | 3282 | bool skip_csum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; |
| 3277 | 3283 | ||
| 3278 | INIT_LIST_HEAD(&ordered_sums); | 3284 | INIT_LIST_HEAD(&ordered_sums); |
| 3285 | btrfs_init_map_token(&token); | ||
| 3279 | key.objectid = btrfs_ino(inode); | 3286 | key.objectid = btrfs_ino(inode); |
| 3280 | key.type = BTRFS_EXTENT_DATA_KEY; | 3287 | key.type = BTRFS_EXTENT_DATA_KEY; |
| 3281 | key.offset = em->start; | 3288 | key.offset = em->start; |
| @@ -3289,37 +3296,49 @@ static int log_one_extent(struct btrfs_trans_handle *trans, | |||
| 3289 | leaf = path->nodes[0]; | 3296 | leaf = path->nodes[0]; |
| 3290 | fi = btrfs_item_ptr(leaf, path->slots[0], | 3297 | fi = btrfs_item_ptr(leaf, path->slots[0], |
| 3291 | struct btrfs_file_extent_item); | 3298 | struct btrfs_file_extent_item); |
| 3292 | btrfs_set_file_extent_generation(leaf, fi, em->generation); | 3299 | btrfs_set_token_file_extent_generation(leaf, fi, em->generation, |
| 3300 | &token); | ||
| 3293 | if (test_bit(EXTENT_FLAG_PREALLOC, &em->flags)) { | 3301 | if (test_bit(EXTENT_FLAG_PREALLOC, &em->flags)) { |
| 3294 | skip_csum = true; | 3302 | skip_csum = true; |
| 3295 | btrfs_set_file_extent_type(leaf, fi, | 3303 | btrfs_set_token_file_extent_type(leaf, fi, |
| 3296 | BTRFS_FILE_EXTENT_PREALLOC); | 3304 | BTRFS_FILE_EXTENT_PREALLOC, |
| 3305 | &token); | ||
| 3297 | } else { | 3306 | } else { |
| 3298 | btrfs_set_file_extent_type(leaf, fi, BTRFS_FILE_EXTENT_REG); | 3307 | btrfs_set_token_file_extent_type(leaf, fi, |
| 3308 | BTRFS_FILE_EXTENT_REG, | ||
| 3309 | &token); | ||
| 3299 | if (em->block_start == 0) | 3310 | if (em->block_start == 0) |
| 3300 | skip_csum = true; | 3311 | skip_csum = true; |
| 3301 | } | 3312 | } |
| 3302 | 3313 | ||
| 3303 | block_len = max(em->block_len, em->orig_block_len); | 3314 | block_len = max(em->block_len, em->orig_block_len); |
| 3304 | if (em->compress_type != BTRFS_COMPRESS_NONE) { | 3315 | if (em->compress_type != BTRFS_COMPRESS_NONE) { |
| 3305 | btrfs_set_file_extent_disk_bytenr(leaf, fi, em->block_start); | 3316 | btrfs_set_token_file_extent_disk_bytenr(leaf, fi, |
| 3306 | btrfs_set_file_extent_disk_num_bytes(leaf, fi, block_len); | 3317 | em->block_start, |
| 3318 | &token); | ||
| 3319 | btrfs_set_token_file_extent_disk_num_bytes(leaf, fi, block_len, | ||
| 3320 | &token); | ||
| 3307 | } else if (em->block_start < EXTENT_MAP_LAST_BYTE) { | 3321 | } else if (em->block_start < EXTENT_MAP_LAST_BYTE) { |
| 3308 | btrfs_set_file_extent_disk_bytenr(leaf, fi, | 3322 | btrfs_set_token_file_extent_disk_bytenr(leaf, fi, |
| 3309 | em->block_start - | 3323 | em->block_start - |
| 3310 | extent_offset); | 3324 | extent_offset, &token); |
| 3311 | btrfs_set_file_extent_disk_num_bytes(leaf, fi, block_len); | 3325 | btrfs_set_token_file_extent_disk_num_bytes(leaf, fi, block_len, |
| 3326 | &token); | ||
| 3312 | } else { | 3327 | } else { |
| 3313 | btrfs_set_file_extent_disk_bytenr(leaf, fi, 0); | 3328 | btrfs_set_token_file_extent_disk_bytenr(leaf, fi, 0, &token); |
| 3314 | btrfs_set_file_extent_disk_num_bytes(leaf, fi, 0); | 3329 | btrfs_set_token_file_extent_disk_num_bytes(leaf, fi, 0, |
| 3315 | } | 3330 | &token); |
| 3316 | 3331 | } | |
| 3317 | btrfs_set_file_extent_offset(leaf, fi, em->start - em->orig_start); | 3332 | |
| 3318 | btrfs_set_file_extent_num_bytes(leaf, fi, em->len); | 3333 | btrfs_set_token_file_extent_offset(leaf, fi, |
| 3319 | btrfs_set_file_extent_ram_bytes(leaf, fi, em->len); | 3334 | em->start - em->orig_start, |
| 3320 | btrfs_set_file_extent_compression(leaf, fi, em->compress_type); | 3335 | &token); |
| 3321 | btrfs_set_file_extent_encryption(leaf, fi, 0); | 3336 | btrfs_set_token_file_extent_num_bytes(leaf, fi, em->len, &token); |
| 3322 | btrfs_set_file_extent_other_encoding(leaf, fi, 0); | 3337 | btrfs_set_token_file_extent_ram_bytes(leaf, fi, em->len, &token); |
| 3338 | btrfs_set_token_file_extent_compression(leaf, fi, em->compress_type, | ||
| 3339 | &token); | ||
| 3340 | btrfs_set_token_file_extent_encryption(leaf, fi, 0, &token); | ||
| 3341 | btrfs_set_token_file_extent_other_encoding(leaf, fi, 0, &token); | ||
| 3323 | btrfs_mark_buffer_dirty(leaf); | 3342 | btrfs_mark_buffer_dirty(leaf); |
| 3324 | 3343 | ||
| 3325 | /* | 3344 | /* |
