|
@@ -309,6 +309,16 @@ int filemap_check_errors(struct address_space *mapping)
|
|
|
}
|
|
|
EXPORT_SYMBOL(filemap_check_errors);
|
|
|
|
|
|
+static int filemap_check_and_keep_errors(struct address_space *mapping)
|
|
|
+{
|
|
|
+ /* Check for outstanding write errors */
|
|
|
+ if (test_bit(AS_EIO, &mapping->flags))
|
|
|
+ return -EIO;
|
|
|
+ if (test_bit(AS_ENOSPC, &mapping->flags))
|
|
|
+ return -ENOSPC;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* __filemap_fdatawrite_range - start writeback on mapping dirty pages in range
|
|
|
* @mapping: address space structure to write
|
|
@@ -453,15 +463,17 @@ EXPORT_SYMBOL(filemap_fdatawait_range);
|
|
|
* call sites are system-wide / filesystem-wide data flushers: e.g. sync(2),
|
|
|
* fsfreeze(8)
|
|
|
*/
|
|
|
-void filemap_fdatawait_keep_errors(struct address_space *mapping)
|
|
|
+int filemap_fdatawait_keep_errors(struct address_space *mapping)
|
|
|
{
|
|
|
loff_t i_size = i_size_read(mapping->host);
|
|
|
|
|
|
if (i_size == 0)
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
|
|
|
__filemap_fdatawait_range(mapping, 0, i_size - 1);
|
|
|
+ return filemap_check_and_keep_errors(mapping);
|
|
|
}
|
|
|
+EXPORT_SYMBOL(filemap_fdatawait_keep_errors);
|
|
|
|
|
|
/**
|
|
|
* filemap_fdatawait - wait for all under-writeback pages to complete
|