@@ -1279,7 +1279,7 @@ struct btrfs_fs_info {
struct btrfs_block_rsv empty_block_rsv;
atomic64_t generation;
- u64 last_trans_committed;
+ atomic64_t last_trans_committed;
/*
* this is updated to the current trans every time a full commit
@@ -2502,7 +2502,7 @@ retry_root_backup:
}
atomic64_set(&fs_info->generation, generation);
- fs_info->last_trans_committed = generation;
+ atomic64_set(&fs_info->last_trans_committed, generation);
ret = btrfs_recover_balance(fs_info);
if (ret) {
@@ -1683,7 +1683,7 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
if (btrfs_inode_in_log(inode,
atomic64_read(&root->fs_info->generation)) ||
BTRFS_I(inode)->last_trans <=
- root->fs_info->last_trans_committed) {
+ atomic64_read(&root->fs_info->last_trans_committed)) {
BTRFS_I(inode)->last_trans = 0;
/*
@@ -3110,7 +3110,7 @@ static noinline long btrfs_ioctl_start_sync(struct btrfs_root *root,
return PTR_ERR(trans);
/* No running transaction, don't bother */
- transid = root->fs_info->last_trans_committed;
+ transid = atomic64_read(&root->fs_info->last_trans_committed);
goto out;
}
transid = trans->transid;
@@ -975,7 +975,7 @@ void btrfs_add_ordered_operation(struct btrfs_trans_handle *trans,
* if this file hasn't been changed since the last transaction
* commit, we can safely return without doing anything
*/
- if (last_mod < root->fs_info->last_trans_committed)
+ if (last_mod < atomic64_read(&root->fs_info->last_trans_committed))
return;
spin_lock(&root->fs_info->ordered_extent_lock);
@@ -2703,7 +2703,7 @@ static noinline_for_stack int scrub_supers(struct scrub_ctx *sctx,
if (root->fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR)
return -EIO;
- gen = root->fs_info->last_trans_committed;
+ gen = atomic64_read(&root->fs_info->last_trans_committed);
for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) {
bytenr = btrfs_sb_offset(i);
@@ -459,7 +459,8 @@ int btrfs_wait_for_commit(struct btrfs_root *root, u64 transid)
int ret = 0;
if (transid) {
- if (transid <= root->fs_info->last_trans_committed)
+ if (transid <=
+ atomic64_read(&root->fs_info->last_trans_committed))
goto out;
ret = -EINVAL;
@@ -1713,7 +1714,7 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans,
cur_trans->commit_done = 1;
- root->fs_info->last_trans_committed = cur_trans->transid;
+ atomic64_set(&root->fs_info->last_trans_committed, cur_trans->transid);
wake_up(&cur_trans->commit_wait);
@@ -3392,7 +3392,7 @@ static int btrfs_log_changed_extents(struct btrfs_trans_handle *trans,
INIT_LIST_HEAD(&extents);
write_lock(&tree->lock);
- test_gen = root->fs_info->last_trans_committed;
+ test_gen = atomic64_read(&root->fs_info->last_trans_committed);
list_for_each_entry_safe(em, n, &tree->modified_extents, list) {
list_del_init(&em->list);
@@ -3496,7 +3496,8 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,
/* Only run delayed items if we are a dir or a new file */
if (S_ISDIR(inode->i_mode) ||
- BTRFS_I(inode)->generation > root->fs_info->last_trans_committed) {
+ BTRFS_I(inode)->generation >
+ atomic64_read(&root->fs_info->last_trans_committed)) {
ret = btrfs_commit_inode_delayed_items(trans, inode);
if (ret) {
btrfs_free_path(path);
@@ -3738,7 +3739,8 @@ int btrfs_log_inode_parent(struct btrfs_trans_handle *trans,
struct super_block *sb;
struct dentry *old_parent = NULL;
int ret = 0;
- u64 last_committed = root->fs_info->last_trans_committed;
+ u64 last_committed = atomic64_read(
+ &root->fs_info->last_trans_committed);
sb = inode->i_sb;
@@ -3748,7 +3750,7 @@ int btrfs_log_inode_parent(struct btrfs_trans_handle *trans,
}
if (root->fs_info->last_trans_log_full_commit >
- root->fs_info->last_trans_committed) {
+ atomic64_read(&root->fs_info->last_trans_committed)) {
ret = 1;
goto end_no_trans;
}
@@ -3800,7 +3802,7 @@ int btrfs_log_inode_parent(struct btrfs_trans_handle *trans,
break;
if (BTRFS_I(inode)->generation >
- root->fs_info->last_trans_committed) {
+ atomic64_read(&root->fs_info->last_trans_committed)) {
ret = btrfs_log_inode(trans, root, inode, inode_only);
if (ret)
goto end_trans;
@@ -4063,9 +4065,9 @@ int btrfs_log_new_name(struct btrfs_trans_handle *trans,
* from hasn't been logged, we don't need to log it
*/
if (BTRFS_I(inode)->logged_trans <=
- root->fs_info->last_trans_committed &&
+ atomic64_read(&root->fs_info->last_trans_committed) &&
(!old_dir || BTRFS_I(old_dir)->logged_trans <=
- root->fs_info->last_trans_committed))
+ atomic64_read(&root->fs_info->last_trans_committed)))
return 0;
return btrfs_log_inode_parent(trans, root, inode, parent, 1);