])
])
+#
+# 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_FUNC_MS_FLOCK_LOCK
# 2.6.22
LC_INVALIDATE_BDEV_2ARG
+ LC_FS_RENAME_DOES_D_MOVE
# 2.6.23
LC_UNREGISTER_BLKDEV_RETURN_INT
LC_KERNEL_SPLICE_READ
#define ll_invalidate_bdev(a,b) invalidate_bdev((a))
#endif
+#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
+
#endif /* __KERNEL__ */
#endif /* _COMPAT25_H */
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, &old_dentry->d_name, new_dir,
- &new_dentry->d_name);
+ int err;
+ err = ll_rename_generic(old_dir, &old_dentry->d_name, new_dir,
+ &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;
}
#endif
.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,
};
#else