* @entry: The entry to store.
  *
  * The @mas->index and @mas->last is used to set the range for the @entry.
- * Note: The @mas should have pre-allocated entries to ensure there is memory to
- * store the entry.  Please see mas_expected_entries()/mas_destroy() for more details.
  *
  * Return: the first entry between mas->index and mas->last or %NULL.
  */
 void *mas_store(struct ma_state *mas, void *entry)
 {
+       int request;
        MA_WR_STATE(wr_mas, mas, entry);
 
        trace_ma_write(__func__, mas, 0, entry);
         */
        mas_wr_prealloc_setup(&wr_mas);
        mas_wr_store_type(&wr_mas);
+       if (mas->mas_flags & MA_STATE_PREALLOC) {
+               mas_wr_store_entry(&wr_mas);
+               MAS_WR_BUG_ON(&wr_mas, mas_is_err(mas));
+               return wr_mas.content;
+       }
+
+       request = mas_prealloc_calc(mas, entry);
+       if (!request)
+               goto store;
+
+       mas_node_count(mas, request);
+       if (mas_is_err(mas))
+               return NULL;
+
+store:
        mas_wr_store_entry(&wr_mas);
+       mas_destroy(mas);
        return wr_mas.content;
 }
 EXPORT_SYMBOL_GPL(mas_store);