Skip to content

Commit ff9c18e

Browse files
committed
Merge tag 'ceph-for-6.9-rc1' of https://github.com/ceph/ceph-client
Pull ceph updates from Ilya Dryomov: "A patch to minimize blockage when processing very large batches of dirty caps and two fixes to better handle EOF in the face of multiple clients performing reads and size-extending writes at the same time" * tag 'ceph-for-6.9-rc1' of https://github.com/ceph/ceph-client: ceph: set correct cap mask for getattr request for read ceph: stop copying to iter at EOF on sync reads ceph: remove SLAB_MEM_SPREAD flag usage ceph: break the check delayed cap loop every 5s
2 parents 6f6efce + 825b82f commit ff9c18e

File tree

2 files changed

+26
-13
lines changed

2 files changed

+26
-13
lines changed

fs/ceph/caps.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4634,6 +4634,14 @@ unsigned long ceph_check_delayed_caps(struct ceph_mds_client *mdsc)
46344634
iput(inode);
46354635
spin_lock(&mdsc->cap_delay_lock);
46364636
}
4637+
4638+
/*
4639+
* Make sure too many dirty caps or general
4640+
* slowness doesn't block mdsc delayed work,
4641+
* preventing send_renew_caps() from running.
4642+
*/
4643+
if (jiffies - loop_start >= 5 * HZ)
4644+
break;
46374645
}
46384646
spin_unlock(&mdsc->cap_delay_lock);
46394647
doutc(cl, "done\n");

fs/ceph/file.c

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,7 +1138,12 @@ ssize_t __ceph_sync_read(struct inode *inode, loff_t *ki_pos,
11381138
}
11391139

11401140
idx = 0;
1141-
left = ret > 0 ? ret : 0;
1141+
if (ret <= 0)
1142+
left = 0;
1143+
else if (off + ret > i_size)
1144+
left = i_size - off;
1145+
else
1146+
left = ret;
11421147
while (left > 0) {
11431148
size_t plen, copied;
11441149

@@ -1167,15 +1172,13 @@ ssize_t __ceph_sync_read(struct inode *inode, loff_t *ki_pos,
11671172
}
11681173

11691174
if (ret > 0) {
1170-
if (off > *ki_pos) {
1171-
if (off >= i_size) {
1172-
*retry_op = CHECK_EOF;
1173-
ret = i_size - *ki_pos;
1174-
*ki_pos = i_size;
1175-
} else {
1176-
ret = off - *ki_pos;
1177-
*ki_pos = off;
1178-
}
1175+
if (off >= i_size) {
1176+
*retry_op = CHECK_EOF;
1177+
ret = i_size - *ki_pos;
1178+
*ki_pos = i_size;
1179+
} else {
1180+
ret = off - *ki_pos;
1181+
*ki_pos = off;
11791182
}
11801183

11811184
if (last_objver)
@@ -2126,14 +2129,16 @@ static ssize_t ceph_read_iter(struct kiocb *iocb, struct iov_iter *to)
21262129
int statret;
21272130
struct page *page = NULL;
21282131
loff_t i_size;
2132+
int mask = CEPH_STAT_CAP_SIZE;
21292133
if (retry_op == READ_INLINE) {
21302134
page = __page_cache_alloc(GFP_KERNEL);
21312135
if (!page)
21322136
return -ENOMEM;
2137+
2138+
mask = CEPH_STAT_CAP_INLINE_DATA;
21332139
}
21342140

2135-
statret = __ceph_do_getattr(inode, page,
2136-
CEPH_STAT_CAP_INLINE_DATA, !!page);
2141+
statret = __ceph_do_getattr(inode, page, mask, !!page);
21372142
if (statret < 0) {
21382143
if (page)
21392144
__free_page(page);
@@ -2174,7 +2179,7 @@ static ssize_t ceph_read_iter(struct kiocb *iocb, struct iov_iter *to)
21742179
/* hit EOF or hole? */
21752180
if (retry_op == CHECK_EOF && iocb->ki_pos < i_size &&
21762181
ret < len) {
2177-
doutc(cl, "hit hole, ppos %lld < size %lld, reading more\n",
2182+
doutc(cl, "may hit hole, ppos %lld < size %lld, reading more\n",
21782183
iocb->ki_pos, i_size);
21792184

21802185
read += ret;

0 commit comments

Comments
 (0)