From nobody Sun Jun 14 08:20:34 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 4643733A6EB for ; Thu, 2 Apr 2026 02:27:06 +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=1775096827; cv=none; b=Vk20qAH2+TcsDHz3+gfJpnfnkbxrpmPvizPlFTMLIeTqz0yxd2PRPhgPBqONHWDhzSes7pfsQlADjxkzGPaJpmPM0+K9N6okx6WoEBykbqjdxeJVsLwuFrQngVg8Svt4Avy3UgqC2wFQ/2FvUguvRjggoHQ/MSyhoWxWpo4kZGQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775096827; c=relaxed/simple; bh=GiIclVWQHexOzu5lM/R6he1wcQTSIX4oFMTch1lZKH4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YXmg+nEGoUjw2Cse3GI2Zb0tmPdO33Jf0+td6vadjEM5vDBrtINYk4RTi6ouDmAalHy1mkrLz3EKrke/c4PTYI1cLpAolu56gjf0Je0vGELZFSUfICuUUSafz4Ha5bZWHk9R7/TrKNhuUNvkmlagR+xQxh/B6zrYWH+ZSgR/mvQ= 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=ZdGnKZS1; 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="ZdGnKZS1" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-4853a5ffc05so861565e9.0 for ; Wed, 01 Apr 2026 19:27:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1775096825; x=1775701625; 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=5taoFtsIX/OcxB0oYunjH+s7OHrNZ2jsC79Mj+cKZ1A=; b=ZdGnKZS1UY5C7VQzkEXew4by1+XSZFbxDAWiCr0Yjr1/SBrYU95h3msbtw/LEN05Fn vEO8U/XFrEpEzEW0ME0YUzHxhLkF83kCewJzZ8gIZtG3SVukPuh+Xtm1eK1HGiupdNQ+ hePrVGd4hGlRb+3+TKNpDLr7P4T0UXmkYvRglJZLGo8w0Zo1aVgke/Xn8GYGyHMK6LS/ gzXPpvq+Gzp2V72aU5cvDWZdwK+vH2CYVjti6/7HVEE2fKhSfgo5FOdbqWAlWb6Q08Dg M1kNGrX+UOEeaZWxaLEUn8eS73HN2WPfV3dVU6A0oDKktWTIsB7e+1Vttsag2qjry37D SgdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775096825; x=1775701625; 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=5taoFtsIX/OcxB0oYunjH+s7OHrNZ2jsC79Mj+cKZ1A=; b=sUYETXQSuD/98ehqFfcaM0VE3KfIqfTf9N3Ne/IKXjDmmVRCCbgocjdZBHzpDCk+Ge u6qyPmD0zUmc7q8HQXl+wB+rbYdToan+hwpE3rtA0cxHAP968W9tF+tS2Hwcza1at++K id/KR33+fpELjCCPjU1YYRO4ORqMqhkIS42Rk872lbQtbMKsxHcjLgQz+jyqaW6cIOek 9SJKel7ed/PCL2NZaaD1xe1x9Gl2VSSK7cw125SzXbG4JfxQ4rzAETU83khzoWV2cmyu VRHNv0SsOFTDvL1Mrg2Oca0JKzp56Mb6eaXoEHVouOO5vp6f9JElnwzxD/+PnSF747BD MWSQ== X-Forwarded-Encrypted: i=1; AJvYcCWBfOdz5u7PFO8KUN98aCCi9NVojKaBGnuQ/aD/mMyXwWbs+a3cyxiq5NH+B5cIyDP6/bLDdh3vPFu4+A0=@vger.kernel.org X-Gm-Message-State: AOJu0Yyh9yKqy3pqTC3MZ3tnT9QpdGFhMgqfLHuHGhkImvD4hzDkDfur tOR/HqPXqNUWqp2r6SClRcNU1p075qiyjqSLKArl19rpS/D2+neGATuWMx+nV3c/1to= X-Gm-Gg: ATEYQzwpegfIJtbsGZbAR8Ydwwsa/yVaqfZ4B7ZEAeGJfc0K3DcXxlAx7MULrUEwaWZ k+wfIGFC6EpN+U4rL4znaSifzBZ9aet5BeXgf+eHRIwiDEGptBdme9is40oezDFHObd5+ru4EMW aozZ2jNDlTC4xtFfsSTe9tQ9ikr2/2Ykv1uiyoRjntM3CJMrkt5znOYsw5QUF9mjK63Llw+Fp7+ vaTqbuT8PL5oAcVkwXGRS+9/Z8biPyYtcvHZvQs/4Aqx3DALlWXNMPD49IQ2nTRsxi5zhcUdsAD 1CseUrNlgA2zxsT76UiM+AkRCV4JWNRgGR5Dw/rjFOz/AC1MDmyEY2k+nf5YQMQkabDX19dZrX9 mhrF/IZTVS7RQk72H9Prl749CLEb0I2ne1Dt2QUTIW9lr269U53JrhGMOcf2HV2qgREaFbVflHR CPRVW80A1qWhCD/bf9az1hvP5j6u6jZwEc46kR X-Received: by 2002:a05:600c:609b:b0:488:8d97:9982 with SMTP id 5b1f17b1804b1-4888d979adfmr6925725e9.1.1775096824577; Wed, 01 Apr 2026 19:27:04 -0700 (PDT) Received: from localhost.localdomain ([202.127.77.110]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82cf9ca1869sm1268600b3a.56.2026.04.01.19.27.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Apr 2026 19:27:03 -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 v6 1/1] ocfs2: split transactions in dio completion to avoid credit exhaustion Date: Thu, 2 Apr 2026 10:26:54 +0800 Message-ID: <20260402022655.19714-2-heming.zhao@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260402022655.19714-1-heming.zhao@suse.com> References: <20260402022655.19714-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 | 71 ++++++++++++++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 28 deletions(-) diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 09146b43d1f0..0c88f751ffd5 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 (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); 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