diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 4c9cd5e994cf37c046487cd13a1e69db2a269f65..941c1e61f291484d6d49549e476d70ceb0f6d9cb 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -2682,6 +2682,9 @@ static int ext4_writepages(struct address_space *mapping, struct ext4_sb_info *sbi = EXT4_SB(mapping->host->i_sb); struct blk_plug plug; bool give_up_on_write = false; + unsigned long retry_warn_ddl = 0; + +#define RETRY_WARN_TIMEOUT (30 * HZ) if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) return -EIO; @@ -2863,6 +2866,15 @@ static int ext4_writepages(struct address_space *mapping, mpd.io_submit.io_end = NULL; if (ret == -ENOSPC && sbi->s_journal) { + if (!retry_warn_ddl) { + retry_warn_ddl = jiffies + RETRY_WARN_TIMEOUT; + } else if (time_after(jiffies, retry_warn_ddl)) { + retry_warn_ddl = jiffies + RETRY_WARN_TIMEOUT; + ext4_warning(inode->i_sb, "There are no free blocks available for writing pages, total free %llu, pending free %u, please delete big files to free space", + ext4_count_free_clusters(inode->i_sb), + sbi->s_mb_free_pending); + } + /* * Commit the transaction which would * free blocks released in the transaction @@ -2871,6 +2883,8 @@ static int ext4_writepages(struct address_space *mapping, jbd2_journal_force_commit_nested(sbi->s_journal); ret = 0; continue; + } else { + retry_warn_ddl = 0; } /* Fatal error - ENOMEM, EIO... */ if (ret)