Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

+26 -13
+8
fs/ceph/caps.c
··· 4634 4634 iput(inode); 4635 4635 spin_lock(&mdsc->cap_delay_lock); 4636 4636 } 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; 4637 4645 } 4638 4646 spin_unlock(&mdsc->cap_delay_lock); 4639 4647 doutc(cl, "done\n");
+18 -13
fs/ceph/file.c
··· 1138 1138 } 1139 1139 1140 1140 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; 1142 1147 while (left > 0) { 1143 1148 size_t plen, copied; 1144 1149 ··· 1172 1167 } 1173 1168 1174 1169 if (ret > 0) { 1175 - if (off > *ki_pos) { 1176 - if (off >= i_size) { 1177 - *retry_op = CHECK_EOF; 1178 - ret = i_size - *ki_pos; 1179 - *ki_pos = i_size; 1180 - } else { 1181 - ret = off - *ki_pos; 1182 - *ki_pos = off; 1183 - } 1170 + if (off >= i_size) { 1171 + *retry_op = CHECK_EOF; 1172 + ret = i_size - *ki_pos; 1173 + *ki_pos = i_size; 1174 + } else { 1175 + ret = off - *ki_pos; 1176 + *ki_pos = off; 1184 1177 } 1185 1178 1186 1179 if (last_objver) ··· 2129 2126 int statret; 2130 2127 struct page *page = NULL; 2131 2128 loff_t i_size; 2129 + int mask = CEPH_STAT_CAP_SIZE; 2132 2130 if (retry_op == READ_INLINE) { 2133 2131 page = __page_cache_alloc(GFP_KERNEL); 2134 2132 if (!page) 2135 2133 return -ENOMEM; 2134 + 2135 + mask = CEPH_STAT_CAP_INLINE_DATA; 2136 2136 } 2137 2137 2138 - statret = __ceph_do_getattr(inode, page, 2139 - CEPH_STAT_CAP_INLINE_DATA, !!page); 2138 + statret = __ceph_do_getattr(inode, page, mask, !!page); 2140 2139 if (statret < 0) { 2141 2140 if (page) 2142 2141 __free_page(page); ··· 2179 2174 /* hit EOF or hole? */ 2180 2175 if (retry_op == CHECK_EOF && iocb->ki_pos < i_size && 2181 2176 ret < len) { 2182 - doutc(cl, "hit hole, ppos %lld < size %lld, reading more\n", 2177 + doutc(cl, "may hit hole, ppos %lld < size %lld, reading more\n", 2183 2178 iocb->ki_pos, i_size); 2184 2179 2185 2180 read += ret;