File system filter - cancel safe queues
От: Igor Kolesnik  
Дата: 25.09.06 14:13
Оценка:
Здравствуйте.

Пишу фильтр файловой системы, использую cancel safe queues.
Идея в том, чтобы все irp_mj_create запросы ставить в очередь с целью их
последующей обработки и не блокировать функцию-диспатчер.
Все остальные запросы передаются вниз по стеку сразу же, без задержки.

При постановке запроса в очередь я делаю следующее:

IoCsqInsertIrp(&Pdx->CancelSafeQueue,
Irp,
NULL);

KeReleaseSemaphore(&Pdx->IrpQueueSemaphore,
0,
1,
FALSE);

return STATUS_PENDING;

Далее в отдельном потоке ядра делаю:

KeWaitForSingleObject(&Pdx->IrpQueueSemaphore,
Executive,
KernelMode,
FALSE,
NULL);

Irp = IoCsqRemoveNextIrp(&Pdx->CancelSafeQueue, NULL);
if (!Irp)
{
continue;
}

IoSkipCurrentIrpStackLocation(Irp);

IoCallDriver(Pdx->AttachedToDeviceObject, Irp);

Проблемма в том, что при работе, как только како-либо процесс пытается открыть файл
(мой фильтр получает запрос create), он блокируется. То есть процесс вроде как не получает
результата обработки запроса и впадает в бесконечное ожидание.


Я только начал заниматься разработкой драйверов, может не достаточно ясно изложил ситуацию.
Надеюсь на вашу помощь, совет, наводящие вопросы и пр.

Спасибо за внимание.
Re: File system filter - cancel safe queues
От: Sergey Storozhevykh Россия  
Дата: 26.09.06 07:07
Оценка:
Здравствуйте, Igor Kolesnik, Вы писали:

IK>Здравствуйте.


IK>Пишу фильтр файловой системы, использую cancel safe queues.

IK>Идея в том, чтобы все irp_mj_create запросы ставить в очередь с целью их
IK>последующей обработки и не блокировать функцию-диспатчер.
IK>Все остальные запросы передаются вниз по стеку сразу же, без задержки.

Нет смысла реализовывать отложенную обработку операции открытия файла, т.к. эта операция по природе своей всегда синхронна Даже если вы вернете STATUS_PENDING, I/O Manager все равно будет ждать, пока вы не завершите оригинальный запрос. Т.е. поток все равно будет переведен в состояние ожидания до тех пор, пока IRP не завершиться со статусом, отличным от STATUS_PENDING.

Отложенная обработка IRP имеет место быть в случае выполнения асинхронных операций для того чтобы не блокировать вызывающий поток, запросивший асинхронное поведение.
Re[2]: File system filter - cancel safe queues
От: Злость Россия  
Дата: 26.09.06 07:54
Оценка: 9 (1)
Здравствуйте, Sergey Storozhevykh, Вы писали:

[skip]

Вы не задавалиь вопросом зачем планировали ввести поддержку cancellation для IRP_MJ_CREATE в Longhorn.
Правда, Ложь — мне все одно — я имею свое мнение.
Если функция недокументированна — это не значит, что ее не используют все ваши конкуренты в своих продуктах.
Любой строй переходный и отрицать это значит быть закостенелым идиотом.
Re[3]: File system filter - cancel safe queues
От: Sergey Storozhevykh Россия  
Дата: 26.09.06 09:06
Оценка:
Здравствуйте, Злость, Вы писали:

З>Вы не задавалиь вопросом зачем планировали ввести поддержку cancellation для IRP_MJ_CREATE в Longhorn.


Ваша правда, в Vista поведение I/O Manager в части выполнения create-запросов изменилось, что сделало актуальным поддержку cancellation для IRP_MJ_CREATE в драйверах. Мой промах.

Однако, это может быть целесообразно только в том случае, если период ожидания в pre-create превышает некий разумный предел.

Reasonable period means here less than 10 seconds for most operations and their cancellations. This time is derived from a user's tolerance to delays when closing an application or canceling an I/O operation that the user perceives is taking too long.

Re[4]: File system filter - cancel safe queues
От: Igor Kolesnik  
Дата: 26.09.06 09:51
Оценка:
Здравствуйте, Sergey Storozhevykh, Вы писали:

SS>Здравствуйте, Злость, Вы писали:


З>>Вы не задавалиь вопросом зачем планировали ввести поддержку cancellation для IRP_MJ_CREATE в Longhorn.


SS>Ваша правда, в Vista поведение I/O Manager в части выполнения create-запросов изменилось, что сделало актуальным поддержку cancellation для IRP_MJ_CREATE в драйверах. Мой промах.


SS>Однако, это может быть целесообразно только в том случае, если период ожидания в pre-create превышает некий разумный предел.


Но сейчас (не в Vista) я могу cancel'ить irp_mj_create в своей completion процедуре? Так?
Re[5]: File system filter - cancel safe queues
От: Sergey Storozhevykh Россия  
Дата: 26.09.06 10:40
Оценка:
Здравствуйте, Igor Kolesnik, Вы писали:

IK>Но сейчас (не в Vista) я могу cancel'ить irp_mj_create в своей completion процедуре? Так?


Суть cancellation в том, чтобы отменить долгоиграющие IRP (читай — незавершенные в течение длительного промежутка времени), например, при закрытии потока, который инициировал их создание. А если I/O Manager позвал cоmpletion routine, значит IRP уже завершен/отменен. Нет смысла его отменять в этом случае.

Имеется в виду, что в Vista вы должны предусмотреть возможность отмены create-IRP, если собираетесь долго возиться с ним. Для этого можно воспользоваться механизмом cancel-safe queue, что предполагает отложенную обработку таких запросов. Для предыдущих выпусков ОС это пока не актуально (возможно в будущих сервис-паках поведение изменится). ИМХО, лучше ориентироваться на Vista в этом вопросе и делать create "отменяемым".

Да, и если уж ориентироваться на Vista, то нужно, конечно же, писать минифильтр ФС.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.