]> git.hungrycats.org Git - linux/commitdiff
netfs, fscache: export fscache_put_volume() and add fscache_try_get_volume()
authorBaokun Li <libaokun1@huawei.com>
Fri, 19 Jul 2024 13:28:10 +0000 (21:28 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 25 Jul 2024 07:53:42 +0000 (09:53 +0200)
[ Upstream commit 85b08b31a22b481ec6528130daf94eee4452e23f ]

Export fscache_put_volume() and add fscache_try_get_volume()
helper function to allow cachefiles to get/put fscache_volume
via linux/fscache-cache.h.

Signed-off-by: Baokun Li <libaokun1@huawei.com>
Link: https://lore.kernel.org/r/20240628062930.2467993-2-libaokun@huaweicloud.com
Signed-off-by: Christian Brauner <brauner@kernel.org>
Stable-dep-of: 522018a0de6b ("cachefiles: fix slab-use-after-free in fscache_withdraw_volume()")
Stable-dep-of: 5d8f80578907 ("cachefiles: fix slab-use-after-free in cachefiles_withdraw_cookie()")
Signed-off-by: Baokun Li <libaokun1@huawei.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/netfs/fscache_volume.c
fs/netfs/internal.h
include/linux/fscache-cache.h

index cdf991bdd9def49a9e1217b0c60825def20ed31f..cb75c07b5281a5479c731d89ce01dd87e9aa12da 100644 (file)
@@ -27,6 +27,19 @@ struct fscache_volume *fscache_get_volume(struct fscache_volume *volume,
        return volume;
 }
 
+struct fscache_volume *fscache_try_get_volume(struct fscache_volume *volume,
+                                             enum fscache_volume_trace where)
+{
+       int ref;
+
+       if (!__refcount_inc_not_zero(&volume->ref, &ref))
+               return NULL;
+
+       trace_fscache_volume(volume->debug_id, ref + 1, where);
+       return volume;
+}
+EXPORT_SYMBOL(fscache_try_get_volume);
+
 static void fscache_see_volume(struct fscache_volume *volume,
                               enum fscache_volume_trace where)
 {
@@ -420,6 +433,7 @@ void fscache_put_volume(struct fscache_volume *volume,
                        fscache_free_volume(volume);
        }
 }
+EXPORT_SYMBOL(fscache_put_volume);
 
 /*
  * Relinquish a volume representation cookie.
index ec7045d24400df09bd5a933401a7fbb2d36a3d24..edf9b2a180caa4d015e84f7413ea092a0a2860da 100644 (file)
@@ -326,8 +326,6 @@ extern const struct seq_operations fscache_volumes_seq_ops;
 
 struct fscache_volume *fscache_get_volume(struct fscache_volume *volume,
                                          enum fscache_volume_trace where);
-void fscache_put_volume(struct fscache_volume *volume,
-                       enum fscache_volume_trace where);
 bool fscache_begin_volume_access(struct fscache_volume *volume,
                                 struct fscache_cookie *cookie,
                                 enum fscache_access_trace why);
index bdf7f3eddf0a2fb26b9276f6dacb92228c8e6d29..4c91a019972b6a7842c3344bca960d4109aeff57 100644 (file)
@@ -19,6 +19,7 @@
 enum fscache_cache_trace;
 enum fscache_cookie_trace;
 enum fscache_access_trace;
+enum fscache_volume_trace;
 
 enum fscache_cache_state {
        FSCACHE_CACHE_IS_NOT_PRESENT,   /* No cache is present for this name */
@@ -97,6 +98,11 @@ extern void fscache_withdraw_cookie(struct fscache_cookie *cookie);
 
 extern void fscache_io_error(struct fscache_cache *cache);
 
+extern struct fscache_volume *
+fscache_try_get_volume(struct fscache_volume *volume,
+                      enum fscache_volume_trace where);
+extern void fscache_put_volume(struct fscache_volume *volume,
+                              enum fscache_volume_trace where);
 extern void fscache_end_volume_access(struct fscache_volume *volume,
                                      struct fscache_cookie *cookie,
                                      enum fscache_access_trace why);