Ensure that the NFSv4.1 CB_RECALL_SLOT callback updates the slot table
target max slotid safely.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
if (args->crsa_target_max_slots == fc_tbl->max_slots)
goto out;
- fc_tbl->target_highest_slotid = args->crsa_target_max_slots;
+ nfs41_set_target_slotid(fc_tbl, args->crsa_target_max_slots);
nfs41_handle_recall_slot(cps->clp);
out:
dprintk("%s: exit with status = %d\n", __func__, ntohl(status));
extern struct nfs4_slot *nfs4_alloc_slots(struct nfs4_slot_table *table,
u32 max_slots, gfp_t gfp_flags);
+extern void nfs41_set_target_slotid(struct nfs4_slot_table *tbl,
+ u32 target_highest_slotid);
static inline bool
is_ds_only_client(struct nfs_client *clp)
tbl->generation++;
}
+void nfs41_set_target_slotid(struct nfs4_slot_table *tbl,
+ u32 target_highest_slotid)
+{
+ spin_lock(&tbl->slot_tbl_lock);
+ nfs41_set_target_slotid_locked(tbl, target_highest_slotid);
+ spin_unlock(&tbl->slot_tbl_lock);
+}
+
static void nfs41_set_server_slotid_locked(struct nfs4_slot_table *tbl,
u32 highest_slotid)
{