Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /* Internal definitions for network filesystem support
0003  *
0004  * Copyright (C) 2021 Red Hat, Inc. All Rights Reserved.
0005  * Written by David Howells (dhowells@redhat.com)
0006  */
0007 
0008 #include <linux/netfs.h>
0009 #include <linux/fscache.h>
0010 #include <trace/events/netfs.h>
0011 
0012 #ifdef pr_fmt
0013 #undef pr_fmt
0014 #endif
0015 
0016 #define pr_fmt(fmt) "netfs: " fmt
0017 
0018 /*
0019  * buffered_read.c
0020  */
0021 void netfs_rreq_unlock_folios(struct netfs_io_request *rreq);
0022 
0023 /*
0024  * io.c
0025  */
0026 int netfs_begin_read(struct netfs_io_request *rreq, bool sync);
0027 
0028 /*
0029  * main.c
0030  */
0031 extern unsigned int netfs_debug;
0032 
0033 /*
0034  * objects.c
0035  */
0036 struct netfs_io_request *netfs_alloc_request(struct address_space *mapping,
0037                          struct file *file,
0038                          loff_t start, size_t len,
0039                          enum netfs_io_origin origin);
0040 void netfs_get_request(struct netfs_io_request *rreq, enum netfs_rreq_ref_trace what);
0041 void netfs_clear_subrequests(struct netfs_io_request *rreq, bool was_async);
0042 void netfs_put_request(struct netfs_io_request *rreq, bool was_async,
0043                enum netfs_rreq_ref_trace what);
0044 struct netfs_io_subrequest *netfs_alloc_subrequest(struct netfs_io_request *rreq);
0045 
0046 static inline void netfs_see_request(struct netfs_io_request *rreq,
0047                      enum netfs_rreq_ref_trace what)
0048 {
0049     trace_netfs_rreq_ref(rreq->debug_id, refcount_read(&rreq->ref), what);
0050 }
0051 
0052 /*
0053  * stats.c
0054  */
0055 #ifdef CONFIG_NETFS_STATS
0056 extern atomic_t netfs_n_rh_readahead;
0057 extern atomic_t netfs_n_rh_readpage;
0058 extern atomic_t netfs_n_rh_rreq;
0059 extern atomic_t netfs_n_rh_sreq;
0060 extern atomic_t netfs_n_rh_download;
0061 extern atomic_t netfs_n_rh_download_done;
0062 extern atomic_t netfs_n_rh_download_failed;
0063 extern atomic_t netfs_n_rh_download_instead;
0064 extern atomic_t netfs_n_rh_read;
0065 extern atomic_t netfs_n_rh_read_done;
0066 extern atomic_t netfs_n_rh_read_failed;
0067 extern atomic_t netfs_n_rh_zero;
0068 extern atomic_t netfs_n_rh_short_read;
0069 extern atomic_t netfs_n_rh_write;
0070 extern atomic_t netfs_n_rh_write_begin;
0071 extern atomic_t netfs_n_rh_write_done;
0072 extern atomic_t netfs_n_rh_write_failed;
0073 extern atomic_t netfs_n_rh_write_zskip;
0074 
0075 
0076 static inline void netfs_stat(atomic_t *stat)
0077 {
0078     atomic_inc(stat);
0079 }
0080 
0081 static inline void netfs_stat_d(atomic_t *stat)
0082 {
0083     atomic_dec(stat);
0084 }
0085 
0086 #else
0087 #define netfs_stat(x) do {} while(0)
0088 #define netfs_stat_d(x) do {} while(0)
0089 #endif
0090 
0091 /*
0092  * Miscellaneous functions.
0093  */
0094 static inline bool netfs_is_cache_enabled(struct netfs_inode *ctx)
0095 {
0096 #if IS_ENABLED(CONFIG_FSCACHE)
0097     struct fscache_cookie *cookie = ctx->cache;
0098 
0099     return fscache_cookie_valid(cookie) && cookie->cache_priv &&
0100         fscache_cookie_enabled(cookie);
0101 #else
0102     return false;
0103 #endif
0104 }
0105 
0106 /*****************************************************************************/
0107 /*
0108  * debug tracing
0109  */
0110 #define dbgprintk(FMT, ...) \
0111     printk("[%-6.6s] "FMT"\n", current->comm, ##__VA_ARGS__)
0112 
0113 #define kenter(FMT, ...) dbgprintk("==> %s("FMT")", __func__, ##__VA_ARGS__)
0114 #define kleave(FMT, ...) dbgprintk("<== %s()"FMT"", __func__, ##__VA_ARGS__)
0115 #define kdebug(FMT, ...) dbgprintk(FMT, ##__VA_ARGS__)
0116 
0117 #ifdef __KDEBUG
0118 #define _enter(FMT, ...) kenter(FMT, ##__VA_ARGS__)
0119 #define _leave(FMT, ...) kleave(FMT, ##__VA_ARGS__)
0120 #define _debug(FMT, ...) kdebug(FMT, ##__VA_ARGS__)
0121 
0122 #elif defined(CONFIG_NETFS_DEBUG)
0123 #define _enter(FMT, ...)            \
0124 do {                        \
0125     if (netfs_debug)            \
0126         kenter(FMT, ##__VA_ARGS__); \
0127 } while (0)
0128 
0129 #define _leave(FMT, ...)            \
0130 do {                        \
0131     if (netfs_debug)            \
0132         kleave(FMT, ##__VA_ARGS__); \
0133 } while (0)
0134 
0135 #define _debug(FMT, ...)            \
0136 do {                        \
0137     if (netfs_debug)            \
0138         kdebug(FMT, ##__VA_ARGS__); \
0139 } while (0)
0140 
0141 #else
0142 #define _enter(FMT, ...) no_printk("==> %s("FMT")", __func__, ##__VA_ARGS__)
0143 #define _leave(FMT, ...) no_printk("<== %s()"FMT"", __func__, ##__VA_ARGS__)
0144 #define _debug(FMT, ...) no_printk(FMT, ##__VA_ARGS__)
0145 #endif