From bad49e39e301d4367eaead5ee566f5dcacfde8f6 Mon Sep 17 00:00:00 2001 From: Alex Zhuravlev Date: Mon, 13 Jul 2015 15:04:08 +0300 Subject: [PATCH] LU-6096 ldiskfs: mark dir's inode dirty mark directory's inode dirty in ldiskfs_add_dot_dotdot() as ldiskfs_init_new_dir() doesn't do this internally. otherwise, the attributes set by ldiskfs_append() aren't transferred to the buffer cache. Change-Id: Ice93b75e291736f83c0d9b1047f7a627fef0141e Signed-off-by: Alex Zhuravlev Reviewed-on: http://review.whamcloud.com/15581 Tested-by: Jenkins Reviewed-by: Bob Glossman Tested-by: Maloo Reviewed-by: Yang Sheng Reviewed-by: Oleg Drokin --- .../patches/rhel7/ext4-data-in-dirent.patch | 53 +++++++++++++--------- .../patches/rhel7/ext4-osd-iop-common.patch | 28 +----------- lustre/osd-ldiskfs/osd_handler.c | 10 +--- 3 files changed, 35 insertions(+), 56 deletions(-) diff --git a/ldiskfs/kernel_patches/patches/rhel7/ext4-data-in-dirent.patch b/ldiskfs/kernel_patches/patches/rhel7/ext4-data-in-dirent.patch index 26b1e78..1910145 100644 --- a/ldiskfs/kernel_patches/patches/rhel7/ext4-data-in-dirent.patch +++ b/ldiskfs/kernel_patches/patches/rhel7/ext4-data-in-dirent.patch @@ -183,11 +183,11 @@ Index: linux-3.10.0-123.13.2.el7.x86_64/fs/ext4/ext4.h } /* fsync.c */ -@@ -2157,7 +2206,7 @@ extern struct buffer_head * ext4_find_en - struct ext4_dir_entry_2 ** res_dir, - int *inlined); - extern int ext4_add_dot_dotdot(handle_t *handle, struct inode *dir, -- struct inode *inode); +@@ -2157,6 +2206,8 @@ extern struct buffer_head * ext4_find_en + extern int ext4_delete_entry(handle_t *handle, struct inode * dir, + struct ext4_dir_entry_2 *de_del, + struct buffer_head *bh); ++extern int ext4_add_dot_dotdot(handle_t *handle, struct inode *dir, + struct inode *inode, const void *, const void *); extern int search_dir(struct buffer_head *bh, char *search_buf, @@ -605,25 +605,36 @@ Index: linux-3.10.0-123.13.2.el7.x86_64/fs/ext4/namei.c set_nlink(inode, 2); if (csum_size) { t = EXT4_DIRENT_TAIL(dir_block->b_data, blocksize); -@@ -2508,7 +2597,8 @@ out: - /* Initialize @inode as a subdirectory of @dir, and add the - * "." and ".." entries into the first directory block. */ - int ext4_add_dot_dotdot(handle_t *handle, struct inode *dir, -- struct inode *inode) +@@ -2402,6 +2426,29 @@ out: + return err; + } + ++/* Initialize @inode as a subdirectory of @dir, and add the ++ * "." and ".." entries into the first directory block. */ ++int ext4_add_dot_dotdot(handle_t *handle, struct inode *dir, + struct inode *inode, + const void *data1, const void *data2) ++{ ++ int rc; ++ ++ if (IS_ERR(handle)) ++ return PTR_ERR(handle); ++ ++ if (IS_DIRSYNC(dir)) ++ ext4_handle_sync(handle); ++ ++ inode->i_op = &ext4_dir_inode_operations.ops; ++ inode->i_fop = &ext4_dir_operations; ++ rc = ext4_init_new_dir(handle, dir, inode, data1, data2); ++ if (!rc) ++ rc = ext4_mark_inode_dirty(handle, inode); ++ return rc; ++} ++EXPORT_SYMBOL(ext4_add_dot_dotdot); ++ + static int ext4_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) { - if (IS_ERR(handle)) - return PTR_ERR(handle); -@@ -2518,7 +2608,7 @@ int ext4_add_dot_dotdot(handle_t *handle - - inode->i_op = &ext4_dir_inode_operations; - inode->i_fop = &ext4_dir_operations; -- return ext4_init_new_dir(handle, dir, inode); -+ return ext4_init_new_dir(handle, dir, inode, data1, data2); - } - EXPORT_SYMBOL(ext4_add_dot_dotdot); - + handle_t *handle; @@ -2546,7 +2636,7 @@ retry: inode->i_op = &ext4_dir_inode_operations; diff --git a/ldiskfs/kernel_patches/patches/rhel7/ext4-osd-iop-common.patch b/ldiskfs/kernel_patches/patches/rhel7/ext4-osd-iop-common.patch index ddbe93d..5f9f11c 100644 --- a/ldiskfs/kernel_patches/patches/rhel7/ext4-osd-iop-common.patch +++ b/ldiskfs/kernel_patches/patches/rhel7/ext4-osd-iop-common.patch @@ -2,7 +2,7 @@ Index: linux-3.10.0-123.13.2.el7.x86_64/fs/ext4/ext4.h =================================================================== --- linux-3.10.0-123.13.2.el7.x86_64.orig/fs/ext4/ext4.h +++ linux-3.10.0-123.13.2.el7.x86_64/fs/ext4/ext4.h -@@ -2145,6 +2145,13 @@ extern int ext4_orphan_add(handle_t *, s +@@ -2145,6 +2145,11 @@ extern int ext4_orphan_add(handle_t *, s extern int ext4_orphan_del(handle_t *, struct inode *); extern int ext4_htree_fill_tree(struct file *dir_file, __u32 start_hash, __u32 start_minor_hash, __u32 *next_hash); @@ -11,8 +11,6 @@ Index: linux-3.10.0-123.13.2.el7.x86_64/fs/ext4/ext4.h +extern int ext4_delete_entry(handle_t *handle, struct inode * dir, + struct ext4_dir_entry_2 *de_del, + struct buffer_head *bh); -+extern int ext4_add_dot_dotdot(handle_t *handle, struct inode *dir, -+ struct inode *inode); extern int search_dir(struct buffer_head *bh, char *search_buf, int buf_size, @@ -67,27 +65,3 @@ Index: linux-3.10.0-123.13.2.el7.x86_64/fs/ext4/namei.c /* * By the time this is called, we already have created * the directory cache entry for the new file, but it -@@ -2402,6 +2426,23 @@ out: - return err; - } - -+/* Initialize @inode as a subdirectory of @dir, and add the -+ * "." and ".." entries into the first directory block. */ -+int ext4_add_dot_dotdot(handle_t *handle, struct inode *dir, -+ struct inode *inode) -+{ -+ if (IS_ERR(handle)) -+ return PTR_ERR(handle); -+ -+ if (IS_DIRSYNC(dir)) -+ ext4_handle_sync(handle); -+ -+ inode->i_op = &ext4_dir_inode_operations.ops; -+ inode->i_fop = &ext4_dir_operations; -+ return ext4_init_new_dir(handle, dir, inode); -+} -+EXPORT_SYMBOL(ext4_add_dot_dotdot); -+ - static int ext4_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) - { - handle_t *handle; diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c index aa8b281..41b79fd 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -2497,8 +2497,9 @@ static int osd_add_dot_dotdot_internal(struct osd_thread_info *info, dot_ldp = (struct ldiskfs_dentry_param *)info->oti_ldp; dot_ldp->edp_magic = 0; + return ldiskfs_add_dot_dotdot(oth->ot_handle, parent_dir, - dir, dot_ldp, dot_dot_ldp); + dir, dot_ldp, dot_dot_ldp); } /** @@ -3838,13 +3839,6 @@ static int osd_add_dot_dotdot(struct osd_thread_info *info, dir->oo_compat_dotdot_created = 1; } - /* ldiskfs_init_new_dir() doesn't call ldiskfs_mark_inode_dirty() - * this seem as an optimization as usually it's called - * later to refresh mtime of the parent. Lustre does not - * update mtime in few cases (e.g. PENDING, .lustre) - * we still need to transfer i_size/etc to the buffer cache */ - ldiskfs_mark_inode_dirty(oth->ot_handle, dir->oo_inode); - return result; } -- 1.8.3.1