Commit b98b6767a0f6f9baa1d00eff64a43d58412ecdeb

Authored by Yan
Committed by Chris Mason
1 parent c31f8830f0

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
... ... @@ -34,6 +34,7 @@
34 34 * transid of the trans_handle that last modified this inode
35 35 */
36 36 u64 last_trans;
  37 + u32 flags;
37 38 };
38 39 static inline struct btrfs_inode *BTRFS_I(struct inode *inode)
39 40 {
... ... @@ -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:
... ... @@ -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;