From nobody Thu Apr 9 07:16:34 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 4200844D6AB for ; Tue, 10 Mar 2026 10:24:25 +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=1773138266; cv=none; b=RrD34CTdKdzAJQ4RE1CpXmymkjYjgebRdFW/M4wEbSOcZtSJiZCtQplEMBui/70NRnSDWMmysCVL3C7Fkpir8YPbiVAi/BATdgam0U2vNrstAyjQmNX/QGB/cm0B/MPRWe2lXjNsovEuBZTaMGCKOoc12FjCj8YXV8IVTVrg/co= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773138266; c=relaxed/simple; bh=z0z9B7ZBOmRZ8glWgHskxYuryo6uTmZVrX4gK72k3Fc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qd0WkoOnYRXrCaDu+g/3pv2Y7d7On/MYUHn2mZDeZLU7y+XMcuRNJHq12BguNdka2GWChV6hhrQclV5r2FB7LR7aIM4/OK2zycE7CNA/twP40HdpNJME9myy2Y512C6rgkWKGYWZ0/sx5IAOWZ0rQE0UngQ7s314NMc+yOqNwIY= 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=Q2revI1s; 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="Q2revI1s" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-4853a5ffc05so4610605e9.0 for ; Tue, 10 Mar 2026 03:24:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1773138264; x=1773743064; 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=1N3sjVkf58k4WLx94+8KZoUfh8dzAxMyEL/Uf8S4aTA=; b=Q2revI1sOdmqakYguohBPqXJ3pUfF65aTuxta1MxUVqviw0zk4a119v6QUM0swOm2T fAJ2iqe/geZp+Ys1DaY5nIrkWG+3L0Eja+om3690HjPWcwJKW+dD9xt9BN924QiMiYBl 8YZyRLJhqxKfdk9oqtioXh1JzRia/q6Mu71HuH1h2ghQumuTGrRYFCeifZiPlul7ncyM lIZF+Tlyf0cEBs8KGwvAfLPAcIWo8qtESDj15P1zsoCa+LYDtin/tE9c5W6RrM4k0iTh hbH/NShX0bJHIYUeho5qk51FHhnrCLBfx/6bSlp6bdgubsFJ+pN2Ku8/INNwi8sdEhfi my+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773138264; x=1773743064; 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=1N3sjVkf58k4WLx94+8KZoUfh8dzAxMyEL/Uf8S4aTA=; b=n+q9rLh0bNUei5A6QQiMj0XsYERx2E6kLI0SNC88jHp8gzXiWERIKeRSyhlhT6pzFs FhjqL3vU/M7QLZFXuuUuGFSjfrmZnpAdpndNCxsJe6Dgkp4f7/dcOZSk7mpjaDx8JSDn UhF544oVqHtBGGRLG4tJbdO/HdCWGXl61K/wjnBII9E96k+dQcfbELMK9zlMdU1XTlEy 1+5rFEdNaTDwQoCXVEdzPGvt4tHlc9/lQ7l8i2DrNOnH4OIO2om8lBjNZdz04qPYhFte DLtc8NMrwOnSI1PockqmtmAavHPORVwsxaQ5GIl7NNC5t4PKyx6sOZyEfpTcDktt0YW5 oIRA== X-Forwarded-Encrypted: i=1; AJvYcCXPW8ziz4Y9Zoa3hRDXRPmmxdLA9tQIWo0DMpqZR4++oYk3FIN+xXbY6q9qW2caokhrJxplshhCh04xXRM=@vger.kernel.org X-Gm-Message-State: AOJu0YxVe2D35V8oDHKSBYQgeEa/Uc5I8sdAztbUUofzsCftN+Mvmpz4 UtGrYPKBMu1/ADILGq09OIccxX5igQb7Ab4zK2LHR36hZWqY9sRjm11BPCGg1qEtqfh9of5VpWI LeFyA X-Gm-Gg: ATEYQzy8FKXR4RZrZENJJ4lTFbgmxB83HNg3ZnMHKinwinHnfstDeYDRPnUGOzec0l/ MhnFJUBH5cWTJhIxHlzjqGIQKzjGLwcEHgcj0lUFFRL5ZgeULpNzLEdlZvvnDlGr/kJzUJQ5jjb tqY8wj6M7KZmveR97T6KKuX+ZJSHXJIrFI5km9IeL4WbWb0sG8EVxJU3riUMyRktxazHR1SoWzq Rp+aRWGGUKKUpfAbr9dP+Bsw3oRl+MSVGXoFSg+GUeelIt5ET7R8Xsu0a+8Ngwk6qnRDQR4kvjM gUCvCUwTouY/xLLrtkQNaaTA+vSZV2GKsslH1kC28itafafwJIVN9fw1ZHt15r7UbJ2go+z0mb7 XLZ5TbVo7T2YcLahu5A1uphmIoyNKRKdl3t6CrIL0zGayBlMXBOqLTaHvSPDFoZXycfzXPOyvtn sX5DLY0vr1qHB5jzXksyTkpu34Dx1QBoS+dkhP X-Received: by 2002:a05:600c:c044:b0:485:3177:d80c with SMTP id 5b1f17b1804b1-4853177d98fmr51806825e9.2.1773138263535; Tue, 10 Mar 2026 03:24:23 -0700 (PDT) Received: from localhost.localdomain ([202.127.77.110]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ae83e9c965sm150251325ad.32.2026.03.10.03.24.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Mar 2026 03:24:22 -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 1/1] ocfs2: split transactions in dio completion to avoid credit exhaustion Date: Tue, 10 Mar 2026 18:24:10 +0800 Message-ID: <20260310102413.12501-2-heming.zhao@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260310102413.12501-1-heming.zhao@suse.com> References: <20260310102413.12501-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 | 56 ++++++++++++++++++++----------------------------- 1 file changed, 23 insertions(+), 33 deletions(-) diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 09146b43d1f0..50b4d474b88c 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,23 +2314,18 @@ 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, @@ -2351,19 +2334,26 @@ static int ocfs2_dio_end_io_write(struct inode *ino= de, 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)) { - ret =3D ocfs2_set_inode_size(handle, inode, di_bh, end); +unlock: + up_write(&oi->ip_alloc_sem); + + /* everything looks good, let's start the cleanup and update i_size */ + 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); } -commit: - ocfs2_commit_trans(osb, handle); -unlock: - up_write(&oi->ip_alloc_sem); ocfs2_inode_unlock(inode, 1); brelse(di_bh); out: --=20 2.43.0