On Fri, May 26, 2023 at 10:52:05PM +0200, Peter Zijlstra wrote: > +++ b/include/linux/guards.h > @@ -0,0 +1,142 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +#ifndef __LINUX_GUARDS_H > +#define __LINUX_GUARDS_H > + > +#include <linux/compiler_attributes.h> > + > +/* > + * Pointer Guards are special pointers (variables) with a scope bound cleanup > + * function. > + * > + * Various guard types can be created using: > + * > + * DEFINE_PTR_GUARD(guard_type, typename, cleanup-exp) > + * > + * After which they can be used like so: > + * > + * ptr_guard(guard_type, name) = find_get_object(foo); > + * > + * Where the return type of find_get_object() should match the guard_type's > + * 'typname *'. And when @name goes out of scope cleanup-exp is ran (inserted > + * by the compiler) when !NULL at that time. Also see the __cleanup attribute. > + */ > + > +#define DEFINE_PTR_GUARD(_type, _Type, _Put) \ > +typedef _Type *ptr_guard_##_type##_t; \ > + \ > +static inline void ptr_guard_##_type##_cleanup(_Type **_ptr) \ > +{ \ > + _Type *_G = *_ptr; \ > + if (_G) \ > + _Put(_G); \ > +} > + > +#define ptr_guard(_type, _name) \ > + ptr_guard_##_type##_t _name __cleanup(ptr_guard_##_type##_cleanup) > + Ha, and then I wanted to create an fdput() guard... :/