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>
This commit is contained in:
parent
6c459b78d4
commit
a06fac1599
|
@ -201,6 +201,16 @@ extern void cachefiles_put_object(struct cachefiles_object *object,
|
|||
*/
|
||||
extern bool cachefiles_begin_operation(struct netfs_cache_resources *cres,
|
||||
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
|
||||
|
|
|
@ -277,36 +277,33 @@ static void cachefiles_write_complete(struct kiocb *iocb, long ret)
|
|||
/*
|
||||
* Initiate a write to the cache.
|
||||
*/
|
||||
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)
|
||||
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)
|
||||
{
|
||||
struct cachefiles_object *object;
|
||||
struct cachefiles_cache *cache;
|
||||
struct cachefiles_kiocb *ki;
|
||||
struct inode *inode;
|
||||
struct file *file;
|
||||
unsigned int old_nofs;
|
||||
ssize_t ret = -ENOBUFS;
|
||||
ssize_t ret;
|
||||
size_t len = iov_iter_count(iter);
|
||||
|
||||
if (!fscache_wait_for_operation(cres, FSCACHE_WANT_WRITE))
|
||||
goto presubmission_error;
|
||||
fscache_count_write();
|
||||
object = cachefiles_cres_object(cres);
|
||||
cache = object->volume->cache;
|
||||
file = cachefiles_cres_file(cres);
|
||||
|
||||
_enter("%pD,%li,%llx,%zx/%llx",
|
||||
file, file_inode(file)->i_ino, start_pos, len,
|
||||
i_size_read(file_inode(file)));
|
||||
|
||||
ret = -ENOMEM;
|
||||
ki = kzalloc(sizeof(struct cachefiles_kiocb), GFP_KERNEL);
|
||||
if (!ki)
|
||||
goto presubmission_error;
|
||||
if (!ki) {
|
||||
if (term_func)
|
||||
term_func(term_func_priv, -ENOMEM, false);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
refcount_set(&ki->ki_refcnt, 2);
|
||||
ki->iocb.ki_filp = file;
|
||||
|
@ -314,7 +311,6 @@ static int cachefiles_write(struct netfs_cache_resources *cres,
|
|||
ki->iocb.ki_flags = IOCB_DIRECT | IOCB_WRITE;
|
||||
ki->iocb.ki_ioprio = get_current_ioprio();
|
||||
ki->object = object;
|
||||
ki->inval_counter = cres->inval_counter;
|
||||
ki->start = start_pos;
|
||||
ki->len = len;
|
||||
ki->term_func = term_func;
|
||||
|
@ -369,11 +365,24 @@ in_progress:
|
|||
cachefiles_put_kiocb(ki);
|
||||
_leave(" = %zd", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
presubmission_error:
|
||||
if (term_func)
|
||||
term_func(term_func_priv, ret, false);
|
||||
return ret;
|
||||
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)
|
||||
term_func(term_func_priv, -ENOBUFS, false);
|
||||
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 @@ out_no_object:
|
|||
/*
|
||||
* Prepare for a write to occur.
|
||||
*/
|
||||
static int __cachefiles_prepare_write(struct netfs_cache_resources *cres,
|
||||
loff_t *_start, size_t *_len, loff_t i_size,
|
||||
bool no_space_allocated_yet)
|
||||
int __cachefiles_prepare_write(struct cachefiles_object *object,
|
||||
struct file *file,
|
||||
loff_t *_start, size_t *_len,
|
||||
bool no_space_allocated_yet)
|
||||
{
|
||||
struct cachefiles_object *object = cachefiles_cres_object(cres);
|
||||
struct cachefiles_cache *cache = object->volume->cache;
|
||||
struct file *file = cachefiles_cres_file(cres);
|
||||
loff_t start = *_start, pos;
|
||||
size_t len = *_len, down;
|
||||
int ret;
|
||||
|
@ -577,7 +585,8 @@ static int cachefiles_prepare_write(struct netfs_cache_resources *cres,
|
|||
}
|
||||
|
||||
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);
|
||||
cachefiles_end_secure(cache, saved_cred);
|
||||
return ret;
|
||||
|
|
Loading…
Reference in New Issue