|
@@ -3805,6 +3805,7 @@ static noinline int check_parent_dirs_for_sync(struct btrfs_trans_handle *trans,
|
|
|
int ret = 0;
|
|
|
struct btrfs_root *root;
|
|
|
struct dentry *old_parent = NULL;
|
|
|
+ struct inode *orig_inode = inode;
|
|
|
|
|
|
/*
|
|
|
* for regular files, if its inode is already on disk, we don't
|
|
@@ -3824,7 +3825,14 @@ static noinline int check_parent_dirs_for_sync(struct btrfs_trans_handle *trans,
|
|
|
}
|
|
|
|
|
|
while (1) {
|
|
|
- BTRFS_I(inode)->logged_trans = trans->transid;
|
|
|
+ /*
|
|
|
+ * If we are logging a directory then we start with our inode,
|
|
|
+ * not our parents inode, so we need to skipp setting the
|
|
|
+ * logged_trans so that further down in the log code we don't
|
|
|
+ * think this inode has already been logged.
|
|
|
+ */
|
|
|
+ if (inode != orig_inode)
|
|
|
+ BTRFS_I(inode)->logged_trans = trans->transid;
|
|
|
smp_mb();
|
|
|
|
|
|
if (BTRFS_I(inode)->last_unlink_trans > last_committed) {
|