From nobody Tue Apr 7 14:38:11 2026 Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (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 AE8073F8808 for ; Thu, 12 Mar 2026 16:27:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773332865; cv=none; b=j5fyv7uouZovJm5eq2oN53cUGOz4L5xAmeS9t/m+BMRVQ1IlNKuigq5+MOxRdOqt18QAgd0XLTHVPPkAfI0kZmEv6mHhauEJcPiJpaM1ad22rd7CjN4s+GWVAKm8ne4NT46uWe5LH4/lpZVFZM68Wchb4D+koDh9ZMilRM4Qepo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773332865; c=relaxed/simple; bh=jlZ6vyHL/5H17GGmpSuyXizwo7dtt8ALbzqE+CcAIWw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Lbwc8vuE9/dpBkLm6fiSuwO6wBVLa81TWwZNtXdgeSSqVwRW9vjGcOBT6z1xUnkLeWdN1cEnM9sVRzbJL4VyKjFTmR8p29mCBh6rYABRj6GEvoItkjz69VAmWWnuiWE1+4MRbYlJzflTBoBVtlYh6+u4o6pSm+O2U6fQgB/gucQ= 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=AfFIDq10; arc=none smtp.client-ip=209.85.128.43 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="AfFIDq10" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-48545a7ffabso599395e9.2 for ; Thu, 12 Mar 2026 09:27:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1773332857; x=1773937657; 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=Q2K0kUSW2jmLPn139Qdn7K3kU+YuzTW+FKmv+jdtRF0=; b=AfFIDq10PVLPoK7e/NiU21LRGVAx/FwWNTmydXkEKSZxxsl/4Y4P4U5tvjnL3h+83O AwvDC+NflID6yBK827yKmnrlNGmkxWrzd2rE+/ysWssXJmlclOHaGM5KSoTkb10qm6Pr a/PjnFCEBaUeDO1BLBmLWkbdrrY3/wTZR4Ul+UmEiN+kc3a0ZXfm2H8uQ6RPPKDmlwwo 4z82aXgr+LKq3jTHe5ls5/M3VXCHqnuUa3G9nLXRZSzAB3vryvROZsoT5SLCvkqme7+P 8XgLtpwKVX6tsnYedRFD3jVerkpYf6YMCrTMIu9SxtoKGvX7DtXCST9AP6C5gmMRc5ZP QAjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773332857; x=1773937657; 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=Q2K0kUSW2jmLPn139Qdn7K3kU+YuzTW+FKmv+jdtRF0=; b=YKszucXx21P6oMFBRj9+LaULX9j9DXFWJEKo/i6BEjID+lauhi3iZj1fcs3s4faPfC wFFuvFcHSDeLHDg6u5DkLQZYpxRSr4xznQY5UnwCoQjA8xFEso39B07CMGVnQdHAu3iI 7PYtx1eFQdJr2tDSCed7QrIgUlvkW8ATSh/qHFYyhYCUqJM9pCElEBSbLsPfwqyu2f1O zskUTTZKu8uBBydHVeGPwX/Ria2LtU/Z0/kUp/v3QsMgLcne3H8bfkYrze87BDM3tqt/ xbzQDQIK1Q+ozic2wLJMgq1KKqkOS3Cdvarr3yq1gtTznvZiZhQqwyg3WyZQ4Tn9/4gU d7Hg== X-Forwarded-Encrypted: i=1; AJvYcCXeSeBBXAwJ7B2OAMd3eAt4SAuIa4vhQur5I5xPwbArYFxfDfWlauFtwiCIgyS69cWnoqH/KwSTNGch1R4=@vger.kernel.org X-Gm-Message-State: AOJu0YyWMNlTdDFWFW/Wxfqfw2ytS/gM6Faer6yXN91iPIlTMH9Jtt75 JQiOYxPuu10LiVVCNO/zCmEDo902hf6CQ/QmlmioB3/i4HTe4QWSfYPtZvbg7DVHfbs= X-Gm-Gg: ATEYQzzBfDuZwtyKuB4V/cB7qxTmwOktJYuERG6XO+daZI//lYc5bcze7A4SpIg75lt yJ+qoSnajeDYuuvy0BeCExVdV/uOSOdMoE3oZVu9bsvmAZqdR/pdqaVQn3jW/htp8ATErR48BMa gf8cMM2hcda8AVOFJZ7vudwYEz5xEimRiWDHKTcN0sXee7V3RRmZQWA8tUAGUWIp8n0z1RF84+r e6gwPO+oD/jlN/EoXDQtyRg5Vce1gFygD/MjuO+nugW0TUv01hkHjHz8fX4s768Aj5IcPgsbmRP higktDiX1riZ9f6rJLf7Va6fQ6VohR2j3TU2sVxwz8OMC4rKcSO2TBIvvhWjacSOncEkcf1VLoC 6/bYarLLKkR8YlgxxehRQXq4lBvASmXWd0Y0Gs/vcA5gQBnjljWG0bjEyIQbp/z7f29FYGopTf1 95SFFUYS8dflo1QPA96+2pu8Qybd4UZZG+52Dg X-Received: by 2002:a05:600c:6297:b0:483:887:6e32 with SMTP id 5b1f17b1804b1-4854b139988mr65541525e9.8.1773332856745; Thu, 12 Mar 2026 09:27:36 -0700 (PDT) Received: from localhost.localdomain ([202.127.77.110]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c73cdf2725csm5877790a12.13.2026.03.12.09.27.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 09:27:35 -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 Subject: [PATCH v2 1/1] ocfs2: split transactions in dio completion to avoid credit exhaustion Date: Fri, 13 Mar 2026 00:27:23 +0800 Message-ID: <20260312162725.15523-2-heming.zhao@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260312162725.15523-1-heming.zhao@suse.com> References: <20260312162725.15523-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 each extent in a separate 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. This patch also removes the only call to ocfs2_assure_trans_credits(), which was introduced by commit be346c1a6eeb ("ocfs2: fix DIO failure due to insufficient transaction credits"). Finally, thanks to Jans for providing the bug fix prototype and suggestions. Suggested-by: Jan Kara Signed-off-by: Heming Zhao --- fs/ocfs2/aops.c | 58 ++++++++++++++++++++++++------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 09146b43d1f0..91997b330d39 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c @@ -2294,18 +2294,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,44 +2314,56 @@ 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) { - ret =3D ocfs2_assure_trans_credits(handle, credits); - if (ret < 0) { + handle =3D ocfs2_start_trans(osb, credits); + if (IS_ERR(handle)) { + ret =3D PTR_ERR(handle); mlog_errno(ret); break; } + ret =3D ocfs2_journal_access_di(handle, INODE_CACHE(inode), di_bh, + OCFS2_JOURNAL_ACCESS_WRITE); + if (ret) { + mlog_errno(ret); + ocfs2_commit_trans(osb, handle); + break; + } ret =3D ocfs2_mark_extent_written(inode, &et, handle, ue->ue_cpos, 1, ue->ue_phys, meta_ac, &dealloc); if (ret < 0) { mlog_errno(ret); + ocfs2_commit_trans(osb, handle); break; } + ocfs2_commit_trans(osb, handle); } =20 if (end > i_size_read(inode)) { + 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); + ocfs2_commit_trans(osb, handle); } -commit: - 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