From nobody Thu Apr 2 17:10:50 2026 Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) (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 3E91338837A for ; Thu, 2 Apr 2026 13:43:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775137421; cv=none; b=iQ6OujHzm3XH681G9FoKrQ/noAAgIVvQx6Z26ODg1cvLTHc9XswB0Ag56m4P/O78WoD21GOcc27cYyGxDt8USD017UJRsv7Un7DgWcfS4LTmn4AqsN/T+ImwtRsfiOAomOfYsgrB7aGvre4HmyIhsBNKOrnB2qGwytjCnUQHqFU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775137421; c=relaxed/simple; bh=yVZKDa6VD49DdaL+VDlExAusZJ/dxStoEWV7ymKWon8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CaQI5c+pfRT01HOazl4o9icBKBFP9/YpHWgB/U2hx313L19Pf3+lq0/BdSlCLvC3xUb+aEONFB3Dy6qeO/hjR7zve9YlD0qLyV9AWlXk+cmKuFkeQCoS/2LYSMQi7xGG249+E5IKQCAtvb4TSLaVg4KZeS+E8f3tVECtx0WjeIs= 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=crGzhoGK; arc=none smtp.client-ip=209.85.221.45 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="crGzhoGK" Received: by mail-wr1-f45.google.com with SMTP id ffacd0b85a97d-43d0292ae5aso61674f8f.0 for ; Thu, 02 Apr 2026 06:43:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1775137418; x=1775742218; 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=203AgTqpEjje4gfAw3GCnUOhtN5N4IBxGU60/MF8728=; b=crGzhoGKr/51QsNzs32/QBe3WLXVAljxpcjndCP0t/QFYFkSDzQu9wAdcPxTgFWxRC oZK//5a+7OgXRS88IWgvvZiI+cgf9y7oNjQsTmATb0XMEC2h//BtySrHhZ3b2I5l+T3N qmsbNRzfjrj4mBLK3q2lYLPX0KCDbt5JtbaNfVH0K3yc7EqQrUsKQ4/Vb4d09pGUnuRB pqCICf8ejrqxOBgAoru2DRkbUDkECaUceNpViOKasLLALY2B7EeL6HtnLuqgPyvffSzQ dZvphuY1TnQb4isNqhSvBh0OZXq66YFYIVhryjoKrTjPIiPZotBUkhFGu+Yxc8Ui9OHL vUXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775137418; x=1775742218; 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=203AgTqpEjje4gfAw3GCnUOhtN5N4IBxGU60/MF8728=; b=eUEIO5RP2bxp5KIbXLZXXwWx2tjD0Ig8oe9nN0bnVBCiOp+XinPUfaFr3gYnr8LGkw iOromgCFD/kN3aPqfCvTXf1L0Jh0rn/ck8Wb9EYDolkDD02yij74al2E+rq4IgIthIHm ZVw0itvdbWjZOYnE6304MaabbTwyA3kwFxYUWCain/cbR3rCtDqeh+/BQzmwveQB+R8X usVGWThlSN78/UDqlXsrb08DPsPKUioqLlpbOVj+Cdm4hOwbnUhtxM8APDT1DaIlojya wfU9f3gkQz+zUGBoFMobD1r8DW9Ftkm6P9FGEp2qnXhB5gRoynYNvfCJs2KUpVAkT/QK c5kQ== X-Forwarded-Encrypted: i=1; AJvYcCXx0FeLz8I0YrqxGUOAmmvQuupwb0tJ40CcDW+iR23Xtj+T1rJ6Pd81K6qBhFibreW5oUO8iRKGqNYixMI=@vger.kernel.org X-Gm-Message-State: AOJu0YyZJLv2pADuspH46LgoHMzkQ5DDXUsjL9H+9LFIFzT6KTWcYOYC jEIQf8uOJG2YEozn1e4wxONp9hdjXhq/N+Q6pWHjOie6Gx3lV7151bcdbvOLq3I1kSw= X-Gm-Gg: ATEYQzxWtlwfhsYVShMfr9tcP9sXn5HDQJgMrj8slLhZaRHeUKiujANl+PuOre+icPO +le4+B1NgbuKl/rAd2yFIftb8BGvsj2uXoW99QBXcJZRlQkQZJt6DtqDAnu5fX2mbF1WxFY9G5r dNyqTrw0de0Y26DUYN0ZeZFkza7yrM14MYr0XQWUtBaYKlwYwAyS5QnFPDKv3YYYavEOjmMnXoW AAwX9ylAoRePtDhwusdm23Cel+GvHb4Y0kDjo3JGm3CxAflpK/etZnNQ5SyDBDWpAyln4UDdNL5 A8YW0LMCmys56HPxVXTsY4ujsemJgzD4z9GEhw4gQkts2pJCF16DT09FQ1lSDNxG1UTYCcMGyVz QhfOEBy/A+Z/uVGDsI2dmu/hNhXGWIDAxwNP2KFlSY6LeTNMnDW+UlACXNSnBBfPvYuzTgBi4zX XtlY5EOrRHRRxXV+ThnWm8qfzF0soD/t54vZbMZDqkxAyJCx0= X-Received: by 2002:a05:600c:524f:b0:486:f634:f2e with SMTP id 5b1f17b1804b1-48883593358mr76958785e9.4.1775137418478; Thu, 02 Apr 2026 06:43:38 -0700 (PDT) Received: from localhost.localdomain ([202.127.77.110]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b27497c0f3sm31468005ad.41.2026.04.02.06.43.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Apr 2026 06:43:37 -0700 (PDT) From: Heming Zhao To: joseph.qi@linux.alibaba.com Cc: Heming Zhao , ocfs2-devel@lists.linux.dev, linux-kernel@vger.kernel.org, jack@suse.cz, glass.su@suse.com Subject: [PATCH v8 1/1] ocfs2: split transactions in dio completion to avoid credit exhaustion Date: Thu, 2 Apr 2026 21:43:27 +0800 Message-ID: <20260402134328.27334-2-heming.zhao@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260402134328.27334-1-heming.zhao@suse.com> References: <20260402134328.27334-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 trace: 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 | 74 ++++++++++++++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 29 deletions(-) diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 09146b43d1f0..c6dbec1693b1 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,44 @@ 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 (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 (!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