forked from AsahiLinux/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
netfs: Split netfs_io_* object handling out
Split netfs_io_* object handling out into a file that's going to contain object allocation, get and put routines. Signed-off-by: David Howells <[email protected]> Reviewed-by: Jeff Layton <[email protected]> cc: [email protected] Link: https://lore.kernel.org/r/164622995118.3564931.6089530629052064470.stgit@warthog.procyon.org.uk/ # v1 Link: https://lore.kernel.org/r/164678197044.1200972.11511937252083343775.stgit@warthog.procyon.org.uk/ # v2 Link: https://lore.kernel.org/r/164692894693.2099075.7831091294248735173.stgit@warthog.procyon.org.uk/ # v3
- Loading branch information
Showing
4 changed files
with
147 additions
and
118 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,9 @@ | ||
# SPDX-License-Identifier: GPL-2.0 | ||
|
||
netfs-y := read_helper.o stats.o | ||
netfs-y := \ | ||
objects.o \ | ||
read_helper.o | ||
|
||
netfs-$(CONFIG_NETFS_STATS) += stats.o | ||
|
||
obj-$(CONFIG_NETFS_SUPPORT) := netfs.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,17 +5,35 @@ | |
* Written by David Howells ([email protected]) | ||
*/ | ||
|
||
#include <linux/netfs.h> | ||
#include <trace/events/netfs.h> | ||
|
||
#ifdef pr_fmt | ||
#undef pr_fmt | ||
#endif | ||
|
||
#define pr_fmt(fmt) "netfs: " fmt | ||
|
||
/* | ||
* objects.c | ||
*/ | ||
struct netfs_io_request *netfs_alloc_request(const struct netfs_request_ops *ops, | ||
void *netfs_priv, | ||
struct file *file); | ||
void netfs_get_request(struct netfs_io_request *rreq); | ||
void netfs_clear_subrequests(struct netfs_io_request *rreq, bool was_async); | ||
void netfs_put_request(struct netfs_io_request *rreq, bool was_async); | ||
struct netfs_io_subrequest *netfs_alloc_subrequest(struct netfs_io_request *rreq); | ||
void netfs_put_subrequest(struct netfs_io_subrequest *subreq, bool was_async); | ||
void netfs_get_subrequest(struct netfs_io_subrequest *subreq); | ||
|
||
/* | ||
* read_helper.c | ||
*/ | ||
extern unsigned int netfs_debug; | ||
|
||
void netfs_rreq_work(struct work_struct *work); | ||
|
||
/* | ||
* stats.c | ||
*/ | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
/* Object lifetime handling and tracing. | ||
* | ||
* Copyright (C) 2022 Red Hat, Inc. All Rights Reserved. | ||
* Written by David Howells ([email protected]) | ||
*/ | ||
|
||
#include <linux/slab.h> | ||
#include "internal.h" | ||
|
||
/* | ||
* Allocate an I/O request and initialise it. | ||
*/ | ||
struct netfs_io_request *netfs_alloc_request( | ||
const struct netfs_request_ops *ops, void *netfs_priv, | ||
struct file *file) | ||
{ | ||
static atomic_t debug_ids; | ||
struct netfs_io_request *rreq; | ||
|
||
rreq = kzalloc(sizeof(struct netfs_io_request), GFP_KERNEL); | ||
if (rreq) { | ||
rreq->netfs_ops = ops; | ||
rreq->netfs_priv = netfs_priv; | ||
rreq->inode = file_inode(file); | ||
rreq->i_size = i_size_read(rreq->inode); | ||
rreq->debug_id = atomic_inc_return(&debug_ids); | ||
INIT_LIST_HEAD(&rreq->subrequests); | ||
INIT_WORK(&rreq->work, netfs_rreq_work); | ||
refcount_set(&rreq->usage, 1); | ||
__set_bit(NETFS_RREQ_IN_PROGRESS, &rreq->flags); | ||
if (ops->init_request) | ||
ops->init_request(rreq, file); | ||
netfs_stat(&netfs_n_rh_rreq); | ||
} | ||
|
||
return rreq; | ||
} | ||
|
||
void netfs_get_request(struct netfs_io_request *rreq) | ||
{ | ||
refcount_inc(&rreq->usage); | ||
} | ||
|
||
void netfs_clear_subrequests(struct netfs_io_request *rreq, bool was_async) | ||
{ | ||
struct netfs_io_subrequest *subreq; | ||
|
||
while (!list_empty(&rreq->subrequests)) { | ||
subreq = list_first_entry(&rreq->subrequests, | ||
struct netfs_io_subrequest, rreq_link); | ||
list_del(&subreq->rreq_link); | ||
netfs_put_subrequest(subreq, was_async); | ||
} | ||
} | ||
|
||
static void netfs_free_request(struct work_struct *work) | ||
{ | ||
struct netfs_io_request *rreq = | ||
container_of(work, struct netfs_io_request, work); | ||
netfs_clear_subrequests(rreq, false); | ||
if (rreq->netfs_priv) | ||
rreq->netfs_ops->cleanup(rreq->mapping, rreq->netfs_priv); | ||
trace_netfs_rreq(rreq, netfs_rreq_trace_free); | ||
if (rreq->cache_resources.ops) | ||
rreq->cache_resources.ops->end_operation(&rreq->cache_resources); | ||
kfree(rreq); | ||
netfs_stat_d(&netfs_n_rh_rreq); | ||
} | ||
|
||
void netfs_put_request(struct netfs_io_request *rreq, bool was_async) | ||
{ | ||
if (refcount_dec_and_test(&rreq->usage)) { | ||
if (was_async) { | ||
rreq->work.func = netfs_free_request; | ||
if (!queue_work(system_unbound_wq, &rreq->work)) | ||
BUG(); | ||
} else { | ||
netfs_free_request(&rreq->work); | ||
} | ||
} | ||
} | ||
|
||
/* | ||
* Allocate and partially initialise an I/O request structure. | ||
*/ | ||
struct netfs_io_subrequest *netfs_alloc_subrequest(struct netfs_io_request *rreq) | ||
{ | ||
struct netfs_io_subrequest *subreq; | ||
|
||
subreq = kzalloc(sizeof(struct netfs_io_subrequest), GFP_KERNEL); | ||
if (subreq) { | ||
INIT_LIST_HEAD(&subreq->rreq_link); | ||
refcount_set(&subreq->usage, 2); | ||
subreq->rreq = rreq; | ||
netfs_get_request(rreq); | ||
netfs_stat(&netfs_n_rh_sreq); | ||
} | ||
|
||
return subreq; | ||
} | ||
|
||
void netfs_get_subrequest(struct netfs_io_subrequest *subreq) | ||
{ | ||
refcount_inc(&subreq->usage); | ||
} | ||
|
||
static void __netfs_put_subrequest(struct netfs_io_subrequest *subreq, | ||
bool was_async) | ||
{ | ||
struct netfs_io_request *rreq = subreq->rreq; | ||
|
||
trace_netfs_sreq(subreq, netfs_sreq_trace_free); | ||
kfree(subreq); | ||
netfs_stat_d(&netfs_n_rh_sreq); | ||
netfs_put_request(rreq, was_async); | ||
} | ||
|
||
void netfs_put_subrequest(struct netfs_io_subrequest *subreq, bool was_async) | ||
{ | ||
if (refcount_dec_and_test(&subreq->usage)) | ||
__netfs_put_subrequest(subreq, was_async); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters