Compartir a través de


Interbloqueos de interrupción

Después de solicitar y conceder un interbloqueo, el propietario de ese oplock tiene acceso a la secuencia en función del tipo de oplock que se solicitó. Si la operación recibida no es compatible con el interbloqueo actual, el sistema interrumpe el interbloqueo.

Cuando se concede un interbloqueo, el sistema escribe el IRP solicitante. Cuando se interrumpe un interbloqueo, el IRP de solicitud del interbloqueo se completa con STATUS_SUCCESS. Para el nivel 1, Batch y Filter oplocks el miembro IoStatus.Information del IRP se establece para indicar el nivel al que se está interrumpiendo el oplock. Estos niveles son:

  • FILE_OPLOCK_BROKEN_TO_NONE: el interbloqueo se interrumpió y no hay ningún interbloqueo actual en la secuencia. Se dice que el oplock ha sido "roto a Ninguno".

  • FILE_OPLOCK_BROKEN_TO_LEVEL_2: el interbloqueo actual (nivel 1 o lote) se convirtió en un interbloqueo de nivel 2. Los interbloqueos de filtro nunca se interrumpen en el nivel 2, siempre se interrumpen en Ninguno.

En el caso de los interbloqueos read-handle, read-write y read-write-handle, el nivel al que se rompe el oplock se describe como una combinación de cero o más de las marcas OPLOCK_LEVEL_CACHE_READ, OPLOCK_LEVEL_CACHE_HANDLE o OPLOCK_LEVEL_CACHE_WRITE en el miembro NewOplockLevel de la estructura de REQUEST_OPLOCK_OUTPUT_BUFFER pasada como el parámetro lpOutBuffer de DeviceIoControl. De forma similar, FltFsControlFile y ZwFsControlFile se pueden usar para solicitar interbloqueos de Windows 7 desde el modo kernel. Para obtener más información, consulte FSCTL_REQUEST_OPLOCK.

Cuando el paquete de interbloqueo de operación del sistema interrumpe un nivel 1, lote, filtro, lectura y escritura, identificador de escritura de lectura o, en determinadas circunstancias, un interbloqueo de Read-Handle:

  • El paquete de interbloqueo completa el IRP de solicitud de interbloqueo con lápiz.
  • La operación que provocó la interrupción del interbloqueo se ha lápiz.

Si la operación se emite en un identificador sincrónico o se trata de un IRP_MJ_CREATE, que siempre es sincrónico, el administrador de E/S hace que la operación se bloquee, en lugar de devolver STATUS_PENDING, esperando una confirmación del propietario del oplock para indicar al paquete de interbloqueo que han terminado su procesamiento y es seguro para que la operación en lápiz continúe. El propósito de este retraso es permitir que el propietario del interbloqueo vuelva a colocar la secuencia en un estado coherente antes de que continúe la operación actual. El sistema espera para siempre recibir la confirmación, ya que no hay tiempo de espera. Por lo tanto, es necesario que el propietario del interbloqueo reconozca la interrupción de manera oportuna. El IRP de la operación en lápiz se establece en un estado cancelable. Si la aplicación o el controlador que realiza la espera finaliza, el paquete de interbloqueo completa inmediatamente el IRP con STATUS_CANCELLED.

Una IRP_MJ_CREATE IRP puede especificar la opción crear FILE_COMPLETE_IF_OPLOCKED para evitar que se bloquee como parte de la confirmación de interrupción de interbloqueo. Esta opción indica al paquete oplock que no bloquee el IRP de creación hasta que se reciba la confirmación de interrupción de interbloqueo. En su lugar, la creación puede continuar. Si una creación correcta da como resultado una interrupción de interbloqueo, el código devuelto se STATUS_OPLOCK_BREAK_IN_PROGRESS, en lugar de STATUS_SUCCESS. La marca FILE_COMPLETE_IF_OPLOCKED se usa normalmente para evitar interbloqueos. Por ejemplo, si un cliente posee un interbloqueo en una secuencia y el mismo cliente abre más adelante la misma secuencia, el cliente bloquearía la espera para confirmar la interrupción de oplock. En este escenario, el uso de la marca FILE_COMPLETE_IF_OPLOCKED evita el interbloqueo.

Dado que el sistema de archivos NTFS inicia interrupciones de interbloqueo por lotes y filtros antes de comprobar si hay infracciones de uso compartido, es posible que se produzca un error en una creación especificada FILE_COMPLETE_IF_OPLOCKED con STATUS_SHARING_VIOLATION pero que siga provocando que se interrumpa un bloqueo de operación por lotes o filtro. En este caso, el miembro de información de la estructura IO_STATUS_BLOCK se establece en FILE_OPBATCH_BREAK_UNDERWAY para permitir que el autor de la llamada detecte este caso.

Para Read-Handle y los interbloqueos de identificador de lectura y escritura, la interrupción de interbloqueo se inicia después de que NTFS compruebe y detecte una infracción de uso compartido. Esto da a los titulares de estos interbloqueos la oportunidad de cerrar sus manijas y salir del camino, permitiendo así la posibilidad de no devolver la infracción de uso compartido al usuario. También evita interrumpir incondicionalmente el interbloqueo en los casos en los que el identificador que almacena en caché el interbloqueo no entra en conflicto con la nueva creación.

Cuando el nivel 2, lectura y, en determinadas circunstancias, Read-Handle interbloqueos, el sistema no espera una confirmación. Esto se debe a que no debe haber ningún estado almacenado en caché en la secuencia que deba restaurarse en el archivo antes de permitir que otros clientes accedan a él.

Hay ciertas operaciones del sistema de archivos que comprueban el estado actual del interbloqueo para determinar si el bloqueo de operación debe romperse. En los artículos siguientes se muestra cada operación y se describe qué desencadena una interrupción de interbloqueo, qué determina el nivel al que se interrumpe el interbloqueo y si se requiere una confirmación de la interrupción:

Una interrupción de un interbloqueo de Windows 7 requiere una confirmación si la marca de REQUEST_OPLOCK_OUTPUT_FLAG_ACK_REQUIRED está establecida en el miembro Flags de la estructura de REQUEST_OPLOCK_OUTPUT_BUFFER pasada como parámetro de salida de DeviceIoControl(lpOutBuffer), FltFsControlFile(OutBuffer) o ZwFsControlFile(OutBuffer). Para obtener más información, consulte FSCTL_REQUEST_OPLOCK.

En los artículos enumerados por operación se describen los detalles de cuándo una interrupción de un interbloqueo de Read-Handle da como resultado el pendiente de la operación que interrumpió el interbloqueo. Por ejemplo, el artículo IRP_MJ_CREATE contiene los detalles de Read-Handle asociados.