Commit a06fac15 authored by Jeffle Xu's avatar Jeffle Xu Committed by Gao Xiang

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: default avatarJeffle Xu <jefflexu@linux.alibaba.com>
Acked-by: default avatarDavid Howells <dhowells@redhat.com>
Link: https://lore.kernel.org/r/20220425122143.56815-2-jefflexu@linux.alibaba.comSigned-off-by: default avatarGao Xiang <hsiangkao@linux.alibaba.com>
parent 6c459b78
...@@ -201,6 +201,16 @@ extern void cachefiles_put_object(struct cachefiles_object *object, ...@@ -201,6 +201,16 @@ extern void cachefiles_put_object(struct cachefiles_object *object,
*/ */
extern bool cachefiles_begin_operation(struct netfs_cache_resources *cres, extern bool cachefiles_begin_operation(struct netfs_cache_resources *cres,
enum fscache_want_state want_state); enum fscache_want_state want_state);
extern int __cachefiles_prepare_write(struct cachefiles_object *object,
struct file *file,
loff_t *_start, size_t *_len,
bool no_space_allocated_yet);
extern int __cachefiles_write(struct cachefiles_object *object,
struct file *file,
loff_t start_pos,
struct iov_iter *iter,
netfs_io_terminated_t term_func,
void *term_func_priv);
/* /*
* key.c * key.c
......
...@@ -277,36 +277,33 @@ static void cachefiles_write_complete(struct kiocb *iocb, long ret) ...@@ -277,36 +277,33 @@ static void cachefiles_write_complete(struct kiocb *iocb, long ret)
/* /*
* Initiate a write to the cache. * Initiate a write to the cache.
*/ */
static int cachefiles_write(struct netfs_cache_resources *cres, int __cachefiles_write(struct cachefiles_object *object,
struct file *file,
loff_t start_pos, loff_t start_pos,
struct iov_iter *iter, struct iov_iter *iter,
netfs_io_terminated_t term_func, netfs_io_terminated_t term_func,
void *term_func_priv) void *term_func_priv)
{ {
struct cachefiles_object *object;
struct cachefiles_cache *cache; struct cachefiles_cache *cache;
struct cachefiles_kiocb *ki; struct cachefiles_kiocb *ki;
struct inode *inode; struct inode *inode;
struct file *file;
unsigned int old_nofs; unsigned int old_nofs;
ssize_t ret = -ENOBUFS; ssize_t ret;
size_t len = iov_iter_count(iter); size_t len = iov_iter_count(iter);
if (!fscache_wait_for_operation(cres, FSCACHE_WANT_WRITE))
goto presubmission_error;
fscache_count_write(); fscache_count_write();
object = cachefiles_cres_object(cres);
cache = object->volume->cache; cache = object->volume->cache;
file = cachefiles_cres_file(cres);
_enter("%pD,%li,%llx,%zx/%llx", _enter("%pD,%li,%llx,%zx/%llx",
file, file_inode(file)->i_ino, start_pos, len, file, file_inode(file)->i_ino, start_pos, len,
i_size_read(file_inode(file))); i_size_read(file_inode(file)));
ret = -ENOMEM;
ki = kzalloc(sizeof(struct cachefiles_kiocb), GFP_KERNEL); ki = kzalloc(sizeof(struct cachefiles_kiocb), GFP_KERNEL);
if (!ki) if (!ki) {
goto presubmission_error; if (term_func)
term_func(term_func_priv, -ENOMEM, false);
return -ENOMEM;
}
refcount_set(&ki->ki_refcnt, 2); refcount_set(&ki->ki_refcnt, 2);
ki->iocb.ki_filp = file; ki->iocb.ki_filp = file;
...@@ -314,7 +311,6 @@ static int cachefiles_write(struct netfs_cache_resources *cres, ...@@ -314,7 +311,6 @@ static int cachefiles_write(struct netfs_cache_resources *cres,
ki->iocb.ki_flags = IOCB_DIRECT | IOCB_WRITE; ki->iocb.ki_flags = IOCB_DIRECT | IOCB_WRITE;
ki->iocb.ki_ioprio = get_current_ioprio(); ki->iocb.ki_ioprio = get_current_ioprio();
ki->object = object; ki->object = object;
ki->inval_counter = cres->inval_counter;
ki->start = start_pos; ki->start = start_pos;
ki->len = len; ki->len = len;
ki->term_func = term_func; ki->term_func = term_func;
...@@ -369,11 +365,24 @@ static int cachefiles_write(struct netfs_cache_resources *cres, ...@@ -369,11 +365,24 @@ static int cachefiles_write(struct netfs_cache_resources *cres,
cachefiles_put_kiocb(ki); cachefiles_put_kiocb(ki);
_leave(" = %zd", ret); _leave(" = %zd", ret);
return ret; return ret;
}
presubmission_error: static int cachefiles_write(struct netfs_cache_resources *cres,
loff_t start_pos,
struct iov_iter *iter,
netfs_io_terminated_t term_func,
void *term_func_priv)
{
if (!fscache_wait_for_operation(cres, FSCACHE_WANT_WRITE)) {
if (term_func) if (term_func)
term_func(term_func_priv, ret, false); term_func(term_func_priv, -ENOBUFS, false);
return ret; return -ENOBUFS;
}
return __cachefiles_write(cachefiles_cres_object(cres),
cachefiles_cres_file(cres),
start_pos, iter,
term_func, term_func_priv);
} }
/* /*
...@@ -484,13 +493,12 @@ static enum netfs_io_source cachefiles_prepare_read(struct netfs_io_subrequest * ...@@ -484,13 +493,12 @@ static enum netfs_io_source cachefiles_prepare_read(struct netfs_io_subrequest *
/* /*
* Prepare for a write to occur. * Prepare for a write to occur.
*/ */
static int __cachefiles_prepare_write(struct netfs_cache_resources *cres, int __cachefiles_prepare_write(struct cachefiles_object *object,
loff_t *_start, size_t *_len, loff_t i_size, struct file *file,
loff_t *_start, size_t *_len,
bool no_space_allocated_yet) bool no_space_allocated_yet)
{ {
struct cachefiles_object *object = cachefiles_cres_object(cres);
struct cachefiles_cache *cache = object->volume->cache; struct cachefiles_cache *cache = object->volume->cache;
struct file *file = cachefiles_cres_file(cres);
loff_t start = *_start, pos; loff_t start = *_start, pos;
size_t len = *_len, down; size_t len = *_len, down;
int ret; int ret;
...@@ -577,7 +585,8 @@ static int cachefiles_prepare_write(struct netfs_cache_resources *cres, ...@@ -577,7 +585,8 @@ static int cachefiles_prepare_write(struct netfs_cache_resources *cres,
} }
cachefiles_begin_secure(cache, &saved_cred); cachefiles_begin_secure(cache, &saved_cred);
ret = __cachefiles_prepare_write(cres, _start, _len, i_size, ret = __cachefiles_prepare_write(object, cachefiles_cres_file(cres),
_start, _len,
no_space_allocated_yet); no_space_allocated_yet);
cachefiles_end_secure(cache, saved_cred); cachefiles_end_secure(cache, saved_cred);
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment