])
])
+#
+# check for FS_RENAME_DOES_D_MOVE flag
+#
+AC_DEFUN([LC_FS_RENAME_DOES_D_MOVE],
+[AC_MSG_CHECKING([if kernel has FS_RENAME_DOES_D_MOVE flag])
+LB_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+],[
+ int v = FS_RENAME_DOES_D_MOVE;
+],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE(HAVE_FS_RENAME_DOES_D_MOVE, 1, [kernel has FS_RENAME_DOES_D_MOVE flag])
+],[
+ AC_MSG_RESULT([no])
+])
+])
#
# LC_PROG_LINUX
# 2.6.22
LC_INVALIDATE_BDEV_2ARG
LC_ASYNC_BLOCK_CIPHER
+ LC_FS_RENAME_DOES_D_MOVE
# 2.6.23
LC_UNREGISTER_BLKDEV_RETURN_INT
LC_KERNEL_SPLICE_READ
#define ll_nr_free_buffer_pages() nr_free_buffer_pages()
#endif
-#ifdef FS_ODD_RENAME
-#define FS_RENAME_DOES_D_MOVE FS_ODD_RENAME
+#ifdef HAVE_FS_RENAME_DOES_D_MOVE
+#define LL_RENAME_DOES_D_MOVE FS_RENAME_DOES_D_MOVE
+#else
+#define LL_RENAME_DOES_D_MOVE FS_ODD_RENAME
#endif
/* add a lustre compatible layer for crypto API */
cfs_module_get();
- sb->s_type->fs_flags |= FS_RENAME_DOES_D_MOVE;
/* client additional sb info */
lsi->lsi_llsbi = sbi = ll_init_sbi();
if (!sbi) {
static int ll_rename(struct inode *old_dir, struct dentry *old_dentry,
struct inode *new_dir, struct dentry *new_dentry)
{
- return ll_rename_generic(old_dir, NULL,
+ int err;
+ err = ll_rename_generic(old_dir, NULL,
old_dentry, &old_dentry->d_name,
new_dir, NULL, new_dentry,
&new_dentry->d_name);
+ if (!err) {
+#ifndef HAVE_FS_RENAME_DOES_D_MOVE
+ if (!S_ISDIR(old_dentry->d_inode->i_mode))
+#endif
+ d_move(old_dentry, new_dentry);
+ }
+ return err;
}
struct inode_operations ll_dir_inode_operations = {
.name = "lustre",
.get_sb = lustre_get_sb,
.kill_sb = lustre_kill_super,
- .fs_flags = FS_BINARY_MOUNTDATA | FS_REQUIRES_DEV,
+ .fs_flags = FS_BINARY_MOUNTDATA | FS_REQUIRES_DEV |
+ LL_RENAME_DOES_D_MOVE,
};
int lustre_register_fs(void)