LINUX.ORG.RU

История изменений

Исправление intelfx, (текущая версия) :

Так и думал.

Всё происходит в драйвере ФС. Идея в том, что есть некоторый счётчик зарезервированных блоков на диске. Обычно он равен нулю, т. е. все блоки или свободны, или заняты данными. Если некоторый поток хочет аллоцировать место на диске, он сначала оценивает сверху требуемое количество и резервирует его (увеличивает счётчик на N), и только потом аллоцирует по мере необходимости. В итоге часть зарезервированных блоков переходит в разряд аллоцированных, а остальные возвращаются к свободным. Сам счётчик сейчас под спинлоком. Сложность в том, что зарезервировать место может один поток, а освободить неиспользованное — другой и вообще по частям.

А сделать нужно вот что: дождаться того момента, когда счётчик станет равен нулю, и зарезервировать всё свободное на этот момент место (атомарно).

Я хотел, чтобы все потоки, которые в штатном режиме резервируют место, захватывали семафор в режиме read, а то, что я сейчас пишу — захватывало его же в режиме write и ждало, пока читателей не станет.

Желание разблокировать то, что поток не блокировал, возникает как раз потому что

зарезервировать место может один поток, а освободить неиспользованное — другой и вообще по частям.

Исходная версия intelfx, :

Так и думал.

Всё происходит в драйвере ФС. Идея в том, что есть некоторый счётчик зарезервированных блоков на диске. Обычно он равен нулю, т. е. все блоки или свободны, или заняты данными. Если некоторый поток хочет аллоцировать место на диске, он сначала оценивает сверху требуемое количество и резервирует его (увеличивает счётчик на N), и только потом аллоцирует по мере необходимости. В итоге часть зарезервированных блоков переходит в разряд аллоцированных, а остальные возвращаются к свободным. Сам счётчик сейчас под спинлоком. Сложность в том, что зарезервировать место может один поток, а освободить неиспользованное — другой и вообще по частям.

А сделать нужно вот что: дождаться того момента, когда счётчик станет равен нулю, и зарезервировать всё свободное на этот момент место (атомарно).

Я хотел, чтобы все потоки, которые в штатном режиме резервируют место, захватывали семафор в режиме read, а то, что я сейчас пишу — захватывало его же в режиме write и ждало, пока читателей не станет.