Unverified Commit 8f65c814 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!1419 [sync] PR-1415: Fix generic/299 fail

Merge Pull Request from: @openeuler-sync-bot 
 

Origin pull request: 
https://gitee.com/openeuler/kernel/pulls/1415 
 
PR sync from: Zhihao Cheng <chengzhihao1@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/TSXRUVDLVGILRT2XURWM3RIMGTKSEUZT/ 
Revert origin fix, add debug message.

Zhihao Cheng (2):
  Revert "ext4: Stop trying writing pages if no free blocks generated"
  ext4: Add debug message to notify user space is out of free


-- 
2.31.1
 
https://gitee.com/openeuler/kernel/issues/I7CBCS 
 
Link:https://gitee.com/openeuler/kernel/pulls/1419

 

Reviewed-by: default avatarzhangyi (F) <yi.zhang@huawei.com>
Signed-off-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
parents 7aa75253 3bbf8b61
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -700,7 +700,6 @@ enum {
#define EXT4_FREE_BLOCKS_NOFREE_FIRST_CLUSTER	0x0010
#define EXT4_FREE_BLOCKS_NOFREE_LAST_CLUSTER	0x0020
#define EXT4_FREE_BLOCKS_RERESERVE_CLUSTER      0x0040
#define EXT4_FREE_BLOCKS_DONT_WAIT_JOURNAL      0x0080

/*
 * ioctl commands
+1 −3
Original line number Diff line number Diff line
@@ -1294,8 +1294,7 @@ static int ext4_ext_split(handle_t *handle, struct inode *inode,
			if (!ablocks[i])
				continue;
			ext4_free_blocks(handle, inode, NULL, ablocks[i], 1,
					 EXT4_FREE_BLOCKS_METADATA |
					 EXT4_FREE_BLOCKS_DONT_WAIT_JOURNAL);
					 EXT4_FREE_BLOCKS_METADATA);
		}
	}
	kfree(ablocks);
@@ -4330,7 +4329,6 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode,
			ext4_discard_preallocations(inode, 0);
			if (flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE)
				fb_flags = EXT4_FREE_BLOCKS_NO_QUOT_UPDATE;
			fb_flags |= EXT4_FREE_BLOCKS_DONT_WAIT_JOURNAL;
			ext4_free_blocks(handle, inode, NULL, newblock,
					 EXT4_C2B(sbi, allocated_clusters),
					 fb_flags);
+15 −1
Original line number Diff line number Diff line
@@ -2465,7 +2465,7 @@ static int mpage_map_and_submit_extent(handle_t *handle,
			 * is non-zero, a commit should free up blocks.
			 */
			if ((err == -ENOMEM) ||
			    (err == -ENOSPC && EXT4_SB(sb)->s_mb_free_pending)) {
			    (err == -ENOSPC && ext4_count_free_clusters(sb))) {
				if (progress)
					goto update_disksize;
				return err;
@@ -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)
+2 −3
Original line number Diff line number Diff line
@@ -5496,9 +5496,8 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode,
	 * consistency guarantees.
	 */
	if (ext4_handle_valid(handle) &&
	    (((flags & EXT4_FREE_BLOCKS_METADATA) ||
	     !ext4_should_writeback_data(inode)) &&
	     !(flags & EXT4_FREE_BLOCKS_DONT_WAIT_JOURNAL))) {
	    ((flags & EXT4_FREE_BLOCKS_METADATA) ||
	     !ext4_should_writeback_data(inode))) {
		struct ext4_free_data *new_entry;
		/*
		 * We use __GFP_NOFAIL because ext4_free_blocks() is not allowed