Viewing: ldlm_flags.cocci

// SPDX-License-Identifier: GPL-2.0
//
// Copyright (c) 2024, Amazon and/or its affiliates. All rights reserved.
// Use is subject to license terms.
//
// Replace macros with explicit flag manipulation. Demonstrates Python
// scripting available with Coccinelle.
//
// Author: Timothy Day <timday@amazon.com>
//

@ldlm_is@
identifier MACRO =~ "ldlm_is";
@@
MACRO(...)

@script:python get_flag_is@
IDENT << ldlm_is.MACRO;
MACRO;
FLAG;
@@
coccinelle.MACRO = IDENT

if "granted" in IDENT:
   cocci.include_match(False)

IDENT = IDENT.split("_")
IDENT = IDENT[2:]
IDENT = ["LDLM", "FL"] + IDENT
IDENT = "_".join(IDENT).upper()
coccinelle.FLAG = IDENT

print(coccinelle.MACRO, coccinelle.FLAG)

@convert_is@
identifier get_flag_is.FLAG;
identifier get_flag_is.MACRO;
identifier L;
@@
- MACRO(L)
+ (L->l_flags & FLAG)

@ldlm_set@
identifier MACRO =~ "ldlm_set";
@@
MACRO(...)

@script:python get_flag_set@
IDENT << ldlm_set.MACRO;
MACRO;
FLAG;
@@
coccinelle.MACRO = IDENT

IDENT = IDENT.split("_")
IDENT = IDENT[2:]
IDENT = ["LDLM", "FL"] + IDENT
IDENT = "_".join(IDENT).upper()
coccinelle.FLAG = IDENT

print(coccinelle.MACRO, coccinelle.FLAG)

@convert_set@
identifier get_flag_set.FLAG;
identifier get_flag_set.MACRO;
identifier L;
@@
- MACRO(L)
+ (L->l_flags |= FLAG)

@ldlm_clear@
identifier MACRO =~ "ldlm_clear";
@@
MACRO(...)

@script:python get_flag_clear@
IDENT << ldlm_clear.MACRO;
MACRO;
FLAG;
@@
coccinelle.MACRO = IDENT

if "blocking_lock" in IDENT:
   cocci.include_match(False)
if "blocking_data" in IDENT:
   cocci.include_match(False)

IDENT = IDENT.split("_")
IDENT = IDENT[2:]
IDENT = ["LDLM", "FL"] + IDENT
IDENT = "_".join(IDENT).upper()
coccinelle.FLAG = IDENT

print(coccinelle.MACRO, coccinelle.FLAG)

@convert_clear@
identifier get_flag_clear.FLAG;
identifier get_flag_clear.MACRO;
identifier L;
@@
- MACRO(L)
+ (L->l_flags &= ~FLAG)