|
@@ -2397,6 +2397,20 @@ static int ext4_da_writepages(struct address_space *mapping,
|
|
|
*/
|
|
|
if (!mapping->nrpages || !mapping_tagged(mapping, PAGECACHE_TAG_DIRTY))
|
|
|
return 0;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If the filesystem has aborted, it is read-only, so return
|
|
|
+ * right away instead of dumping stack traces later on that
|
|
|
+ * will obscure the real source of the problem. We test
|
|
|
+ * EXT4_MOUNT_ABORT instead of sb->s_flag's MS_RDONLY because
|
|
|
+ * the latter could be true if the filesystem is mounted
|
|
|
+ * read-only, and in that case, ext4_da_writepages should
|
|
|
+ * *never* be called, so if that ever happens, we would want
|
|
|
+ * the stack trace.
|
|
|
+ */
|
|
|
+ if (unlikely(sbi->s_mount_opt & EXT4_MOUNT_ABORT))
|
|
|
+ return -EROFS;
|
|
|
+
|
|
|
/*
|
|
|
* Make sure nr_to_write is >= sbi->s_mb_stream_request
|
|
|
* This make sure small files blocks are allocated in
|
|
@@ -2441,7 +2455,7 @@ static int ext4_da_writepages(struct address_space *mapping,
|
|
|
handle = ext4_journal_start(inode, needed_blocks);
|
|
|
if (IS_ERR(handle)) {
|
|
|
ret = PTR_ERR(handle);
|
|
|
- printk(KERN_EMERG "%s: jbd2_start: "
|
|
|
+ printk(KERN_CRIT "%s: jbd2_start: "
|
|
|
"%ld pages, ino %lu; err %d\n", __func__,
|
|
|
wbc->nr_to_write, inode->i_ino, ret);
|
|
|
dump_stack();
|