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

!1416 Fix generic/299 fail

Merge Pull Request from: @ci-robot 
 
PR sync from: Zhihao Cheng <chengzhihao1@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/GAAGSCSVFKUBGX26W76VACFSY63LUWTV/ 
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/1416

 

Reviewed-by: default avatarzhangyi (F) <yi.zhang@huawei.com>
Signed-off-by: default avatarLiu YongQiang <liuyongqiang13@huawei.com>
parents b587ba7c 963b3ef7
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -656,7 +656,6 @@ enum {
#define EXT4_FREE_BLOCKS_NO_QUOT_UPDATE		0x0008
#define EXT4_FREE_BLOCKS_NOFREE_FIRST_CLUSTER	0x0010
#define EXT4_FREE_BLOCKS_NOFREE_LAST_CLUSTER	0x0020
#define EXT4_FREE_BLOCKS_DONT_WAIT_JOURNAL      0x0080

/*
 * ioctl commands
+1 −3
Original line number Diff line number Diff line
@@ -1328,8 +1328,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);
@@ -4607,7 +4606,6 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode,
		/* not a good idea to call discard here directly,
		 * but otherwise we'd need to call it every free() */
		ext4_discard_preallocations(inode);
		fb_flags |= EXT4_FREE_BLOCKS_DONT_WAIT_JOURNAL;
		ext4_free_blocks(handle, inode, NULL, newblock,
				 EXT4_C2B(sbi, allocated_clusters), fb_flags);
		goto out2;
+15 −1
Original line number Diff line number Diff line
@@ -2525,7 +2525,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;
@@ -2742,6 +2742,9 @@ static int ext4_writepages(struct address_space *mapping,
	bool done;
	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;
@@ -2933,6 +2936,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
@@ -2941,6 +2953,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
@@ -4921,9 +4921,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