From nobody Tue Sep 29 01:18:18 2026 Received: from mail-pj1-f50.google.com (mail-pj1-f50.google.com [209.85.216.50]) (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 1D7DB3644A2 for ; Fri, 14 Aug 2026 10:53:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786704811; cv=none; b=eIu1+rTjWYAVSnUO70OVtebcdGT2fWfaB/4MzIlDDhug6kFsbFrfkhAFWXjatM63S9uihX83x/BNJhLsOGegjU2F6mfkKH+cq+xZ7odh2M14ZU0ZTikIWqnYcAS3OQorMmljvz8/zhD1GbF4ADD0Z10hPyF7lF02ol1gQCnr8qk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786704811; c=relaxed/simple; bh=Adn0gu1LSigpw3Qze7Wr4bf6YF4wJHrDCNsjvzL99ps=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=epRKLaXrLduHgoyR/cejg7nucGz6yICXmbC0vwrclUHl5cyymd/yRRqbS14zfXOCYoXGeix3YjWVPw84k4QKlpKEzR1wWJDFmKsYOGhnJXfWsFTmUIQnS5MxOdeZ8J1kVXXsdtE33DU5REh7fKvm8sK8mYnzqq6cze+useAkPeQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=dYE+iyd5; arc=none smtp.client-ip=209.85.216.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="dYE+iyd5" Received: by mail-pj1-f50.google.com with SMTP id 98e67ed59e1d1-383b4a3755fso901464a91.3 for ; Fri, 14 Aug 2026 03:53:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786704802; x=1787309602; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=uh+z5qK+5hJqxFnzXnj40mnpcN/ipc9PC4qTgpoZZhA=; b=dYE+iyd5h3N/NstI0y5m8Np2r99vCRiCao5Hpy4Wo3fw1ksPXNhQuKKbjPgqdbdbcJ iBPVUy4UKB91/AA6gIpAIDymEEYVmDvZSymH7MMSOVyECDWEWH/RNKqDLYkz7vxSowdP G6aL7YJY70JpYpyNLwNR9sMV288pX3frWJ9PD5RFOTOY3GXGU7zEK66zGeKXrK92ZuBn YRlGAXtVyy8dcGcvlOQNGRHJWwEe1duUqa9hBUa0vbBN/taQmRnc/x+nJN8/wHFTq4o5 6OJZBZrG8VZF6Hdg516iZ1UFxAFmE6PTpGnUafQm82ig1frfQDvB64UqAPNIlbzwDH1s TtiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786704802; x=1787309602; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=uh+z5qK+5hJqxFnzXnj40mnpcN/ipc9PC4qTgpoZZhA=; b=W/24oZEGM/44O5PMhQyi4Gxk7c/JACaedQ5AJ77Hz8qU7DGGMXYKPRzOPrBtiUdFTX kwEk6j0NgcpvJygAJfdMPRAqKj4nFPbqYLeTwlT47E2X+ic47eD3Z3h/dMFV5+juShAi ETRNobgpFVXng/AwOGU+FvRKSO9IZBH8s0dwNKpRvOD8XD8yFa/8v/lY0GNsZVXUWbab vlrHjPrGfOMSYOj4FNFUECHjSM1DLaBWSeTuzEURhlFffvfuQXhhLMj01nGdU4iW2zZl o4eUzu+OvrJm5EWZu23Xf9gbcMQ7EkAjJdhpEwhEFiMXlPOAYYJDAhlJpT+iqu74jKEg tDPw== X-Forwarded-Encrypted: i=1; AHgh+RoENNO6GMwPWnWqShIkPOTlGAM/eRs9Qw89PJkwxlZro55rGIPL/aJfm21Lr5eXvfuQBonMxqcO8RCN+vI=@vger.kernel.org X-Gm-Message-State: AOJu0YwO0XTg9ozWe2YNiXZZqR8IW29PNk3/LLCrW0cebvhPXQ9rywNV fSeZlKEcVvFHNGW9PhBRwv+V50cSvZ1/et7cpwdzaWDlwOTu7Y+TeM+1 X-Gm-Gg: AR+sD13Ds6Ud4UEJbvTrBxQnt9S2MXQKGY27dSuPSOU1qjFXk05WK5ho0Ei3KT5MmNd I4WyqJxxsgGEEGQNLOHUZ7P+6+W1JxKwFu6StBER52/NfrrPkpl4RAH5F/x9oTjJ6zMpKCy3GGp gbRko51a0ssQD8vqq/FKODLtt73KHkOt8c0Y8VT4OU4APv6hh7eNRR2uFa6sArDnH3X0+3iEgK1 +WV4AiDeIbvkB3f4nmMw7RFhBhTTGsttpdtYMRBBCCRn7noehaJek4UqHmwjThucc36xjdSk85/ i6G7cd2Kw9ztn1TIanwn+I0BIZfdP6K8GXiHmiFRw6/eGkAV+drq/h7lJkS/2rqmJ3a6HiC/a18 cIePQwc5f9oIm/mwReUNpGy1xnTLia3QNF1SqHXm8GBU0N5rSTvLUpAwxX+4OTrZZWnv5LEbXY4 sngNjrTzknJH1/Xmr6OCD8IUAPqqR66MO/uXLHP/Y4qSihLVyb2e1sJIPdkgGOIidUeimEXGtjG 3DYjhEplvHBDlhKCh87lqBWRC+TLoirhq8EEJte1CvDK1ZdkeY8EI3PdqcSQtmc X-Received: by 2002:a17:90b:134c:b0:38d:ef48:b04 with SMTP id 98e67ed59e1d1-3933b8721a1mr5379585a91.10.1786704802225; Fri, 14 Aug 2026 03:53:22 -0700 (PDT) Received: from codespaces-2362ac.m2fxbej512jepnsor2itp05j3d.ix.internal.cloudapp.net ([207.46.224.86]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-394eb752fe2sm2305268a91.14.2026.08.14.03.53.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Aug 2026 03:53:19 -0700 (PDT) From: Seongjae Jeong To: jaegeuk@kernel.org, chao@kernel.org Cc: hans.holmberg@wdc.com, yonggil.song@samsung.com, linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org, Seongjae Jeong Subject: [PATCH] f2fs: fix O_DIRECT cleanup range for append writes Date: Fri, 14 Aug 2026 10:52:34 +0000 Message-ID: <20260814105234.31620-1-jsjlee1020@gmail.com> X-Mailer: git-send-email 2.53.0 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" When an O_DIRECT write falls back to buffered I/O, f2fs_flush_buffered_write() uses orig_pos to flush and invalidate the page cache. For O_APPEND writes, f2fs_write_checks() updates iocb->ki_pos to the end of the file after orig_pos has been saved. As a result, the cleanup range can differ from the actual buffered write range. Save the write position after f2fs_write_checks() and use it for the forced buffered I/O cleanup. Fixes: 92318f20d703 ("f2fs: preserve direct write semantics when buffering = is forced") Signed-off-by: Seongjae Jeong --- fs/f2fs/file.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index b99d9cdf9ba7..bf61545603e5 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -5313,6 +5313,7 @@ static ssize_t f2fs_file_write_iter(struct kiocb *ioc= b, struct iov_iter *from) const loff_t pos =3D iocb->ki_pos; const ssize_t count =3D iov_iter_count(from); ssize_t ret; + loff_t bufio_start_pos; =20 if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) { ret =3D -EIO; @@ -5343,6 +5344,8 @@ static ssize_t f2fs_file_write_iter(struct kiocb *ioc= b, struct iov_iter *from) if (ret <=3D 0) goto out_unlock; =20 + bufio_start_pos =3D iocb->ki_pos; + /* Determine whether we will do a direct write or a buffered write. */ dio =3D f2fs_should_use_dio(inode, iocb, from); =20 @@ -5396,8 +5399,8 @@ static ssize_t f2fs_file_write_iter(struct kiocb *ioc= b, struct iov_iter *from) */ if (ret > 0 && !dio && (iocb->ki_flags & IOCB_DIRECT)) f2fs_flush_buffered_write(iocb->ki_filp->f_mapping, - orig_pos, - orig_pos + ret - 1); + bufio_start_pos, + bufio_start_pos + ret - 1); =20 return ret; } --=20 2.53.0