関数はspin_lockを実行することで開始されるため(そして最後にロックが解除されます)、
spin_lock(&sbi->s_lock);
同時アクセスから保護されます。では、なぜsmp_wmbとsmp_rmbが必要なのか...
書き込み操作に関しては、
sbi->s_overhead_last = overhead;
smp_wmb();
sbi->s_blocks_last = le32_to_cpu(es->s_blocks_count);
smp_wmbは、2 つの割り当ての順序を変更するコンパイラまたはプロセッサの最適化 (メモリ アクセスに関して 2 つの書き込み間に依存関係がないため) を妨げているようです。ext2_statfsには同時アクセスがないため、同様の動作をする可能性のある別の関数で問題が発生し、ブロック数の変更があるかどうかを確認し、そうでない場合はオーバーヘッドを使用するsbi->s_overhead_last
可能性があります。 、まさにこの時点で、別の関数で、間違った順序での 2 つの書き込み操作の途中です。
sbiプロパティへの同様の書き込みアクセスは事前に (同じスピンロックで) spin_lockするので、これはおそらく予防策です。また、2 つの操作をこの順序で実行する必要があるという事実も強化されます。
読み取りアクセスに関しては、その必要性はあまり明白ではなく、sbiブロックとesブロックの間の依存関係をさらに分析する必要があります。