|
@@ -1792,20 +1792,21 @@ cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- if ((attrs->ia_valid & ATTR_MTIME) || (attrs->ia_valid & ATTR_SIZE)) {
|
|
|
- /*
|
|
|
- Flush data before changing file size or changing the last
|
|
|
- write time of the file on the server. If the
|
|
|
- flush returns error, store it to report later and continue.
|
|
|
- BB: This should be smarter. Why bother flushing pages that
|
|
|
- will be truncated anyway? Also, should we error out here if
|
|
|
- the flush returns error?
|
|
|
- */
|
|
|
- rc = filemap_write_and_wait(inode->i_mapping);
|
|
|
- if (rc != 0) {
|
|
|
- cifsInode->write_behind_rc = rc;
|
|
|
- rc = 0;
|
|
|
- }
|
|
|
+ /*
|
|
|
+ * 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
|
|
|
+ * ownership or mode then we may also need to do this. Here, we take
|
|
|
+ * 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
|
|
|
+ * will be truncated anyway? Also, should we error out here if
|
|
|
+ * the flush returns error?
|
|
|
+ */
|
|
|
+ rc = filemap_write_and_wait(inode->i_mapping);
|
|
|
+ if (rc != 0) {
|
|
|
+ cifsInode->write_behind_rc = rc;
|
|
|
+ rc = 0;
|
|
|
}
|
|
|
|
|
|
if (attrs->ia_valid & ATTR_SIZE) {
|
|
@@ -1903,20 +1904,21 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
- if ((attrs->ia_valid & ATTR_MTIME) || (attrs->ia_valid & ATTR_SIZE)) {
|
|
|
- /*
|
|
|
- Flush data before changing file size or changing the last
|
|
|
- write time of the file on the server. If the
|
|
|
- flush returns error, store it to report later and continue.
|
|
|
- BB: This should be smarter. Why bother flushing pages that
|
|
|
- will be truncated anyway? Also, should we error out here if
|
|
|
- the flush returns error?
|
|
|
- */
|
|
|
- rc = filemap_write_and_wait(inode->i_mapping);
|
|
|
- if (rc != 0) {
|
|
|
- cifsInode->write_behind_rc = rc;
|
|
|
- rc = 0;
|
|
|
- }
|
|
|
+ /*
|
|
|
+ * 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
|
|
|
+ * ownership or mode then we may also need to do this. Here, we take
|
|
|
+ * 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
|
|
|
+ * will be truncated anyway? Also, should we error out here if
|
|
|
+ * the flush returns error?
|
|
|
+ */
|
|
|
+ rc = filemap_write_and_wait(inode->i_mapping);
|
|
|
+ if (rc != 0) {
|
|
|
+ cifsInode->write_behind_rc = rc;
|
|
|
+ rc = 0;
|
|
|
}
|
|
|
|
|
|
if (attrs->ia_valid & ATTR_SIZE) {
|