From nobody Thu Apr 2 20:20:28 2026 Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 356CE3FBECA for ; Thu, 26 Mar 2026 14:26:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774535214; cv=none; b=tc49g5YBNxFpaszfjdbi66qQGuo/DmxogCcoWBdX9ZV280uVgnD3oE25WLKp9IIuuIcWCzAmuay1CFlfCpdmLxHiFwTO/PTPq5SjPSB7Whl5c3j67PmXUI+us6SSqhcfaFA0HKN9CGIlRCJfRyjdrHIHiMVqhkLY2pTHJWwkKpE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774535214; c=relaxed/simple; bh=BDyu5KwiPa7M2np+5xdPTZBdkU/tI1xyfr6mh7/aAHI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Doq3SjdN7okvC0E9izEUJQl4x0BE0DrLxRIB9khARO99E1LqdzSAY7aDcI0qbZ3QxHBQtyqnY8J3ONqOykgT5qC7CIk0dx3hpjahoOC1CEVdIwRNIyhLEt2/DDQomb/V/ephTrVG/6T3Q3IN/tUOo4UOenM2pLXReNG9qNB0yvU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=YZPrf8mC; arc=none smtp.client-ip=209.85.128.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="YZPrf8mC" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-4836d9d54f6so881545e9.1 for ; Thu, 26 Mar 2026 07:26:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1774535211; x=1775140011; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=FcschafzOX4ZtZ5FxQW1RYx7FdkCvz1J7dcg1OXPLpI=; b=YZPrf8mC+AYxGXA29f83AYQAoCQM9kDD02ftNcdsTafsMf/OIwqbHjx5TMQifKumvs NBxaQdWiz5CwUbR6zcK/IaV39/W46XwBZfoNvsuKzCmPbcS/vvWOWqqcjYD+Vf0I0XwD fQMnouP87QNuWJnxdNDDkd6Q9JBLp1/gJ8S63BPCCHNGPbj1vQXZY/MwN9vhCxhmUUoy NK33Yi19FQOXecQEdsYBrQ/ALBH5XDYtQOu3zqxmzBFF2bU8+HEe39kWPF9UpAE55nzs KAbXUI4LSv9b/B9TLdungiGQ88sX3bmfbJXfbYMWcBAznTbeJdgU0Fl8aKrxwEtfEu09 zcmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774535211; x=1775140011; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=FcschafzOX4ZtZ5FxQW1RYx7FdkCvz1J7dcg1OXPLpI=; b=fD8vfNu6smQ6SZFzTCRlMKMmaIhRZWtIdtJzMKX9gNHnRNWFJtXsT8a4hfcBshEilm pe8aONtg/g+tfwbpPQd57lgnyFhHjW8yLPTHjSe2rACyDFWLbWixzA2KXvRFJ2KMO64S OWA8RwX4weHf54cDp2PLDMokzQYfsxAn2mfnIpn0wdV2rU+DK9vcrVXNYI/c5eaxkjw3 OyyIKRElOvCkAFvceB4OIU8UuF/muL8xoL1vIx6iRlZi1yTONGvrEX4gvufc/l32F0Fz 53ZpQnNyMb75Kf+ARHpUdeh0FNjRfhPpNXLCwOHX2SWgmUXP2h4KuoQookVVrzoN6XuX 921w== X-Forwarded-Encrypted: i=1; AJvYcCUpsUc8xorWVT/k6ULdtKRBP4JXvO2FmWoBX5bxrvdpzIiO7cQpvk6P91Ea2FuHoIWSLS5kCKwJxBUomqI=@vger.kernel.org X-Gm-Message-State: AOJu0Yy7ne9/reBc9ysgtTxVEYBu6SOWQZkywcm2JkLW5WtxomTZeB89 t1N3DhwR+CJPzeL36apCvPD2F/PuUEstQ8XFol4vBv8N7o/PlY2ifum/FgziYA4Cy9kzfbOFsiN CY4ceFlE= X-Gm-Gg: ATEYQzy6xxk0FAFcvY6hE/4flMIDCVhK6dyhd1TDPJOeCNShkhGJ5Xh8euEPVNFOGv3 QefdtrU4wGFShGDjVZMhdC51Buu0RCxj/e6j9uoqAiHluY9WccEnY1P++heMPUmLIFIljIGpKZ6 rGJF3t9ms0n+idrM9o0BwJSlt9SiNle5g27J00xaiZzK/6BQgs2gD2T2S5C8OWKEHtOLuqUENGR 1pdqr+/Q4Jya5mi4QSCLJLQVdnarr1Ixq7QnlQPKES5VJKV7KWptteE7bgFblfUllbK6FCxPlCv vTGHX4I7qCkgWN9MBgrTaw9CivCyMgZMcAguQMj4FUnZ/d+EG/gTqbwXfVEeyVOO61fhaJ0bOUA X6/h4wxG09D0k6hF609jA6q81NrqsyTQPS84u9BONuGZTHjFEGQifEN9DBaNILamAZ39Xqv9J/7 MmitSwSKjkduGWeqCAov+Nw/Vy3TORGNHgvvgP X-Received: by 2002:a05:600c:3b11:b0:487:2439:b7c3 with SMTP id 5b1f17b1804b1-4872439b842mr12829485e9.4.1774535210579; Thu, 26 Mar 2026 07:26:50 -0700 (PDT) Received: from localhost.localdomain ([202.127.77.110]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82c7d23841fsm3538669b3a.26.2026.03.26.07.26.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2026 07:26:49 -0700 (PDT) From: Heming Zhao To: joseph.qi@linux.alibaba.com, jack@suse.cz Cc: Heming Zhao , ocfs2-devel@lists.linux.dev, linux-kernel@vger.kernel.org, glass.su@suse.com Subject: [PATCH v4 1/1] ocfs2: split transactions in dio completion to avoid credit exhaustion Date: Thu, 26 Mar 2026 22:26:39 +0800 Message-ID: <20260326142640.20077-2-heming.zhao@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260326142640.20077-1-heming.zhao@suse.com> References: <20260326142640.20077-1-heming.zhao@suse.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" During ocfs2 dio operations, JBD2 may report warnings via following call tr= ace: ocfs2_dio_end_io_write ocfs2_mark_extent_written ocfs2_change_extent_flag ocfs2_split_extent ocfs2_try_to_merge_extent ocfs2_extend_rotate_transaction ocfs2_extend_trans jbd2__journal_restart start_this_handle output: JBD2: kworker/6:2 wants too many credits credits:5450 rsv_= credits:0 max:5449 To prevent exceeding the credits limit, modify ocfs2_dio_end_io_write() to handle extent in a batch of transaction. Additionally, relocate ocfs2_del_inode_from_orphan(). The orphan inode shou= ld only be removed from the orphan list after the extent tree update is comple= te. this ensures that if a crash occurs in the middle of extent tree updates, we won't leave stale blocks beyond EOF. Finally, thanks to Jans and Joseph for providing the bug fix prototype and suggestions. Suggested-by: Jan Kara Suggested-by: Joseph Qi Reviewed-by: Jan Kara Signed-off-by: Heming Zhao --- fs/ocfs2/aops.c | 72 ++++++++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 28 deletions(-) diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 09146b43d1f0..60f1b607022f 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c @@ -37,6 +37,8 @@ #include "namei.h" #include "sysfile.h" =20 +#define OCFS2_DIO_MARK_EXTENT_BATCH 200 + static int ocfs2_symlink_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create) { @@ -2277,7 +2279,7 @@ static int ocfs2_dio_end_io_write(struct inode *inode, struct ocfs2_alloc_context *meta_ac =3D NULL; handle_t *handle =3D NULL; loff_t end =3D offset + bytes; - int ret =3D 0, credits =3D 0; + int ret =3D 0, credits =3D 0, batch =3D 0; =20 ocfs2_init_dealloc_ctxt(&dealloc); =20 @@ -2294,18 +2296,6 @@ static int ocfs2_dio_end_io_write(struct inode *inod= e, goto out; } =20 - /* Delete orphan before acquire i_rwsem. */ - if (dwc->dw_orphaned) { - BUG_ON(dwc->dw_writer_pid !=3D task_pid_nr(current)); - - end =3D end > i_size_read(inode) ? end : 0; - - ret =3D ocfs2_del_inode_from_orphan(osb, inode, di_bh, - !!end, end); - if (ret < 0) - mlog_errno(ret); - } - down_write(&oi->ip_alloc_sem); di =3D (struct ocfs2_dinode *)di_bh->b_data; =20 @@ -2326,20 +2316,22 @@ static int ocfs2_dio_end_io_write(struct inode *ino= de, =20 credits =3D ocfs2_calc_extend_credits(inode->i_sb, &di->id2.i_list); =20 - handle =3D ocfs2_start_trans(osb, credits); - if (IS_ERR(handle)) { - ret =3D PTR_ERR(handle); - mlog_errno(ret); - goto unlock; - } - ret =3D ocfs2_journal_access_di(handle, INODE_CACHE(inode), di_bh, - OCFS2_JOURNAL_ACCESS_WRITE); - if (ret) { - mlog_errno(ret); - goto commit; - } - list_for_each_entry(ue, &dwc->dw_zero_list, ue_node) { + if (!handle) { + handle =3D ocfs2_start_trans(osb, credits); + if (IS_ERR(handle)) { + ret =3D PTR_ERR(handle); + mlog_errno(ret); + handle =3D NULL; + break; + } + ret =3D ocfs2_journal_access_di(handle, INODE_CACHE(inode), di_bh, + OCFS2_JOURNAL_ACCESS_WRITE); + if (ret) { + mlog_errno(ret); + break; + } + } ret =3D ocfs2_assure_trans_credits(handle, credits); if (ret < 0) { mlog_errno(ret); @@ -2353,17 +2345,41 @@ static int ocfs2_dio_end_io_write(struct inode *ino= de, mlog_errno(ret); break; } + + if (++batch =3D=3D OCFS2_DIO_MARK_EXTENT_BATCH) { + ocfs2_commit_trans(osb, handle); + handle =3D NULL; + batch =3D 0; + } } =20 if (end > i_size_read(inode)) { + if (!handle) { + handle =3D ocfs2_start_trans(osb, credits); + if (IS_ERR(handle)) { + ret =3D PTR_ERR(handle); + mlog_errno(ret); + goto unlock; + } + } ret =3D ocfs2_set_inode_size(handle, inode, di_bh, end); if (ret < 0) mlog_errno(ret); } -commit: - ocfs2_commit_trans(osb, handle); + if (handle) + ocfs2_commit_trans(osb, handle); + unlock: up_write(&oi->ip_alloc_sem); + + /* everything looks good, let's start the cleanup */ + if (dwc->dw_orphaned) { + BUG_ON(dwc->dw_writer_pid !=3D task_pid_nr(current)); + + ret =3D ocfs2_del_inode_from_orphan(osb, inode, di_bh, 0, 0); + if (ret < 0) + mlog_errno(ret); + } ocfs2_inode_unlock(inode, 1); brelse(di_bh); out: --=20 2.43.0