[V5,2/5] cachefiles: extract ondemand info field from cachefiles_object
Commit Message
We'll introduce a @work_struct field for @object in subsequent patches,
it will enlarge the size of @object.
As the result of that, this commit extracts ondemand info field from
@object.
Signed-off-by: Jia Zhu <zhujia.zj@bytedance.com>
---
fs/cachefiles/interface.c | 7 ++++++-
fs/cachefiles/internal.h | 26 ++++++++++++++++++++++----
fs/cachefiles/ondemand.c | 34 ++++++++++++++++++++++++++++------
3 files changed, 56 insertions(+), 11 deletions(-)
Comments
Jia Zhu <zhujia.zj@bytedance.com> wrote:
> #define CACHEFILES_OBJECT_STATE_FUNCS(_state, _STATE) \
> static inline bool \
> cachefiles_ondemand_object_is_##_state(const struct cachefiles_object *object) \
> { \
> - return object->state == CACHEFILES_ONDEMAND_OBJSTATE_##_STATE; \
> + return object->ondemand->state == CACHEFILES_ONDEMAND_OBJSTATE_##_STATE; \
> } \
> \
> static inline void \
> cachefiles_ondemand_set_object_##_state(struct cachefiles_object *object) \
> { \
> - object->state = CACHEFILES_ONDEMAND_OBJSTATE_##_STATE; \
> + object->ondemand->state = CACHEFILES_ONDEMAND_OBJSTATE_##_STATE; \
> }
I wonder if those need barriers - smp_load_acquire() and smp_store_release().
David
在 2023/4/14 21:51, David Howells 写道:
> Jia Zhu <zhujia.zj@bytedance.com> wrote:
>
>> #define CACHEFILES_OBJECT_STATE_FUNCS(_state, _STATE) \
>> static inline bool \
>> cachefiles_ondemand_object_is_##_state(const struct cachefiles_object *object) \
>> { \
>> - return object->state == CACHEFILES_ONDEMAND_OBJSTATE_##_STATE; \
>> + return object->ondemand->state == CACHEFILES_ONDEMAND_OBJSTATE_##_STATE; \
>> } \
>> \
>> static inline void \
>> cachefiles_ondemand_set_object_##_state(struct cachefiles_object *object) \
>> { \
>> - object->state = CACHEFILES_ONDEMAND_OBJSTATE_##_STATE; \
>> + object->ondemand->state = CACHEFILES_ONDEMAND_OBJSTATE_##_STATE; \
>> }
>
> I wonder if those need barriers - smp_load_acquire() and smp_store_release().
>
> David
There are three object states: OPEN, CLOSE, REOPENING.
Here is no logic in the code such like: A has to watching and waiting
for B's status change.
And so far I haven't constructed a scenario requires barrier pairs. Thus
I didn't add barriers here.
Jia
>
@@ -31,6 +31,11 @@ struct cachefiles_object *cachefiles_alloc_object(struct fscache_cookie *cookie)
if (!object)
return NULL;
+ if (cachefiles_ondemand_init_obj_info(object, volume)) {
+ kmem_cache_free(cachefiles_object_jar, object);
+ return NULL;
+ }
+
refcount_set(&object->ref, 1);
spin_lock_init(&object->lock);
@@ -88,7 +93,7 @@ void cachefiles_put_object(struct cachefiles_object *object,
ASSERTCMP(object->file, ==, NULL);
kfree(object->d_name);
-
+ cachefiles_ondemand_deinit_obj_info(object);
cache = object->volume->cache->cache;
fscache_put_cookie(object->cookie, fscache_cookie_put_object);
object->cookie = NULL;
@@ -49,6 +49,12 @@ enum cachefiles_object_state {
CACHEFILES_ONDEMAND_OBJSTATE_OPEN, /* Anonymous fd associated with object is available */
};
+struct cachefiles_ondemand_info {
+ int ondemand_id;
+ enum cachefiles_object_state state;
+ struct cachefiles_object *object;
+};
+
/*
* Backing file state.
*/
@@ -66,8 +72,7 @@ struct cachefiles_object {
unsigned long flags;
#define CACHEFILES_OBJECT_USING_TMPFILE 0 /* Have an unlinked tmpfile */
#ifdef CONFIG_CACHEFILES_ONDEMAND
- int ondemand_id;
- enum cachefiles_object_state state;
+ struct cachefiles_ondemand_info *ondemand;
#endif
};
@@ -302,17 +307,21 @@ extern void cachefiles_ondemand_clean_object(struct cachefiles_object *object);
extern int cachefiles_ondemand_read(struct cachefiles_object *object,
loff_t pos, size_t len);
+extern int cachefiles_ondemand_init_obj_info(struct cachefiles_object *obj,
+ struct cachefiles_volume *volume);
+extern void cachefiles_ondemand_deinit_obj_info(struct cachefiles_object *obj);
+
#define CACHEFILES_OBJECT_STATE_FUNCS(_state, _STATE) \
static inline bool \
cachefiles_ondemand_object_is_##_state(const struct cachefiles_object *object) \
{ \
- return object->state == CACHEFILES_ONDEMAND_OBJSTATE_##_STATE; \
+ return object->ondemand->state == CACHEFILES_ONDEMAND_OBJSTATE_##_STATE; \
} \
\
static inline void \
cachefiles_ondemand_set_object_##_state(struct cachefiles_object *object) \
{ \
- object->state = CACHEFILES_ONDEMAND_OBJSTATE_##_STATE; \
+ object->ondemand->state = CACHEFILES_ONDEMAND_OBJSTATE_##_STATE; \
}
CACHEFILES_OBJECT_STATE_FUNCS(open, OPEN);
@@ -338,6 +347,15 @@ static inline int cachefiles_ondemand_read(struct cachefiles_object *object,
{
return -EOPNOTSUPP;
}
+
+static inline int cachefiles_ondemand_init_obj_info(struct cachefiles_object *obj,
+ struct cachefiles_volume *volume)
+{
+ return 0;
+}
+static inline void cachefiles_ondemand_deinit_obj_info(struct cachefiles_object *obj)
+{
+}
#endif
/*
@@ -9,12 +9,13 @@ static int cachefiles_ondemand_fd_release(struct inode *inode,
{
struct cachefiles_object *object = file->private_data;
struct cachefiles_cache *cache = object->volume->cache;
- int object_id = object->ondemand_id;
+ struct cachefiles_ondemand_info *info = object->ondemand;
+ int object_id = info->ondemand_id;
struct cachefiles_req *req;
XA_STATE(xas, &cache->reqs, 0);
xa_lock(&cache->reqs);
- object->ondemand_id = CACHEFILES_ONDEMAND_ID_CLOSED;
+ info->ondemand_id = CACHEFILES_ONDEMAND_ID_CLOSED;
cachefiles_ondemand_set_object_close(object);
/*
@@ -222,7 +223,7 @@ static int cachefiles_ondemand_get_fd(struct cachefiles_req *req)
load = (void *)req->msg.data;
load->fd = fd;
req->msg.object_id = object_id;
- object->ondemand_id = object_id;
+ object->ondemand->ondemand_id = object_id;
cachefiles_get_unbind_pincount(cache);
trace_cachefiles_ondemand_open(object, &req->msg, load);
@@ -368,7 +369,7 @@ static int cachefiles_ondemand_send_req(struct cachefiles_object *object,
if (opcode != CACHEFILES_OP_OPEN &&
!cachefiles_ondemand_object_is_open(object)) {
- WARN_ON_ONCE(object->ondemand_id == 0);
+ WARN_ON_ONCE(object->ondemand->ondemand_id == 0);
xas_unlock(&xas);
ret = -EIO;
goto out;
@@ -438,7 +439,7 @@ static int cachefiles_ondemand_init_close_req(struct cachefiles_req *req,
if (!cachefiles_ondemand_object_is_open(object))
return -ENOENT;
- req->msg.object_id = object->ondemand_id;
+ req->msg.object_id = object->ondemand->ondemand_id;
trace_cachefiles_ondemand_close(object, &req->msg);
return 0;
}
@@ -454,7 +455,7 @@ static int cachefiles_ondemand_init_read_req(struct cachefiles_req *req,
struct cachefiles_object *object = req->object;
struct cachefiles_read *load = (void *)req->msg.data;
struct cachefiles_read_ctx *read_ctx = private;
- int object_id = object->ondemand_id;
+ int object_id = object->ondemand->ondemand_id;
/* Stop enqueuing requests when daemon has closed anon_fd. */
if (!cachefiles_ondemand_object_is_open(object)) {
@@ -500,6 +501,27 @@ void cachefiles_ondemand_clean_object(struct cachefiles_object *object)
cachefiles_ondemand_init_close_req, NULL);
}
+int cachefiles_ondemand_init_obj_info(struct cachefiles_object *object,
+ struct cachefiles_volume *volume)
+{
+ if (!cachefiles_in_ondemand_mode(volume->cache))
+ return 0;
+
+ object->ondemand = kzalloc(sizeof(struct cachefiles_ondemand_info),
+ GFP_KERNEL);
+ if (!object->ondemand)
+ return -ENOMEM;
+
+ object->ondemand->object = object;
+ return 0;
+}
+
+void cachefiles_ondemand_deinit_obj_info(struct cachefiles_object *object)
+{
+ kfree(object->ondemand);
+ object->ondemand = NULL;
+}
+
int cachefiles_ondemand_read(struct cachefiles_object *object,
loff_t pos, size_t len)
{