From nobody Sun Jun 14 09:57:15 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 163853DCD89 for ; Thu, 2 Apr 2026 10:07:06 +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=1775124428; cv=none; b=kdIP8lxbw7rIV2E0Zea8GIkU9z0rnHGSg/vjXX+Bggr/vJk3tv+dOm7sAptFx9rn3T71RknZDYpqJSd7VeeeLrIBF7CfwpkYaaxTOHWlg8vABxY125UxSFwzHS5W14aZj9uqhhjb0RKjfZCdHqfGm3fFvA8w5drfvflHDHxwU/c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775124428; c=relaxed/simple; bh=VwaR+Lj59Kdxww5GaaJbL/6dF5av3sXeomek3oHegR0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KDqm65IyfqJ+oBkuyi4VNq3DykJxaj3PlKiKGon27sKflVRj403Wti3dRdDo5oZHqjVFCpoaOjUjrCpx2edZe8e/6EA0fotyI6LmXIAkm+kMoPdsyfsGu2DzMjcBjxsTc0XA4/4k7Ma/CbEzy9voMM9wLmx5wrZ7dKE/BFVzzN4= 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=JZQhhtJZ; 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="JZQhhtJZ" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-4836cd6e0d4so835745e9.3 for ; Thu, 02 Apr 2026 03:07:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1775124425; x=1775729225; 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=o1HJCFB1TIJQKf7p/L9dqOK2SnRhDX+pwg0opmf17us=; b=JZQhhtJZvQfJgE3Om31luA/lNoZVYQteskn5w4coDChr+UwwaETO4TiwRzshsOpX4Z 8iLiP2D4HwqbBQqn8GZizvVm+aNCeLTMnCKFDqMxCueoQVmADKQCFcM+VapVk//98UKz fXfSmYgfmHwfX3rBs083oM9XXb/UqKg6uP0MpvXPOT/L6KfHWPo2HIkqzr94OykKn4e3 OSWsW8llosQUN4aGnJWOkBQ5qGEXg/Rxs2fp+RyeMczzhQhm+SCkYwXsIXhVwDAdLSC+ BKMyNvkSQwLLXbjvq3N9Z/kmc2u/r/foQ+wAgssa95IRSSGj5YrWLsFTOQNxw7WGLwHB Xg6g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775124425; x=1775729225; 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=o1HJCFB1TIJQKf7p/L9dqOK2SnRhDX+pwg0opmf17us=; b=nqBiIja7uxLRefsU7i1Zi+h3dmWpvoZMNr+AIGD/FZEi/RwnUZwwysLr3pKaurUjF2 Ht6v9h5KR5Uwxmx/gWnRJVHmt9/HeOv4QYQYvGZCI2SRjtsEXwOHq7uHwK9TG9At2LYc /ERZkKyG6y+77DzY/9sbqzF/0kl5M5wWphGVCxgZMPLCLSGwVt00tyWmovmOqMfqeo5a paZIMBbOdFLzvlGQXO3Bpyox8LBijSuQ/p+7HnrvhJMD5okxegDs7rZQQfy5rkviNJH1 uMCamGBWRT3/WBDWrngaCMtZOWQNxm7I/X8l/kC1dcmtdoXrRFfL0pZhjcv/ZPRK4J6e +emw== X-Forwarded-Encrypted: i=1; AJvYcCUHSXrZhjI/HeekF3GhFGHtrqTAsFlgmVx7Q+VZxS4nVxqGyB4NGt35IaV2F/TU0e/Q3kuTEgQg13AL+Ek=@vger.kernel.org X-Gm-Message-State: AOJu0YxD3LN1XidOoZRjtPBYUrz55nH5Vnk/5zTGIRfpX2d+Twb9dmo+ owHtL0XPI4iGGPOKjXhERAtreGtkljmIN+8O141hw89TVYhHOfFZJA1gAivZ1V60Zyk= X-Gm-Gg: ATEYQzyO7wf2giC0bnkRYKqWQPeYsSp7m/gwBkya9D7nkao0SRi9YdAfcxHx89qaAJm LQmuzwnRFifQOGy36Kga+FS/E8jihR+LwkBwMqWLSKQzy8XNFzHJayxCUZeQxoHkKoKwegZ0uaP L6VRzpw6o9IAVQszmJgbELaM6mpsjuWTx/jZaxVhpjxVf/li9nL/aeGLhvnAz3cZrVNzLXZlk7L bFC2MM6ZCagMAk2By21Oh66uttG7E4iulyW7OmQKIgbl1Qr4cnYs1p950I2qo4+jUc9Cy1a3niQ HPB3IgI1ilIF6FpNRL28aEtllCJGrvoWRZo1BzzPnBz6tcYsFh37cGQVtm/20GeJe13LVSNFDBC ZmQhgY+N4bdYDw+58iUxbwnaXjnoRmYhwkt9x6nDWajuvhNcockLBkPleVHAWsFKP6uzE5RSL8u sOdmxDDtQToEc7Z35ybPA6Y9gKcsma1yuOG8nD X-Received: by 2002:a05:600c:4f94:b0:488:78f0:5ba with SMTP id 5b1f17b1804b1-4888359ceb2mr60768015e9.7.1775124425374; Thu, 02 Apr 2026 03:07:05 -0700 (PDT) Received: from localhost.localdomain ([202.127.77.110]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c76c65a3f08sm2307300a12.31.2026.04.02.03.07.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Apr 2026 03:07:04 -0700 (PDT) From: Heming Zhao To: joseph.qi@linux.alibaba.com Cc: Heming Zhao , ocfs2-devel@lists.linux.dev, linux-kernel@vger.kernel.org, glass.su@suse.com, jack@suse.cz Subject: [PATCH v7 1/1] ocfs2: split transactions in dio completion to avoid credit exhaustion Date: Thu, 2 Apr 2026 18:06:55 +0800 Message-ID: <20260402100656.24874-2-heming.zhao@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260402100656.24874-1-heming.zhao@suse.com> References: <20260402100656.24874-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 extents 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. This patch also changes the logic for updating the inode size and removing orphan, making it similar to ext4_dio_write_end_io(). Both operations are performed only when everything looks good. 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 | 71 ++++++++++++++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 28 deletions(-) diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 09146b43d1f0..9be43ea98930 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,24 +2316,25 @@ 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); + 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; + } + } ret =3D ocfs2_assure_trans_credits(handle, credits); if (ret < 0) { mlog_errno(ret); - break; + goto commit; } ret =3D ocfs2_mark_extent_written(inode, &et, handle, ue->ue_cpos, 1, @@ -2351,19 +2342,43 @@ static int ocfs2_dio_end_io_write(struct inode *ino= de, meta_ac, &dealloc); if (ret < 0) { mlog_errno(ret); - break; + goto commit; + } + + if (++batch =3D=3D OCFS2_DIO_MARK_EXTENT_BATCH) { + ocfs2_commit_trans(osb, handle); + handle =3D NULL; + batch =3D 0; } } =20 + if (!handle) { + handle =3D ocfs2_start_trans(osb, credits); + if (IS_ERR(handle)) { + ret =3D PTR_ERR(handle); + mlog_errno(ret); + goto unlock; + } + } if (end > i_size_read(inode)) { ret =3D ocfs2_set_inode_size(handle, inode, di_bh, end); if (ret < 0) mlog_errno(ret); } + commit: ocfs2_commit_trans(osb, handle); unlock: up_write(&oi->ip_alloc_sem); + + /* everything looks good, let's start the cleanup */ + if (!ret && 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