* [PATCH v4 0/2] i3c: dw-i3c-master: scoped spinlock guards and SIR reject fix
@ 2026-01-27 2:05 adrianhoyin.ng
2026-01-27 2:05 ` [PATCH v4 1/2] i3c: dw-i3c-master: convert spinlock usage to scoped guards adrianhoyin.ng
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: adrianhoyin.ng @ 2026-01-27 2:05 UTC (permalink / raw)
To: alexandre.belloni, Frank.Li, linux-i3c, linux-kernel; +Cc: adrianhoyin.ng
From: Adrian Ng Ho Yin <adrianhoyin.ng@altera.com>
This patchset replaces open-coded spin_lock_irqsave()/spin_unlock_irqrestore()
pairs with scoped spinlock guards to reduce boilerplate and ensure correct
lock release on scope exit.
In a subsequent patch it fixes the SIR reject bit mapping used for IBI
handling. The IBI_SIR_REQ_REJECT register is indexed by a folded form of
the 7-bit dynamic address, but the driver currently uses the device table
index. This can result in IBIs being rejected or accepted for the wrong
device. The patch derives the bit index directly from the dynamic address
as defined by the controller.
---
changelog
v3->v4:
- Dropped unused DYN_ADDR_LO_BITS definition.
v2->v3:
- Update guard function call in dw_i3c_master_free_ibi to use scoped_guard to avoid
i3c_generic_ibi_free_pool happening under spinlock.
- Update get_ibi_sir_bit_index to use FIELD_GET and drop DYN_ADDR_LO_BITS definition.
v1->v2:
- Add implementation to use scoped spinlock guards to ensure correct lock release.
- Update remove DYN_ADDR_HI_BITS macro definition and update MASK to use index directly.
---
Adrian Ng Ho Yin (2):
i3c: dw-i3c-master: convert spinlock usage to scoped guards
i3c: dw-i3c-master: fix SIR reject bit mapping for dynamic addresses
drivers/i3c/master/dw-i3c-master.c | 59 ++++++++++++++++--------------
1 file changed, 31 insertions(+), 28 deletions(-)
--
2.49.GIT
--
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v4 1/2] i3c: dw-i3c-master: convert spinlock usage to scoped guards
2026-01-27 2:05 [PATCH v4 0/2] i3c: dw-i3c-master: scoped spinlock guards and SIR reject fix adrianhoyin.ng
@ 2026-01-27 2:05 ` adrianhoyin.ng
2026-01-27 2:05 ` [PATCH v4 2/2] i3c: dw-i3c-master: fix SIR reject bit mapping for dynamic addresses adrianhoyin.ng
2026-01-30 23:07 ` [PATCH v4 0/2] i3c: dw-i3c-master: scoped spinlock guards and SIR reject fix Alexandre Belloni
2 siblings, 0 replies; 5+ messages in thread
From: adrianhoyin.ng @ 2026-01-27 2:05 UTC (permalink / raw)
To: alexandre.belloni, Frank.Li, linux-i3c, linux-kernel; +Cc: adrianhoyin.ng
From: Adrian Ng Ho Yin <adrianhoyin.ng@altera.com>
Convert dw-i3c-master to use scoped spinlock guards in place of
open-coded spin_lock_irqsave()/spin_unlock_irqrestore() pairs to ensure
locks are always safely released on scope exit.
Signed-off-by: Adrian Ng Ho Yin <adrianhoyin.ng@altera.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
---
drivers/i3c/master/dw-i3c-master.c | 34 +++++++-----------------------
1 file changed, 8 insertions(+), 26 deletions(-)
diff --git a/drivers/i3c/master/dw-i3c-master.c b/drivers/i3c/master/dw-i3c-master.c
index 48af00659e19..ef8a38620e0e 100644
--- a/drivers/i3c/master/dw-i3c-master.c
+++ b/drivers/i3c/master/dw-i3c-master.c
@@ -416,17 +416,14 @@ static void dw_i3c_master_start_xfer_locked(struct dw_i3c_master *master)
static void dw_i3c_master_enqueue_xfer(struct dw_i3c_master *master,
struct dw_i3c_xfer *xfer)
{
- unsigned long flags;
-
init_completion(&xfer->comp);
- spin_lock_irqsave(&master->xferqueue.lock, flags);
+ guard(spinlock_irqsave)(&master->xferqueue.lock);
if (master->xferqueue.cur) {
list_add_tail(&xfer->node, &master->xferqueue.list);
} else {
master->xferqueue.cur = xfer;
dw_i3c_master_start_xfer_locked(master);
}
- spin_unlock_irqrestore(&master->xferqueue.lock, flags);
}
static void dw_i3c_master_dequeue_xfer_locked(struct dw_i3c_master *master,
@@ -451,11 +448,8 @@ static void dw_i3c_master_dequeue_xfer_locked(struct dw_i3c_master *master,
static void dw_i3c_master_dequeue_xfer(struct dw_i3c_master *master,
struct dw_i3c_xfer *xfer)
{
- unsigned long flags;
-
- spin_lock_irqsave(&master->xferqueue.lock, flags);
+ guard(spinlock_irqsave)(&master->xferqueue.lock);
dw_i3c_master_dequeue_xfer_locked(master, xfer);
- spin_unlock_irqrestore(&master->xferqueue.lock, flags);
}
static void dw_i3c_master_end_xfer_locked(struct dw_i3c_master *master, u32 isr)
@@ -1194,15 +1188,13 @@ static int dw_i3c_master_request_ibi(struct i3c_dev_desc *dev,
struct dw_i3c_i2c_dev_data *data = i3c_dev_get_master_data(dev);
struct i3c_master_controller *m = i3c_dev_get_master(dev);
struct dw_i3c_master *master = to_dw_i3c_master(m);
- unsigned long flags;
data->ibi_pool = i3c_generic_ibi_alloc_pool(dev, req);
if (IS_ERR(data->ibi_pool))
return PTR_ERR(data->ibi_pool);
- spin_lock_irqsave(&master->devs_lock, flags);
+ guard(spinlock_irqsave)(&master->devs_lock);
master->devs[data->index].ibi_dev = dev;
- spin_unlock_irqrestore(&master->devs_lock, flags);
return 0;
}
@@ -1212,11 +1204,10 @@ static void dw_i3c_master_free_ibi(struct i3c_dev_desc *dev)
struct dw_i3c_i2c_dev_data *data = i3c_dev_get_master_data(dev);
struct i3c_master_controller *m = i3c_dev_get_master(dev);
struct dw_i3c_master *master = to_dw_i3c_master(m);
- unsigned long flags;
- spin_lock_irqsave(&master->devs_lock, flags);
- master->devs[data->index].ibi_dev = NULL;
- spin_unlock_irqrestore(&master->devs_lock, flags);
+ scoped_guard(spinlock_irqsave, &master->devs_lock) {
+ master->devs[data->index].ibi_dev = NULL;
+ }
i3c_generic_ibi_free_pool(data->ibi_pool);
data->ibi_pool = NULL;
@@ -1243,13 +1234,12 @@ static void dw_i3c_master_set_sir_enabled(struct dw_i3c_master *master,
struct i3c_dev_desc *dev,
u8 idx, bool enable)
{
- unsigned long flags;
u32 dat_entry, reg;
bool global;
dat_entry = DEV_ADDR_TABLE_LOC(master->datstartaddr, idx);
- spin_lock_irqsave(&master->devs_lock, flags);
+ guard(spinlock_irqsave)(&master->devs_lock);
reg = readl(master->regs + dat_entry);
if (enable) {
reg &= ~DEV_ADDR_TABLE_SIR_REJECT;
@@ -1274,9 +1264,6 @@ static void dw_i3c_master_set_sir_enabled(struct dw_i3c_master *master,
if (global)
dw_i3c_master_enable_sir_signal(master, enable);
-
-
- spin_unlock_irqrestore(&master->devs_lock, flags);
}
static int dw_i3c_master_enable_hotjoin(struct i3c_master_controller *m)
@@ -1377,7 +1364,6 @@ static void dw_i3c_master_handle_ibi_sir(struct dw_i3c_master *master,
struct dw_i3c_i2c_dev_data *data;
struct i3c_ibi_slot *slot;
struct i3c_dev_desc *dev;
- unsigned long flags;
u8 addr, len;
int idx;
@@ -1395,7 +1381,7 @@ static void dw_i3c_master_handle_ibi_sir(struct dw_i3c_master *master,
* a new platform op to validate it.
*/
- spin_lock_irqsave(&master->devs_lock, flags);
+ guard(spinlock_irqsave)(&master->devs_lock);
idx = dw_i3c_master_get_addr_pos(master, addr);
if (idx < 0) {
dev_dbg_ratelimited(&master->base.dev,
@@ -1431,14 +1417,10 @@ static void dw_i3c_master_handle_ibi_sir(struct dw_i3c_master *master,
}
i3c_master_queue_ibi(dev, slot);
- spin_unlock_irqrestore(&master->devs_lock, flags);
-
return;
err_drain:
dw_i3c_master_drain_ibi_queue(master, len);
-
- spin_unlock_irqrestore(&master->devs_lock, flags);
}
/* "ibis": referring to In-Band Interrupts, and not
--
2.49.GIT
--
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v4 2/2] i3c: dw-i3c-master: fix SIR reject bit mapping for dynamic addresses
2026-01-27 2:05 [PATCH v4 0/2] i3c: dw-i3c-master: scoped spinlock guards and SIR reject fix adrianhoyin.ng
2026-01-27 2:05 ` [PATCH v4 1/2] i3c: dw-i3c-master: convert spinlock usage to scoped guards adrianhoyin.ng
@ 2026-01-27 2:05 ` adrianhoyin.ng
2026-01-27 18:28 ` Frank Li
2026-01-30 23:07 ` [PATCH v4 0/2] i3c: dw-i3c-master: scoped spinlock guards and SIR reject fix Alexandre Belloni
2 siblings, 1 reply; 5+ messages in thread
From: adrianhoyin.ng @ 2026-01-27 2:05 UTC (permalink / raw)
To: alexandre.belloni, Frank.Li, linux-i3c, linux-kernel; +Cc: adrianhoyin.ng
From: Adrian Ng Ho Yin <adrianhoyin.ng@altera.com>
The IBI_SIR_REQ_REJECT register is a 32-bit bitmap indexed by the
dynamic address of each I3C slave. The DesignWare controller derives
the bit index by folding the 7-bit dynamic address into a 5-bit value,
using the sum of the lower 5 bits and the upper 2 bits, modulo 32.
The current implementation incorrectly uses the device table index
when updating the SIR reject mask, which can result in rejecting or
accepting IBIs for the wrong device.
Compute the SIR reject bit index directly from the dynamic address,
as defined by the controller specification, and use it consistently
when updating the reject mask.
Signed-off-by: Adrian Ng Ho Yin <adrianhoyin.ng@altera.com>
---
drivers/i3c/master/dw-i3c-master.c | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/drivers/i3c/master/dw-i3c-master.c b/drivers/i3c/master/dw-i3c-master.c
index ef8a38620e0e..9ce3519cc686 100644
--- a/drivers/i3c/master/dw-i3c-master.c
+++ b/drivers/i3c/master/dw-i3c-master.c
@@ -205,6 +205,10 @@
#define EXTENDED_CAPABILITY 0xe8
#define SLAVE_CONFIG 0xec
+#define DYN_ADDR_LO_MASK GENMASK(4, 0)
+#define DYN_ADDR_HI_MASK GENMASK(6, 5)
+#define IBI_SIR_BIT_MOD 32 /* 32-bit vector */
+
#define DW_I3C_DEV_NACK_RETRY_CNT_MAX 0x3
#define DEV_ADDR_TABLE_DEV_NACK_RETRY_MASK GENMASK(30, 29)
#define DEV_ADDR_TABLE_DYNAMIC_MASK GENMASK(23, 16)
@@ -217,6 +221,7 @@
#define DEV_ADDR_TABLE_DYNAMIC_ADDR(x) FIELD_PREP(DEV_ADDR_TABLE_DYNAMIC_MASK, x)
#define DEV_ADDR_TABLE_STATIC_ADDR(x) FIELD_PREP(DEV_ADDR_TABLE_STATIC_MASK, x)
#define DEV_ADDR_TABLE_LOC(start, idx) ((start) + ((idx) << 2))
+#define DEV_ADDR_TABLE_GET_DYNAMIC_ADDR(x) FIELD_GET(DEV_ADDR_TABLE_DYNAMIC_MASK, x)
#define I3C_BUS_SDR1_SCL_RATE 8000000
#define I3C_BUS_SDR2_SCL_RATE 6000000
@@ -264,6 +269,14 @@ struct dw_i3c_drvdata {
u32 flags;
};
+static inline u32 get_ibi_sir_bit_index(u8 addr)
+{
+ u32 lo = FIELD_GET(DYN_ADDR_LO_MASK, addr);
+ u32 hi = FIELD_GET(DYN_ADDR_HI_MASK, addr);
+
+ return (lo + hi) % IBI_SIR_BIT_MOD;
+}
+
static bool dw_i3c_master_supports_ccc_cmd(struct i3c_master_controller *m,
const struct i3c_ccc_cmd *cmd)
{
@@ -1236,11 +1249,19 @@ static void dw_i3c_master_set_sir_enabled(struct dw_i3c_master *master,
{
u32 dat_entry, reg;
bool global;
+ u8 dynamic_addr;
dat_entry = DEV_ADDR_TABLE_LOC(master->datstartaddr, idx);
guard(spinlock_irqsave)(&master->devs_lock);
reg = readl(master->regs + dat_entry);
+ dynamic_addr = DEV_ADDR_TABLE_GET_DYNAMIC_ADDR(reg);
+
+ if (!dynamic_addr)
+ dev_warn(master->dev,
+ "<%s> unassigned slave device, dynamic addr:%x\n",
+ __func__, dynamic_addr);
+
if (enable) {
reg &= ~DEV_ADDR_TABLE_SIR_REJECT;
if (dev->info.bcr & I3C_BCR_IBI_PAYLOAD)
@@ -1253,11 +1274,11 @@ static void dw_i3c_master_set_sir_enabled(struct dw_i3c_master *master,
if (enable) {
global = (master->sir_rej_mask == IBI_REQ_REJECT_ALL);
- master->sir_rej_mask &= ~BIT(idx);
+ master->sir_rej_mask &= ~BIT(get_ibi_sir_bit_index(dynamic_addr));
} else {
bool hj_rejected = !!(readl(master->regs + DEVICE_CTRL) & DEV_CTRL_HOT_JOIN_NACK);
- master->sir_rej_mask |= BIT(idx);
+ master->sir_rej_mask |= BIT(get_ibi_sir_bit_index(dynamic_addr));
global = (master->sir_rej_mask == IBI_REQ_REJECT_ALL) && hj_rejected;
}
writel(master->sir_rej_mask, master->regs + IBI_SIR_REQ_REJECT);
--
2.49.GIT
--
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v4 2/2] i3c: dw-i3c-master: fix SIR reject bit mapping for dynamic addresses
2026-01-27 2:05 ` [PATCH v4 2/2] i3c: dw-i3c-master: fix SIR reject bit mapping for dynamic addresses adrianhoyin.ng
@ 2026-01-27 18:28 ` Frank Li
0 siblings, 0 replies; 5+ messages in thread
From: Frank Li @ 2026-01-27 18:28 UTC (permalink / raw)
To: adrianhoyin.ng; +Cc: alexandre.belloni, linux-i3c, linux-kernel
On Tue, Jan 27, 2026 at 10:05:07AM +0800, adrianhoyin.ng@altera.com wrote:
> From: Adrian Ng Ho Yin <adrianhoyin.ng@altera.com>
>
> The IBI_SIR_REQ_REJECT register is a 32-bit bitmap indexed by the
> dynamic address of each I3C slave. The DesignWare controller derives
> the bit index by folding the 7-bit dynamic address into a 5-bit value,
> using the sum of the lower 5 bits and the upper 2 bits, modulo 32.
>
> The current implementation incorrectly uses the device table index
> when updating the SIR reject mask, which can result in rejecting or
> accepting IBIs for the wrong device.
>
> Compute the SIR reject bit index directly from the dynamic address,
> as defined by the controller specification, and use it consistently
> when updating the reject mask.
>
> Signed-off-by: Adrian Ng Ho Yin <adrianhoyin.ng@altera.com>
> ---
Reviewed-by: Frank Li <Frank.Li@nxp.com>
> drivers/i3c/master/dw-i3c-master.c | 25 +++++++++++++++++++++++--
> 1 file changed, 23 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/i3c/master/dw-i3c-master.c b/drivers/i3c/master/dw-i3c-master.c
> index ef8a38620e0e..9ce3519cc686 100644
> --- a/drivers/i3c/master/dw-i3c-master.c
> +++ b/drivers/i3c/master/dw-i3c-master.c
> @@ -205,6 +205,10 @@
> #define EXTENDED_CAPABILITY 0xe8
> #define SLAVE_CONFIG 0xec
>
> +#define DYN_ADDR_LO_MASK GENMASK(4, 0)
> +#define DYN_ADDR_HI_MASK GENMASK(6, 5)
> +#define IBI_SIR_BIT_MOD 32 /* 32-bit vector */
> +
> #define DW_I3C_DEV_NACK_RETRY_CNT_MAX 0x3
> #define DEV_ADDR_TABLE_DEV_NACK_RETRY_MASK GENMASK(30, 29)
> #define DEV_ADDR_TABLE_DYNAMIC_MASK GENMASK(23, 16)
> @@ -217,6 +221,7 @@
> #define DEV_ADDR_TABLE_DYNAMIC_ADDR(x) FIELD_PREP(DEV_ADDR_TABLE_DYNAMIC_MASK, x)
> #define DEV_ADDR_TABLE_STATIC_ADDR(x) FIELD_PREP(DEV_ADDR_TABLE_STATIC_MASK, x)
> #define DEV_ADDR_TABLE_LOC(start, idx) ((start) + ((idx) << 2))
> +#define DEV_ADDR_TABLE_GET_DYNAMIC_ADDR(x) FIELD_GET(DEV_ADDR_TABLE_DYNAMIC_MASK, x)
>
> #define I3C_BUS_SDR1_SCL_RATE 8000000
> #define I3C_BUS_SDR2_SCL_RATE 6000000
> @@ -264,6 +269,14 @@ struct dw_i3c_drvdata {
> u32 flags;
> };
>
> +static inline u32 get_ibi_sir_bit_index(u8 addr)
> +{
> + u32 lo = FIELD_GET(DYN_ADDR_LO_MASK, addr);
> + u32 hi = FIELD_GET(DYN_ADDR_HI_MASK, addr);
> +
> + return (lo + hi) % IBI_SIR_BIT_MOD;
> +}
> +
> static bool dw_i3c_master_supports_ccc_cmd(struct i3c_master_controller *m,
> const struct i3c_ccc_cmd *cmd)
> {
> @@ -1236,11 +1249,19 @@ static void dw_i3c_master_set_sir_enabled(struct dw_i3c_master *master,
> {
> u32 dat_entry, reg;
> bool global;
> + u8 dynamic_addr;
>
> dat_entry = DEV_ADDR_TABLE_LOC(master->datstartaddr, idx);
>
> guard(spinlock_irqsave)(&master->devs_lock);
> reg = readl(master->regs + dat_entry);
> + dynamic_addr = DEV_ADDR_TABLE_GET_DYNAMIC_ADDR(reg);
> +
> + if (!dynamic_addr)
> + dev_warn(master->dev,
> + "<%s> unassigned slave device, dynamic addr:%x\n",
> + __func__, dynamic_addr);
> +
> if (enable) {
> reg &= ~DEV_ADDR_TABLE_SIR_REJECT;
> if (dev->info.bcr & I3C_BCR_IBI_PAYLOAD)
> @@ -1253,11 +1274,11 @@ static void dw_i3c_master_set_sir_enabled(struct dw_i3c_master *master,
>
> if (enable) {
> global = (master->sir_rej_mask == IBI_REQ_REJECT_ALL);
> - master->sir_rej_mask &= ~BIT(idx);
> + master->sir_rej_mask &= ~BIT(get_ibi_sir_bit_index(dynamic_addr));
> } else {
> bool hj_rejected = !!(readl(master->regs + DEVICE_CTRL) & DEV_CTRL_HOT_JOIN_NACK);
>
> - master->sir_rej_mask |= BIT(idx);
> + master->sir_rej_mask |= BIT(get_ibi_sir_bit_index(dynamic_addr));
> global = (master->sir_rej_mask == IBI_REQ_REJECT_ALL) && hj_rejected;
> }
> writel(master->sir_rej_mask, master->regs + IBI_SIR_REQ_REJECT);
> --
> 2.49.GIT
>
--
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v4 0/2] i3c: dw-i3c-master: scoped spinlock guards and SIR reject fix
2026-01-27 2:05 [PATCH v4 0/2] i3c: dw-i3c-master: scoped spinlock guards and SIR reject fix adrianhoyin.ng
2026-01-27 2:05 ` [PATCH v4 1/2] i3c: dw-i3c-master: convert spinlock usage to scoped guards adrianhoyin.ng
2026-01-27 2:05 ` [PATCH v4 2/2] i3c: dw-i3c-master: fix SIR reject bit mapping for dynamic addresses adrianhoyin.ng
@ 2026-01-30 23:07 ` Alexandre Belloni
2 siblings, 0 replies; 5+ messages in thread
From: Alexandre Belloni @ 2026-01-30 23:07 UTC (permalink / raw)
To: Frank.Li, linux-i3c, linux-kernel, adrianhoyin.ng
On Tue, 27 Jan 2026 10:05:05 +0800, adrianhoyin.ng@altera.com wrote:
> From: Adrian Ng Ho Yin <adrianhoyin.ng@altera.com>
>
> This patchset replaces open-coded spin_lock_irqsave()/spin_unlock_irqrestore()
> pairs with scoped spinlock guards to reduce boilerplate and ensure correct
> lock release on scope exit.
>
> In a subsequent patch it fixes the SIR reject bit mapping used for IBI
> handling. The IBI_SIR_REQ_REJECT register is indexed by a folded form of
> the 7-bit dynamic address, but the driver currently uses the device table
> index. This can result in IBIs being rejected or accepted for the wrong
> device. The patch derives the bit index directly from the dynamic address
> as defined by the controller.
>
> [...]
Applied, thanks!
[1/2] i3c: dw-i3c-master: convert spinlock usage to scoped guards
https://git.kernel.org/i3c/c/c7311aa4a71e
[2/2] i3c: dw-i3c-master: fix SIR reject bit mapping for dynamic addresses
https://git.kernel.org/i3c/c/ed318b3fb4ab
Best regards,
--
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
--
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-01-30 23:08 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-27 2:05 [PATCH v4 0/2] i3c: dw-i3c-master: scoped spinlock guards and SIR reject fix adrianhoyin.ng
2026-01-27 2:05 ` [PATCH v4 1/2] i3c: dw-i3c-master: convert spinlock usage to scoped guards adrianhoyin.ng
2026-01-27 2:05 ` [PATCH v4 2/2] i3c: dw-i3c-master: fix SIR reject bit mapping for dynamic addresses adrianhoyin.ng
2026-01-27 18:28 ` Frank Li
2026-01-30 23:07 ` [PATCH v4 0/2] i3c: dw-i3c-master: scoped spinlock guards and SIR reject fix Alexandre Belloni
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox