Commit b98b6767a0f6f9baa1d00eff64a43d58412ecdeb
Committed by
Chris Mason
1 parent
c31f8830f0
Exists in
master
and in
7 other branches
Btrfs: Add inode flags support
This patch adds NODATASUM & NODATACOW inode flags support. Signed-off-by: Chris Mason <chris.mason@oracle.com>
Showing 3 changed files with 24 additions and 14 deletions Side-by-side Diff
fs/btrfs/btrfs_inode.h
fs/btrfs/ctree.h
... | ... | @@ -447,7 +447,18 @@ |
447 | 447 | #define btrfs_set_opt(o, opt) ((o) |= BTRFS_MOUNT_##opt) |
448 | 448 | #define btrfs_test_opt(root, opt) ((root)->fs_info->mount_opt & \ |
449 | 449 | BTRFS_MOUNT_##opt) |
450 | +/* | |
451 | + * Inode flags | |
452 | + */ | |
453 | +#define BTRFS_INODE_NODATASUM 0x1 | |
454 | +#define BTRFS_INODE_NODATACOW 0x2 | |
450 | 455 | |
456 | +#define btrfs_clear_flag(inode, flag) (BTRFS_I(inode)->flags &= \ | |
457 | + ~BTRFS_INODE_##flag) | |
458 | +#define btrfs_set_flag(inode, flag) (BTRFS_I(inode)->flags |= \ | |
459 | + BTRFS_INODE_##flag) | |
460 | +#define btrfs_test_flag(inode, flag) (BTRFS_I(inode)->flags & \ | |
461 | + BTRFS_INODE_##flag) | |
451 | 462 | /* some macros to generate set/get funcs for the struct fields. This |
452 | 463 | * assumes there is a lefoo_to_cpu for every type, so lets make a simple |
453 | 464 | * one for u8: |
fs/btrfs/inode.c
... | ... | @@ -243,9 +243,9 @@ |
243 | 243 | struct btrfs_root *root = BTRFS_I(inode)->root; |
244 | 244 | u64 num_bytes; |
245 | 245 | int ret; |
246 | - | |
247 | 246 | mutex_lock(&root->fs_info->fs_mutex); |
248 | - if (btrfs_test_opt(root, NODATACOW)) | |
247 | + if (btrfs_test_opt(root, NODATACOW) || | |
248 | + btrfs_test_flag(inode, NODATACOW)) | |
249 | 249 | ret = run_delalloc_nocow(inode, start, end); |
250 | 250 | else |
251 | 251 | ret = cow_file_range(inode, start, end); |
252 | 252 | |
... | ... | @@ -273,10 +273,9 @@ |
273 | 273 | int ret = 0; |
274 | 274 | u64 page_start = (u64)page->index << PAGE_CACHE_SHIFT; |
275 | 275 | size_t offset = start - page_start; |
276 | - | |
277 | - if (btrfs_test_opt(root, NODATASUM)) | |
276 | + if (btrfs_test_opt(root, NODATASUM) || | |
277 | + btrfs_test_flag(inode, NODATASUM)) | |
278 | 278 | return 0; |
279 | - | |
280 | 279 | mutex_lock(&root->fs_info->fs_mutex); |
281 | 280 | trans = btrfs_start_transaction(root, 1); |
282 | 281 | btrfs_set_trans_block_group(trans, inode); |
283 | 282 | |
... | ... | @@ -299,10 +298,9 @@ |
299 | 298 | struct btrfs_csum_item *item; |
300 | 299 | struct btrfs_path *path = NULL; |
301 | 300 | u32 csum; |
302 | - | |
303 | - if (btrfs_test_opt(root, NODATASUM)) | |
301 | + if (btrfs_test_opt(root, NODATASUM) || | |
302 | + btrfs_test_flag(inode, NODATASUM)) | |
304 | 303 | return 0; |
305 | - | |
306 | 304 | mutex_lock(&root->fs_info->fs_mutex); |
307 | 305 | path = btrfs_alloc_path(); |
308 | 306 | item = btrfs_lookup_csum(NULL, root, path, inode->i_ino, start, 0); |
309 | 307 | |
... | ... | @@ -335,10 +333,9 @@ |
335 | 333 | struct btrfs_root *root = BTRFS_I(inode)->root; |
336 | 334 | u32 csum = ~(u32)0; |
337 | 335 | unsigned long flags; |
338 | - | |
339 | - if (btrfs_test_opt(root, NODATASUM)) | |
336 | + if (btrfs_test_opt(root, NODATASUM) || | |
337 | + btrfs_test_flag(inode, NODATASUM)) | |
340 | 338 | return 0; |
341 | - | |
342 | 339 | ret = get_state_private(em_tree, start, &private); |
343 | 340 | local_irq_save(flags); |
344 | 341 | kaddr = kmap_atomic(page, KM_IRQ0); |
... | ... | @@ -415,7 +412,7 @@ |
415 | 412 | alloc_group_block = btrfs_inode_block_group(leaf, inode_item); |
416 | 413 | BTRFS_I(inode)->block_group = btrfs_lookup_block_group(root->fs_info, |
417 | 414 | alloc_group_block); |
418 | - | |
415 | + BTRFS_I(inode)->flags = btrfs_inode_flags(leaf, inode_item); | |
419 | 416 | if (!BTRFS_I(inode)->block_group) { |
420 | 417 | BTRFS_I(inode)->block_group = btrfs_find_block_group(root, |
421 | 418 | NULL, 0, 0, 0); |
... | ... | @@ -484,6 +481,7 @@ |
484 | 481 | btrfs_set_inode_nblocks(leaf, item, inode->i_blocks); |
485 | 482 | btrfs_set_inode_generation(leaf, item, inode->i_generation); |
486 | 483 | btrfs_set_inode_rdev(leaf, item, inode->i_rdev); |
484 | + btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags); | |
487 | 485 | btrfs_set_inode_block_group(leaf, item, |
488 | 486 | BTRFS_I(inode)->block_group->key.objectid); |
489 | 487 | } |
... | ... | @@ -1454,7 +1452,7 @@ |
1454 | 1452 | owner = 1; |
1455 | 1453 | group = btrfs_find_block_group(root, group, 0, 0, owner); |
1456 | 1454 | BTRFS_I(inode)->block_group = group; |
1457 | - | |
1455 | + BTRFS_I(inode)->flags = 0; | |
1458 | 1456 | ret = btrfs_insert_empty_inode(trans, root, path, objectid); |
1459 | 1457 | if (ret) |
1460 | 1458 | goto fail; |