Condividi tramite


Controllo dello stato oplock di un'operazione di IRP_MJ_CREATE

Di seguito viene applicato solo quando viene aperto un flusso esistente di un file, ovvero i flussi appena creati non possono avere oplock preesistenti su di essi.

Nota Quando si elabora IRP_MJ_CREATE per qualsiasi oplock, se l'accesso desiderato non contiene nulla di diverso da FILE_READ_ATTRIBUTES, FILE_WRITE_ATTRIBUTES o SYNC, il blocco non interrompe a meno che non venga specificato FILE_RESERVE_OPFILTER. Se la creazione ha esito positivo, specificare FILE_RESERVE_OPFILTER comporta sempre un'interruzione di oplock. Per brevità e semplicità, la tabella seguente omette la precedente, poiché si applica a tutti gli oplock.

Tipo di richiesta Condizioni

Livello 1

Interrotto su IRP_MJ_CREATE quando:

  • La chiave di oplock associata alla FILE_OBJECT in cui si sta verificando l'apertura è diversa dalla chiave di oplock associata alla FILE_OBJECT che possiede il oplock.

Se il blocco è interrotto:

  • Interruzione su Nessuna IF:

    • Il flag di FILE_RESERVE_OPFILTER è impostato

      OR

    • Vengono specificati uno dei valori di eliminazione seguenti:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    ALTRO:

    • Interruzione a livello 2.
  • Prima che l'operazione continui, è necessario ricevere un riconoscimento.

Livello 2

Interrotto su IRP_MJ_CREATE quando:

  • La chiave di oplock associata alla FILE_OBJECT in cui si sta verificando l'apertura è diversa dalla chiave di oplock associata alla FILE_OBJECT che possiede il oplock.
  • E:
    • Il flag di FILE_RESERVE_OPFILTER è impostato

      OR

    • Vengono specificati uno dei valori di eliminazione seguenti:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

Se il blocco è interrotto:

  • Interruzione su Nessuno.

  • Non è necessario alcun riconoscimento, l'operazione procede immediatamente.

Batch

Interrotto su IRP_MJ_CREATE quando:

  • La chiave di oplock associata alla FILE_OBJECT in cui si sta verificando l'apertura è diversa dalla chiave di oplock associata alla FILE_OBJECT che possiede il oplock.

Se il blocco è interrotto:

  • Interruzione su Nessuna IF:

    • Il flag di FILE_RESERVE_OPFILTER è impostato.

      OR

    • Vengono specificati uno dei valori di eliminazione seguenti:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    ALTRO:

    • Interruzione a livello 2.
  • Prima che l'operazione continui, è necessario ricevere un riconoscimento.

Filtra

Interrotto su IRP_MJ_CREATE quando:

  • La chiave di oplock associata alla FILE_OBJECT in cui si sta verificando l'apertura è diversa dalla chiave di oplock associata alla FILE_OBJECT che possiede il oplock.

  • E:
    • È stato richiesto un accesso "scrivibile" nel flusso che non è stato aperto per l'accesso FILE_SHARE_READ. Si noti che l'accesso "scrivibile" è definito come qualsiasi attributo diverso da:

      • FILE_READ_ATTRIBUTES
      • FILE_WRITE_ATTRIBUTES
      • FILE_READ_DATA
      • FILE_READ_EA
      • FILE_EXECUTE
      • SYNCHRONIZE
      • READ_CONTROL

Se il blocco è interrotto:

  • Interruzione su Nessuno.

  • Prima che l'operazione continui, è necessario ricevere un riconoscimento.

Lettura

Interrotto su IRP_MJ_CREATE quando:

  • La chiave di oplock associata alla FILE_OBJECT in cui si sta verificando l'apertura è diversa dalla chiave di oplock associata alla FILE_OBJECT che possiede il oplock.

  • E:
    • Il flag di FILE_RESERVE_OPFILTER è impostato

      OR

    • Vengono specificati uno dei valori di eliminazione seguenti:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

Se il blocco è interrotto:

  • Interruzione su Nessuno.

  • Non è necessario alcun riconoscimento, l'operazione procede immediatamente.

Read-Handle

Interrotto su IRP_MJ_CREATE quando:

  • L'apertura corrente è in conflitto con un'apertura esistente in modo che si verifichi una violazione della condivisione.

    OR

  • Il flag di FILE_RESERVE_OPFILTER è impostato.

    OR

  • Vengono specificati uno dei valori di eliminazione seguenti:

    • FILE_SUPERSEDE
    • FILE_OVERWRITE
    • FILE_OVERWRITE_IF

    AND (per una delle tre condizioni precedenti)

  • La chiave di oplock associata alla FILE_OBJECT in cui si sta verificando l'apertura è diversa dalla chiave di oplock associata alla FILE_OBJECT che possiede il oplock.

Se il blocco è interrotto:

  • Interruzione su Nessuna IF:

    • Il flag di FILE_RESERVE_OPFILTER è impostato.

      OR

    • Vengono specificati uno dei valori di eliminazione seguenti:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    ALTRO:

    • Interrompere la lettura.
  • Se l'oplock si è interrotto perché l'apertura corrente è in conflitto con un'apertura esistente in modo che si verifichi una violazione di condivisione, è necessario ricevere un riconoscimento prima che l'operazione continui.
  • Se il blocco si è interrotto per qualsiasi altro motivo, anche se è necessario il riconoscimento dell'interruzione, l'operazione continua immediatamente (ad esempio, senza attendere il riconoscimento).

Read-Write

Interrotto su IRP_MJ_CREATE quando:

  • La chiave di oplock associata alla FILE_OBJECT in cui si sta verificando l'apertura è diversa dalla chiave di oplock associata alla FILE_OBJECT che possiede il oplock.

Se il blocco è interrotto:

  • Interruzione su Nessuna IF:

    • Il flag di FILE_RESERVE_OPFILTER è impostato.

      OR

    • Vengono specificati uno dei valori di eliminazione seguenti:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    ALTRO:

    • Interrompere la lettura.
  • Prima che l'operazione continui, è necessario ricevere un riconoscimento.

Handle di lettura-scrittura

Interrotto su IRP_MJ_CREATE quando:

  • La chiave di oplock associata alla FILE_OBJECT in cui si sta verificando l'apertura è diversa dalla chiave di oplock associata alla FILE_OBJECT che possiede il oplock.

Se il blocco è interrotto:

  • Interruzione su Nessuna IF:

    • Il flag di FILE_RESERVE_OPFILTER è impostato.

      OR

    • Vengono specificati uno dei valori di eliminazione seguenti:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    ALTRO:

    • Interruzione per Read-Write se l'apertura corrente è in conflitto con un'apertura esistente in modo che si verifichi una violazione della condivisione. In caso contrario, eseguire l'interruzione su Read-Handle.

  • Prima che l'operazione continui, è necessario ricevere un riconoscimento.

Il file system esegue controlli aggiuntivi per gli oplock Batch e Filter (anziché per il pacchetto oplock stesso) durante l'elaborazione di un'operazione di IRP_MJ_CREATE, che influisce sul fatto che il file system chiede al pacchetto oplock di eseguire l'elaborazione di interruzioni di oplock. Si tratta di un caso in cui le operazioni su un flusso di dati possono influire sugli oplock su altri flussi di dati dello stesso file, ovvero gli ultimi due elementi dell'elenco dei criteri seguenti. Se vengono soddisfatti uno o più dei seguenti criteri, il file system invia una richiesta al pacchetto oplock per eseguire l'elaborazione dell'interruzione di oplock:

  • Richiedere un'interruzione se si tratta di una query di rete aperta e è presente una transazione KTM . In caso contrario, non richiedere un'interruzione nella query di rete aperta.

  • Se un'operazione SUPERSEDE, OVERWRITE o OVERWRITE_IF viene eseguita in un flusso di dati alternativo e FILE_SHARE_DELETE non è specificata e nel flusso di dati primario è presente un'operazione batch o filtro, richiedere un'interruzione dell'oplock Batch o Filter nel flusso di dati primario.

  • Se viene eseguita un'operazione SUPERSEDE, OVERWRITE o OVERWRITE_IF nel flusso di dati primario e l'accesso DELETE è stato richiesto e sono presenti oplock batch o filtro in qualsiasi flusso di dati alternativo, richiedere un'interruzione degli oplock Batch o Filter su tutti i flussi di dati alternativi che li hanno.

Quando il file system decide di chiedere al pacchetto oplock di eseguire l'elaborazione di interruzioni di oplock, si applicano le regole disposte nella tabella precedente.

Il controllo per interrompere gli oplock Batch e Filter si verifica prima che vengano effettuati i controlli di accesso alla condivisione. Ciò significa che l'oplock batch o filtro viene interrotto anche se la richiesta aperta ha esito negativo a causa di una violazione della condivisione.