FAILED: Patch "ceph: supply snapshot context in ceph_zero_partial_object()" failed to apply to 6.1-stable tree
Subsystems (2)
Sasha Levin
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
Thanks,
Sasha
------------------ original commit in Linus's tree ------------------
From f16bd3fa74a2084ee7e16a8a2be7e7399b970907 Mon Sep 17 00:00:00 2001
From: ethanwu <[email protected]>
Date: Thu, 25 Sep 2025 18:42:05 +0800
Subject: [PATCH] ceph: supply snapshot context in ceph_zero_partial_object()
The ceph_zero_partial_object function was missing proper snapshot context for its OSD write operations, which could lead to data inconsistencies in snapshots.
Reproducer:../src/vstart.sh --new -x --localhost --bluestore
./bin/ceph auth caps client.fs_a mds 'allow rwps fsname=a' mon 'allow r fsname=a' osd 'allow rw tag cephfs data=a' mount -t ceph [email protected]=/ /mnt/mycephfs/ -o conf=./ceph.conf
dd if=/dev/urandom of=/mnt/mycephfs/foo bs=64K count=1
mkdir /mnt/mycephfs/.snap/snap1
md5sum /mnt/mycephfs/.snap/snap1/foo
fallocate -p -o 0 -l 4096 /mnt/mycephfs/foo
echo 3 > /proc/sys/vm/drop/caches
md5sum /mnt/mycephfs/.snap/snap1/foo # get different md5sum!!
--- fs/ceph/file.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-)
fs/ceph/file.c +16 -1
@@ -2568,6 +2568,7 @@ static int ceph_zero_partial_object(struct inode *inode,struct ceph_inode_info *ci =ceph_inode (inode);struct ceph_fs_client *fsc =ceph_inode_to_fs_client (inode);struct ceph_osd_request *req; +struct ceph_snap_context *snapc;int ret =0 ;loff_t zero =0 ;int op;
@@ -2582,12 +2583,25 @@ static int ceph_zero_partial_object(struct inode *inode, op =CEPH_OSD_OP_ZERO ; } +spin_lock (&ci->i_ceph_lock); +if (__ceph_have_pending_cap_snap (ci)) { +struct ceph_cap_snap *capsnap = +list_last_entry (&ci->i_cap_snaps, + struct ceph_cap_snap, + ci_item); + snapc =ceph_get_snap_context (capsnap->context); + }else { +BUG_ON (!ci->i_head_snapc); + snapc =ceph_get_snap_context (ci->i_head_snapc); + } +spin_unlock (&ci->i_ceph_lock); + req =ceph_osdc_new_request (&fsc->client->osdc, &ci->i_layout,ceph_vino (inode), offset, length,0 ,1 , op,CEPH_OSD_FLAG_WRITE , -NULL ,0 ,0 , false); + snapc,0 ,0 , false);if (IS_ERR (req)) { ret =PTR_ERR (req); goto out;
@@ -2601,6 +2615,7 @@ static int ceph_zero_partial_object(struct inode *inode,ceph_osdc_put_request (req); out: +ceph_put_snap_context (snapc);return ret; }
Signature · 1 line
2.51.0