smb3: fix performance regression with setting mtime
commitcf5371ae46
upstream. There are cases when we don't want to send the SMB2 flush operation (e.g. when user specifies mount parm "nostrictsync") and it can be a very expensive operation on the server. In most cases in order to set mtime, we simply need to flush (write) the dirtry pages from the client and send the writes to the server not also send a flush protocol operation to the server. Fixes:aa081859b1
("cifs: flush before set-info if we have writeable handles") CC: Stable <stable@vger.kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
40888c31ac
commit
9b35348318
|
@ -2454,25 +2454,26 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Attempt to flush data before changing attributes. We need to do
|
* Attempt to flush data before changing attributes. We need to do
|
||||||
* this for ATTR_SIZE and ATTR_MTIME for sure, and if we change the
|
* this for ATTR_SIZE and ATTR_MTIME. If the flush of the data
|
||||||
* ownership or mode then we may also need to do this. Here, we take
|
* returns error, store it to report later and continue.
|
||||||
* the safe way out and just do the flush on all setattr requests. If
|
|
||||||
* the flush returns error, store it to report later and continue.
|
|
||||||
*
|
*
|
||||||
* BB: This should be smarter. Why bother flushing pages that
|
* BB: This should be smarter. Why bother flushing pages that
|
||||||
* will be truncated anyway? Also, should we error out here if
|
* will be truncated anyway? Also, should we error out here if
|
||||||
* the flush returns error?
|
* the flush returns error? Do we need to check for ATTR_MTIME_SET flag?
|
||||||
*/
|
*/
|
||||||
rc = filemap_write_and_wait(inode->i_mapping);
|
if (attrs->ia_valid & (ATTR_MTIME | ATTR_SIZE | ATTR_CTIME)) {
|
||||||
if (is_interrupt_error(rc)) {
|
rc = filemap_write_and_wait(inode->i_mapping);
|
||||||
rc = -ERESTARTSYS;
|
if (is_interrupt_error(rc)) {
|
||||||
goto cifs_setattr_exit;
|
rc = -ERESTARTSYS;
|
||||||
|
goto cifs_setattr_exit;
|
||||||
|
}
|
||||||
|
mapping_set_error(inode->i_mapping, rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
mapping_set_error(inode->i_mapping, rc);
|
|
||||||
rc = 0;
|
rc = 0;
|
||||||
|
|
||||||
if (attrs->ia_valid & ATTR_MTIME) {
|
if ((attrs->ia_valid & ATTR_MTIME) &&
|
||||||
|
!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) {
|
||||||
rc = cifs_get_writable_file(cifsInode, FIND_WR_ANY, &wfile);
|
rc = cifs_get_writable_file(cifsInode, FIND_WR_ANY, &wfile);
|
||||||
if (!rc) {
|
if (!rc) {
|
||||||
tcon = tlink_tcon(wfile->tlink);
|
tcon = tlink_tcon(wfile->tlink);
|
||||||
|
|
Loading…
Reference in New Issue