|
@@ -124,6 +124,35 @@ xfs_iozero(
|
|
|
return (-status);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Fsync operations on directories are much simpler than on regular files,
|
|
|
+ * as there is no file data to flush, and thus also no need for explicit
|
|
|
+ * cache flush operations, and there are no non-transaction metadata updates
|
|
|
+ * on directories either.
|
|
|
+ */
|
|
|
+STATIC int
|
|
|
+xfs_dir_fsync(
|
|
|
+ struct file *file,
|
|
|
+ loff_t start,
|
|
|
+ loff_t end,
|
|
|
+ int datasync)
|
|
|
+{
|
|
|
+ struct xfs_inode *ip = XFS_I(file->f_mapping->host);
|
|
|
+ struct xfs_mount *mp = ip->i_mount;
|
|
|
+ xfs_lsn_t lsn = 0;
|
|
|
+
|
|
|
+ trace_xfs_dir_fsync(ip);
|
|
|
+
|
|
|
+ xfs_ilock(ip, XFS_ILOCK_SHARED);
|
|
|
+ if (xfs_ipincount(ip))
|
|
|
+ lsn = ip->i_itemp->ili_last_lsn;
|
|
|
+ xfs_iunlock(ip, XFS_ILOCK_SHARED);
|
|
|
+
|
|
|
+ if (!lsn)
|
|
|
+ return 0;
|
|
|
+ return _xfs_log_force_lsn(mp, lsn, XFS_LOG_SYNC, NULL);
|
|
|
+}
|
|
|
+
|
|
|
STATIC int
|
|
|
xfs_file_fsync(
|
|
|
struct file *file,
|
|
@@ -1140,7 +1169,7 @@ const struct file_operations xfs_dir_file_operations = {
|
|
|
#ifdef CONFIG_COMPAT
|
|
|
.compat_ioctl = xfs_file_compat_ioctl,
|
|
|
#endif
|
|
|
- .fsync = xfs_file_fsync,
|
|
|
+ .fsync = xfs_dir_fsync,
|
|
|
};
|
|
|
|
|
|
static const struct vm_operations_struct xfs_file_vm_ops = {
|