Skip to content

Commit

Permalink
orangefs: avoid fsync service operation on flush
Browse files Browse the repository at this point in the history
Without this, an fsync call is sent to the server even if no data
changed.  This resulted in a rather severe (50%) performance regression
under certain metadata-heavy workloads.

In the past, everything was direct IO.  Nothing happend on a close call.
An explicit fsync call would send an fsync request to the server which
in turn fsynced the underlying file.

Now there are cached writes.  Then fsync began writing out dirty pages
in addition to making an fsync request to the server, and close began
calling fsync.

With this commit, close only writes out dirty pages, and does not make
the fsync request.

Signed-off-by: Martin Brandenburg <[email protected]>
Signed-off-by: Mike Marshall <[email protected]>
  • Loading branch information
Martin Brandenburg authored and hubcapsc committed May 3, 2019
1 parent 8a88bbc commit 90fc070
Showing 1 changed file with 23 additions and 1 deletion.
24 changes: 23 additions & 1 deletion fs/orangefs/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -487,7 +487,29 @@ static int orangefs_lock(struct file *filp, int cmd, struct file_lock *fl)

static int orangefs_flush(struct file *file, fl_owner_t id)
{
return vfs_fsync(file, 0);
/*
* This is vfs_fsync_range(file, 0, LLONG_MAX, 0) without the
* service_operation in orangefs_fsync.
*
* Do not send fsync to OrangeFS server on a close. Do send fsync
* on an explicit fsync call. This duplicates historical OrangeFS
* behavior.
*/
struct inode *inode = file->f_mapping->host;
int r;

if (inode->i_state & I_DIRTY_TIME) {
spin_lock(&inode->i_lock);
inode->i_state &= ~I_DIRTY_TIME;
spin_unlock(&inode->i_lock);
mark_inode_dirty_sync(inode);
}

r = filemap_write_and_wait_range(file->f_mapping, 0, LLONG_MAX);
if (r > 0)
return 0;
else
return r;
}

/** ORANGEFS implementation of VFS file operations */
Expand Down

0 comments on commit 90fc070

Please sign in to comment.