diff options
Diffstat (limited to 'fs/btrfs')
-rw-r--r-- | fs/btrfs/btrfs_inode.h | 3 | ||||
-rw-r--r-- | fs/btrfs/delayed-inode.c | 10 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 25 |
3 files changed, 36 insertions, 2 deletions
diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h index 4aadadcfab20..de5e4f2adfea 100644 --- a/fs/btrfs/btrfs_inode.h +++ b/fs/btrfs/btrfs_inode.h | |||
@@ -185,6 +185,9 @@ struct btrfs_inode { | |||
185 | 185 | ||
186 | struct btrfs_delayed_node *delayed_node; | 186 | struct btrfs_delayed_node *delayed_node; |
187 | 187 | ||
188 | /* File creation time. */ | ||
189 | struct timespec i_otime; | ||
190 | |||
188 | struct inode vfs_inode; | 191 | struct inode vfs_inode; |
189 | }; | 192 | }; |
190 | 193 | ||
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c index 116eb4bed8d3..82f0c7c95474 100644 --- a/fs/btrfs/delayed-inode.c +++ b/fs/btrfs/delayed-inode.c | |||
@@ -1769,6 +1769,11 @@ static void fill_stack_inode_item(struct btrfs_trans_handle *trans, | |||
1769 | inode->i_ctime.tv_sec); | 1769 | inode->i_ctime.tv_sec); |
1770 | btrfs_set_stack_timespec_nsec(&inode_item->ctime, | 1770 | btrfs_set_stack_timespec_nsec(&inode_item->ctime, |
1771 | inode->i_ctime.tv_nsec); | 1771 | inode->i_ctime.tv_nsec); |
1772 | |||
1773 | btrfs_set_stack_timespec_sec(&inode_item->otime, | ||
1774 | BTRFS_I(inode)->i_otime.tv_sec); | ||
1775 | btrfs_set_stack_timespec_nsec(&inode_item->otime, | ||
1776 | BTRFS_I(inode)->i_otime.tv_nsec); | ||
1772 | } | 1777 | } |
1773 | 1778 | ||
1774 | int btrfs_fill_inode(struct inode *inode, u32 *rdev) | 1779 | int btrfs_fill_inode(struct inode *inode, u32 *rdev) |
@@ -1810,6 +1815,11 @@ int btrfs_fill_inode(struct inode *inode, u32 *rdev) | |||
1810 | inode->i_ctime.tv_sec = btrfs_stack_timespec_sec(&inode_item->ctime); | 1815 | inode->i_ctime.tv_sec = btrfs_stack_timespec_sec(&inode_item->ctime); |
1811 | inode->i_ctime.tv_nsec = btrfs_stack_timespec_nsec(&inode_item->ctime); | 1816 | inode->i_ctime.tv_nsec = btrfs_stack_timespec_nsec(&inode_item->ctime); |
1812 | 1817 | ||
1818 | BTRFS_I(inode)->i_otime.tv_sec = | ||
1819 | btrfs_stack_timespec_sec(&inode_item->otime); | ||
1820 | BTRFS_I(inode)->i_otime.tv_nsec = | ||
1821 | btrfs_stack_timespec_nsec(&inode_item->otime); | ||
1822 | |||
1813 | inode->i_generation = BTRFS_I(inode)->generation; | 1823 | inode->i_generation = BTRFS_I(inode)->generation; |
1814 | BTRFS_I(inode)->index_cnt = (u64)-1; | 1824 | BTRFS_I(inode)->index_cnt = (u64)-1; |
1815 | 1825 | ||
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 575164d802af..b0292333fd84 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -3535,6 +3535,11 @@ static void btrfs_read_locked_inode(struct inode *inode) | |||
3535 | inode->i_ctime.tv_sec = btrfs_timespec_sec(leaf, &inode_item->ctime); | 3535 | inode->i_ctime.tv_sec = btrfs_timespec_sec(leaf, &inode_item->ctime); |
3536 | inode->i_ctime.tv_nsec = btrfs_timespec_nsec(leaf, &inode_item->ctime); | 3536 | inode->i_ctime.tv_nsec = btrfs_timespec_nsec(leaf, &inode_item->ctime); |
3537 | 3537 | ||
3538 | BTRFS_I(inode)->i_otime.tv_sec = | ||
3539 | btrfs_timespec_sec(leaf, &inode_item->otime); | ||
3540 | BTRFS_I(inode)->i_otime.tv_nsec = | ||
3541 | btrfs_timespec_nsec(leaf, &inode_item->otime); | ||
3542 | |||
3538 | inode_set_bytes(inode, btrfs_inode_nbytes(leaf, inode_item)); | 3543 | inode_set_bytes(inode, btrfs_inode_nbytes(leaf, inode_item)); |
3539 | BTRFS_I(inode)->generation = btrfs_inode_generation(leaf, inode_item); | 3544 | BTRFS_I(inode)->generation = btrfs_inode_generation(leaf, inode_item); |
3540 | BTRFS_I(inode)->last_trans = btrfs_inode_transid(leaf, inode_item); | 3545 | BTRFS_I(inode)->last_trans = btrfs_inode_transid(leaf, inode_item); |
@@ -3669,6 +3674,11 @@ static void fill_inode_item(struct btrfs_trans_handle *trans, | |||
3669 | btrfs_set_token_timespec_nsec(leaf, &item->ctime, | 3674 | btrfs_set_token_timespec_nsec(leaf, &item->ctime, |
3670 | inode->i_ctime.tv_nsec, &token); | 3675 | inode->i_ctime.tv_nsec, &token); |
3671 | 3676 | ||
3677 | btrfs_set_token_timespec_sec(leaf, &item->otime, | ||
3678 | BTRFS_I(inode)->i_otime.tv_sec, &token); | ||
3679 | btrfs_set_token_timespec_nsec(leaf, &item->otime, | ||
3680 | BTRFS_I(inode)->i_otime.tv_nsec, &token); | ||
3681 | |||
3672 | btrfs_set_token_inode_nbytes(leaf, item, inode_get_bytes(inode), | 3682 | btrfs_set_token_inode_nbytes(leaf, item, inode_get_bytes(inode), |
3673 | &token); | 3683 | &token); |
3674 | btrfs_set_token_inode_generation(leaf, item, BTRFS_I(inode)->generation, | 3684 | btrfs_set_token_inode_generation(leaf, item, BTRFS_I(inode)->generation, |
@@ -5260,7 +5270,10 @@ static struct inode *new_simple_dir(struct super_block *s, | |||
5260 | inode->i_op = &btrfs_dir_ro_inode_operations; | 5270 | inode->i_op = &btrfs_dir_ro_inode_operations; |
5261 | inode->i_fop = &simple_dir_operations; | 5271 | inode->i_fop = &simple_dir_operations; |
5262 | inode->i_mode = S_IFDIR | S_IRUGO | S_IWUSR | S_IXUGO; | 5272 | inode->i_mode = S_IFDIR | S_IRUGO | S_IWUSR | S_IXUGO; |
5263 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; | 5273 | inode->i_mtime = CURRENT_TIME; |
5274 | inode->i_atime = inode->i_mtime; | ||
5275 | inode->i_ctime = inode->i_mtime; | ||
5276 | BTRFS_I(inode)->i_otime = inode->i_mtime; | ||
5264 | 5277 | ||
5265 | return inode; | 5278 | return inode; |
5266 | } | 5279 | } |
@@ -5828,7 +5841,12 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
5828 | 5841 | ||
5829 | inode_init_owner(inode, dir, mode); | 5842 | inode_init_owner(inode, dir, mode); |
5830 | inode_set_bytes(inode, 0); | 5843 | inode_set_bytes(inode, 0); |
5831 | inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; | 5844 | |
5845 | inode->i_mtime = CURRENT_TIME; | ||
5846 | inode->i_atime = inode->i_mtime; | ||
5847 | inode->i_ctime = inode->i_mtime; | ||
5848 | BTRFS_I(inode)->i_otime = inode->i_mtime; | ||
5849 | |||
5832 | inode_item = btrfs_item_ptr(path->nodes[0], path->slots[0], | 5850 | inode_item = btrfs_item_ptr(path->nodes[0], path->slots[0], |
5833 | struct btrfs_inode_item); | 5851 | struct btrfs_inode_item); |
5834 | memset_extent_buffer(path->nodes[0], 0, (unsigned long)inode_item, | 5852 | memset_extent_buffer(path->nodes[0], 0, (unsigned long)inode_item, |
@@ -8577,6 +8595,9 @@ struct inode *btrfs_alloc_inode(struct super_block *sb) | |||
8577 | 8595 | ||
8578 | ei->delayed_node = NULL; | 8596 | ei->delayed_node = NULL; |
8579 | 8597 | ||
8598 | ei->i_otime.tv_sec = 0; | ||
8599 | ei->i_otime.tv_nsec = 0; | ||
8600 | |||
8580 | inode = &ei->vfs_inode; | 8601 | inode = &ei->vfs_inode; |
8581 | extent_map_tree_init(&ei->extent_tree); | 8602 | extent_map_tree_init(&ei->extent_tree); |
8582 | extent_io_tree_init(&ei->io_tree, &inode->i_data); | 8603 | extent_io_tree_init(&ei->io_tree, &inode->i_data); |