mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 08:38:45 +02:00 
			
		
		
		
	cachefiles: extract ondemand info field from cachefiles_object
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> Link: https://lore.kernel.org/r/20231120041422.75170-3-zhujia.zj@bytedance.com Reviewed-by: Jingbo Xu <jefflexu@linux.alibaba.com> Reviewed-by: David Howells <dhowells@redhat.com> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
		
							parent
							
								
									357a18d033
								
							
						
					
					
						commit
						3c5ecfe16e
					
				
					 3 changed files with 56 additions and 11 deletions
				
			
		|  | @ -31,6 +31,11 @@ struct cachefiles_object *cachefiles_alloc_object(struct fscache_cookie *cookie) | ||||||
| 	if (!object) | 	if (!object) | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 
 | 
 | ||||||
|  | 	if (cachefiles_ondemand_init_obj_info(object, volume)) { | ||||||
|  | 		kmem_cache_free(cachefiles_object_jar, object); | ||||||
|  | 		return NULL; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	refcount_set(&object->ref, 1); | 	refcount_set(&object->ref, 1); | ||||||
| 
 | 
 | ||||||
| 	spin_lock_init(&object->lock); | 	spin_lock_init(&object->lock); | ||||||
|  | @ -88,7 +93,7 @@ void cachefiles_put_object(struct cachefiles_object *object, | ||||||
| 		ASSERTCMP(object->file, ==, NULL); | 		ASSERTCMP(object->file, ==, NULL); | ||||||
| 
 | 
 | ||||||
| 		kfree(object->d_name); | 		kfree(object->d_name); | ||||||
| 
 | 		cachefiles_ondemand_deinit_obj_info(object); | ||||||
| 		cache = object->volume->cache->cache; | 		cache = object->volume->cache->cache; | ||||||
| 		fscache_put_cookie(object->cookie, fscache_cookie_put_object); | 		fscache_put_cookie(object->cookie, fscache_cookie_put_object); | ||||||
| 		object->cookie = NULL; | 		object->cookie = NULL; | ||||||
|  |  | ||||||
|  | @ -49,6 +49,12 @@ enum cachefiles_object_state { | ||||||
| 	CACHEFILES_ONDEMAND_OBJSTATE_OPEN, /* Anonymous fd associated with object is available */ | 	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. |  * Backing file state. | ||||||
|  */ |  */ | ||||||
|  | @ -66,8 +72,7 @@ struct cachefiles_object { | ||||||
| 	unsigned long			flags; | 	unsigned long			flags; | ||||||
| #define CACHEFILES_OBJECT_USING_TMPFILE	0		/* Have an unlinked tmpfile */ | #define CACHEFILES_OBJECT_USING_TMPFILE	0		/* Have an unlinked tmpfile */ | ||||||
| #ifdef CONFIG_CACHEFILES_ONDEMAND | #ifdef CONFIG_CACHEFILES_ONDEMAND | ||||||
| 	int				ondemand_id; | 	struct cachefiles_ondemand_info	*ondemand; | ||||||
| 	enum cachefiles_object_state	state; |  | ||||||
| #endif | #endif | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | @ -302,17 +307,21 @@ extern void cachefiles_ondemand_clean_object(struct cachefiles_object *object); | ||||||
| extern int cachefiles_ondemand_read(struct cachefiles_object *object, | extern int cachefiles_ondemand_read(struct cachefiles_object *object, | ||||||
| 				    loff_t pos, size_t len); | 				    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)	\ | #define CACHEFILES_OBJECT_STATE_FUNCS(_state, _STATE)	\ | ||||||
| static inline bool								\ | static inline bool								\ | ||||||
| cachefiles_ondemand_object_is_##_state(const struct cachefiles_object *object) \ | 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								\ | static inline void								\ | ||||||
| cachefiles_ondemand_set_object_##_state(struct cachefiles_object *object) \ | 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); | CACHEFILES_OBJECT_STATE_FUNCS(open, OPEN); | ||||||
|  | @ -338,6 +347,15 @@ static inline int cachefiles_ondemand_read(struct cachefiles_object *object, | ||||||
| { | { | ||||||
| 	return -EOPNOTSUPP; | 	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 | #endif | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  |  | ||||||
|  | @ -9,12 +9,13 @@ static int cachefiles_ondemand_fd_release(struct inode *inode, | ||||||
| { | { | ||||||
| 	struct cachefiles_object *object = file->private_data; | 	struct cachefiles_object *object = file->private_data; | ||||||
| 	struct cachefiles_cache *cache = object->volume->cache; | 	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; | 	struct cachefiles_req *req; | ||||||
| 	XA_STATE(xas, &cache->reqs, 0); | 	XA_STATE(xas, &cache->reqs, 0); | ||||||
| 
 | 
 | ||||||
| 	xa_lock(&cache->reqs); | 	xa_lock(&cache->reqs); | ||||||
| 	object->ondemand_id = CACHEFILES_ONDEMAND_ID_CLOSED; | 	info->ondemand_id = CACHEFILES_ONDEMAND_ID_CLOSED; | ||||||
| 	cachefiles_ondemand_set_object_close(object); | 	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 = (void *)req->msg.data; | ||||||
| 	load->fd = fd; | 	load->fd = fd; | ||||||
| 	req->msg.object_id = object_id; | 	req->msg.object_id = object_id; | ||||||
| 	object->ondemand_id = object_id; | 	object->ondemand->ondemand_id = object_id; | ||||||
| 
 | 
 | ||||||
| 	cachefiles_get_unbind_pincount(cache); | 	cachefiles_get_unbind_pincount(cache); | ||||||
| 	trace_cachefiles_ondemand_open(object, &req->msg, load); | 	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 && | 		if (opcode != CACHEFILES_OP_OPEN && | ||||||
| 			!cachefiles_ondemand_object_is_open(object)) { | 			!cachefiles_ondemand_object_is_open(object)) { | ||||||
| 			WARN_ON_ONCE(object->ondemand_id == 0); | 			WARN_ON_ONCE(object->ondemand->ondemand_id == 0); | ||||||
| 			xas_unlock(&xas); | 			xas_unlock(&xas); | ||||||
| 			ret = -EIO; | 			ret = -EIO; | ||||||
| 			goto out; | 			goto out; | ||||||
|  | @ -438,7 +439,7 @@ static int cachefiles_ondemand_init_close_req(struct cachefiles_req *req, | ||||||
| 	if (!cachefiles_ondemand_object_is_open(object)) | 	if (!cachefiles_ondemand_object_is_open(object)) | ||||||
| 		return -ENOENT; | 		return -ENOENT; | ||||||
| 
 | 
 | ||||||
| 	req->msg.object_id = object->ondemand_id; | 	req->msg.object_id = object->ondemand->ondemand_id; | ||||||
| 	trace_cachefiles_ondemand_close(object, &req->msg); | 	trace_cachefiles_ondemand_close(object, &req->msg); | ||||||
| 	return 0; | 	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_object *object = req->object; | ||||||
| 	struct cachefiles_read *load = (void *)req->msg.data; | 	struct cachefiles_read *load = (void *)req->msg.data; | ||||||
| 	struct cachefiles_read_ctx *read_ctx = private; | 	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. */ | 	/* Stop enqueuing requests when daemon has closed anon_fd. */ | ||||||
| 	if (!cachefiles_ondemand_object_is_open(object)) { | 	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); | 			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, | int cachefiles_ondemand_read(struct cachefiles_object *object, | ||||||
| 			     loff_t pos, size_t len) | 			     loff_t pos, size_t len) | ||||||
| { | { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Jia Zhu
						Jia Zhu