mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
libceph: only set read_from_replica on read requests
ceph_osdc_alloc_request() ORs the mount option's read_from_replica
flag into r_flags for every request, writes included. The flag is
meant for reads: calc_target() skips the replica choice for any
request that has CEPH_OSD_FLAG_WRITE, and the OSDs only know
BALANCE_READS on read ops. Sending it on writes is at best ignored;
with read_from_replica=balance a buffered write that fell back to
ceph_sync_write() after losing BUFFER to a revoke failed with -EIO,
while the same run without the option works fine.
Gate the flag on CEPH_OSD_FLAG_READ.
Cc: stable@vger.kernel.org
Fixes: 22d2cfdffa ("libceph: move away from global osd_req_flags")
Assisted-by: Cursor
Signed-off-by: Xiubo Li <xiubo.li@clyso.com>
Reviewed-by: Alex Markuze <amarkuze@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
488ffbdd99
commit
d6c7a5fcd0
|
|
@ -1108,7 +1108,9 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
|
|||
req->r_base_oloc.pool = layout->pool_id;
|
||||
req->r_base_oloc.pool_ns = ceph_try_get_string(layout->pool_ns);
|
||||
ceph_oid_printf(&req->r_base_oid, "%llx.%08llx", vino.ino, objnum);
|
||||
req->r_flags = flags | osdc->client->options->read_from_replica;
|
||||
req->r_flags = flags;
|
||||
if (flags & CEPH_OSD_FLAG_READ)
|
||||
req->r_flags |= osdc->client->options->read_from_replica;
|
||||
|
||||
req->r_snapid = vino.snap;
|
||||
if (flags & CEPH_OSD_FLAG_WRITE)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user