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.

cachefiles: extract write routine

Extract the generic routine of writing data to cache files, and make it
generally available.

This will be used by the following patch implementing on-demand read
mode. Since it's called inside CacheFiles module, make the interface
generic and unrelated to netfs_cache_resources.

It is worth noting that, ki->inval_counter is not initialized after
this cleanup. It shall not make any visible difference, since
inval_counter is no longer used in the write completion routine, i.e.
cachefiles_write_complete().

Signed-off-by: Jeffle Xu <jefflexu@linux.alibaba.com>
Acked-by: David Howells <dhowells@redhat.com>
Link: https://lore.kernel.org/r/20220425122143.56815-2-jefflexu@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>

authored by

Jeffle Xu and committed by
Gao Xiang
a06fac15 6c459b78

+45 -26
+10
fs/cachefiles/internal.h
··· 201 201 */ 202 202 extern bool cachefiles_begin_operation(struct netfs_cache_resources *cres, 203 203 enum fscache_want_state want_state); 204 + extern int __cachefiles_prepare_write(struct cachefiles_object *object, 205 + struct file *file, 206 + loff_t *_start, size_t *_len, 207 + bool no_space_allocated_yet); 208 + extern int __cachefiles_write(struct cachefiles_object *object, 209 + struct file *file, 210 + loff_t start_pos, 211 + struct iov_iter *iter, 212 + netfs_io_terminated_t term_func, 213 + void *term_func_priv); 204 214 205 215 /* 206 216 * key.c
+35 -26
fs/cachefiles/io.c
··· 277 277 /* 278 278 * Initiate a write to the cache. 279 279 */ 280 - static int cachefiles_write(struct netfs_cache_resources *cres, 281 - loff_t start_pos, 282 - struct iov_iter *iter, 283 - netfs_io_terminated_t term_func, 284 - void *term_func_priv) 280 + int __cachefiles_write(struct cachefiles_object *object, 281 + struct file *file, 282 + loff_t start_pos, 283 + struct iov_iter *iter, 284 + netfs_io_terminated_t term_func, 285 + void *term_func_priv) 285 286 { 286 - struct cachefiles_object *object; 287 287 struct cachefiles_cache *cache; 288 288 struct cachefiles_kiocb *ki; 289 289 struct inode *inode; 290 - struct file *file; 291 290 unsigned int old_nofs; 292 - ssize_t ret = -ENOBUFS; 291 + ssize_t ret; 293 292 size_t len = iov_iter_count(iter); 294 293 295 - if (!fscache_wait_for_operation(cres, FSCACHE_WANT_WRITE)) 296 - goto presubmission_error; 297 294 fscache_count_write(); 298 - object = cachefiles_cres_object(cres); 299 295 cache = object->volume->cache; 300 - file = cachefiles_cres_file(cres); 301 296 302 297 _enter("%pD,%li,%llx,%zx/%llx", 303 298 file, file_inode(file)->i_ino, start_pos, len, 304 299 i_size_read(file_inode(file))); 305 300 306 - ret = -ENOMEM; 307 301 ki = kzalloc(sizeof(struct cachefiles_kiocb), GFP_KERNEL); 308 - if (!ki) 309 - goto presubmission_error; 302 + if (!ki) { 303 + if (term_func) 304 + term_func(term_func_priv, -ENOMEM, false); 305 + return -ENOMEM; 306 + } 310 307 311 308 refcount_set(&ki->ki_refcnt, 2); 312 309 ki->iocb.ki_filp = file; ··· 311 314 ki->iocb.ki_flags = IOCB_DIRECT | IOCB_WRITE; 312 315 ki->iocb.ki_ioprio = get_current_ioprio(); 313 316 ki->object = object; 314 - ki->inval_counter = cres->inval_counter; 315 317 ki->start = start_pos; 316 318 ki->len = len; 317 319 ki->term_func = term_func; ··· 365 369 cachefiles_put_kiocb(ki); 366 370 _leave(" = %zd", ret); 367 371 return ret; 372 + } 368 373 369 - presubmission_error: 370 - if (term_func) 371 - term_func(term_func_priv, ret, false); 372 - return ret; 374 + static int cachefiles_write(struct netfs_cache_resources *cres, 375 + loff_t start_pos, 376 + struct iov_iter *iter, 377 + netfs_io_terminated_t term_func, 378 + void *term_func_priv) 379 + { 380 + if (!fscache_wait_for_operation(cres, FSCACHE_WANT_WRITE)) { 381 + if (term_func) 382 + term_func(term_func_priv, -ENOBUFS, false); 383 + return -ENOBUFS; 384 + } 385 + 386 + return __cachefiles_write(cachefiles_cres_object(cres), 387 + cachefiles_cres_file(cres), 388 + start_pos, iter, 389 + term_func, term_func_priv); 373 390 } 374 391 375 392 /* ··· 493 484 /* 494 485 * Prepare for a write to occur. 495 486 */ 496 - static int __cachefiles_prepare_write(struct netfs_cache_resources *cres, 497 - loff_t *_start, size_t *_len, loff_t i_size, 498 - bool no_space_allocated_yet) 487 + int __cachefiles_prepare_write(struct cachefiles_object *object, 488 + struct file *file, 489 + loff_t *_start, size_t *_len, 490 + bool no_space_allocated_yet) 499 491 { 500 - struct cachefiles_object *object = cachefiles_cres_object(cres); 501 492 struct cachefiles_cache *cache = object->volume->cache; 502 - struct file *file = cachefiles_cres_file(cres); 503 493 loff_t start = *_start, pos; 504 494 size_t len = *_len, down; 505 495 int ret; ··· 585 577 } 586 578 587 579 cachefiles_begin_secure(cache, &saved_cred); 588 - ret = __cachefiles_prepare_write(cres, _start, _len, i_size, 580 + ret = __cachefiles_prepare_write(object, cachefiles_cres_file(cres), 581 + _start, _len, 589 582 no_space_allocated_yet); 590 583 cachefiles_end_secure(cache, saved_cred); 591 584 return ret;