Partager via


Vérification de l’état Oplock d’une opération de IRP_MJ_CREATE

Ce qui suit s’applique uniquement lorsqu’un flux existant d’un fichier est ouvert (autrement dit, les flux nouvellement créés ne peuvent pas avoir de verrous oplocks préexistants sur eux).

Note Lors du traitement de IRP_MJ_CREATE pour un oplock, si l’accès souhaité ne contient rien d’autre que FILE_READ_ATTRIBUTES, FILE_WRITE_ATTRIBUTES ou SYNCHRONIZE, le verrouillage oplock ne s’arrête pas, sauf si FILE_RESERVE_OPFILTER est spécifié. La spécification de FILE_RESERVE_OPFILTER entraîne toujours un blocage d’opération si la création réussit. Par souci de concision et de simplicité, le tableau suivant omet ce qui précède, car il s’applique à tous les oplocks.

Type de requête Conditions

Niveau 1

Cassé sur IRP_MJ_CREATE quand :

  • La clé oplock associée au FILE_OBJECT sur lequel l’ouverture se produit est différente de la clé oplock associée à l’FILE_OBJECT propriétaire de l’oplock.

Si l’oplock est rompu :

  • Break to None SI :

    • L’indicateur FILE_RESERVE_OPFILTER est défini

      OR

    • L’une des valeurs de suppression create suivantes est spécifiée :
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    AUTRE:

    • Passer au niveau 2.
  • Un accusé de réception doit être reçu avant la poursuite de l’opération.

Niveau 2

Cassé sur IRP_MJ_CREATE quand :

  • La clé oplock associée au FILE_OBJECT sur lequel l’ouverture se produit est différente de la clé oplock associée à l’FILE_OBJECT propriétaire de l’oplock.
  • ET:
    • L’indicateur FILE_RESERVE_OPFILTER est défini

      OR

    • L’une des valeurs de suppression create suivantes est spécifiée :
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

Si l’oplock est rompu :

  • Passer à Aucun.

  • Aucun accusé de réception n’est requis, l’opération se poursuit immédiatement.

Batch

Cassé sur IRP_MJ_CREATE quand :

  • La clé oplock associée au FILE_OBJECT sur lequel l’ouverture se produit est différente de la clé oplock associée à l’FILE_OBJECT propriétaire de l’oplock.

Si l’oplock est rompu :

  • Break to None SI :

    • L’indicateur FILE_RESERVE_OPFILTER est défini.

      OR

    • L’une des valeurs de suppression create suivantes est spécifiée :
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    AUTRE:

    • Passer au niveau 2.
  • Un accusé de réception doit être reçu avant la poursuite de l’opération.

Filtrer

Cassé sur IRP_MJ_CREATE quand :

  • La clé oplock associée au FILE_OBJECT sur lequel l’ouverture se produit est différente de la clé oplock associée à l’FILE_OBJECT propriétaire de l’oplock.

  • ET:
    • Un accès souhaité « accessible en écriture » a été demandé sur le flux qui n’a pas été ouvert pour l’accès FILE_SHARE_READ. Notez que l’accès « accessible en écriture » est défini comme tout attribut autre que :

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

Si l’oplock est rompu :

  • Passer à Aucun.

  • Un accusé de réception doit être reçu avant la poursuite de l’opération.

Lire

Cassé sur IRP_MJ_CREATE quand :

  • La clé oplock associée au FILE_OBJECT sur lequel l’ouverture se produit est différente de la clé oplock associée à l’FILE_OBJECT propriétaire de l’oplock.

  • ET:
    • L’indicateur FILE_RESERVE_OPFILTER est défini

      OR

    • L’une des valeurs de suppression create suivantes est spécifiée :
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

Si l’oplock est rompu :

  • Passer à Aucun.

  • Aucun accusé de réception n’est requis, l’opération se poursuit immédiatement.

Read-Handle

Cassé sur IRP_MJ_CREATE quand :

  • L’ouverture actuelle est en conflit avec un ouvert existant, de sorte qu’une violation de partage se produit.

    OR

  • L’indicateur FILE_RESERVE_OPFILTER est défini.

    OR

  • L’une des valeurs de suppression create suivantes est spécifiée :

    • FILE_SUPERSEDE
    • FILE_OVERWRITE
    • FILE_OVERWRITE_IF

    AND (pour l’une des trois conditions ci-dessus)

  • La clé oplock associée au FILE_OBJECT sur lequel l’ouverture se produit est différente de la clé oplock associée à l’FILE_OBJECT propriétaire de l’oplock.

Si l’oplock est rompu :

  • Break to None SI :

    • L’indicateur FILE_RESERVE_OPFILTER est défini.

      OR

    • L’une des valeurs de suppression create suivantes est spécifiée :
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    AUTRE:

    • Arrêt en lecture.
  • Si le blocage d’opération s’est rompu parce que l’ouverture actuelle est en conflit avec un ouvert existant, de sorte qu’une violation de partage se produit, un accusé de réception doit être reçu avant la poursuite de l’opération.
  • Si l’oplock s’est rompu pour une autre raison, bien que l’accusé de réception de l’arrêt soit requis, l’opération se poursuit immédiatement (par exemple, sans attendre l’accusé de réception).

Lecture-écriture

Cassé sur IRP_MJ_CREATE quand :

  • La clé oplock associée au FILE_OBJECT sur lequel l’ouverture se produit est différente de la clé oplock associée à l’FILE_OBJECT propriétaire de l’oplock.

Si l’oplock est rompu :

  • Break to None SI :

    • L’indicateur FILE_RESERVE_OPFILTER est défini.

      OR

    • L’une des valeurs de suppression create suivantes est spécifiée :
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    AUTRE:

    • Arrêt en lecture.
  • Un accusé de réception doit être reçu avant la poursuite de l’opération.

Handle en lecture-écriture

Cassé sur IRP_MJ_CREATE quand :

  • La clé oplock associée au FILE_OBJECT sur lequel l’ouverture se produit est différente de la clé oplock associée à l’FILE_OBJECT propriétaire de l’oplock.

Si l’oplock est rompu :

  • Break to None SI :

    • L’indicateur FILE_RESERVE_OPFILTER est défini.

      OR

    • L’une des valeurs de suppression create suivantes est spécifiée :
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    AUTRE:

    • Arrêtez pour Read-Write si l’ouverture actuelle est en conflit avec un ouvert existant, de sorte qu’une violation de partage se produit. Sinon, arrêtez sur Read-Handle.

  • Un accusé de réception doit être reçu avant la poursuite de l’opération.

Le système de fichiers effectue des vérifications supplémentaires pour les oplocks Batch et Filter (plutôt que le package oplock lui-même) lors du traitement d’une opération de IRP_MJ_CREATE, ce qui a un impact sur le fait que le système de fichiers demande au package oplock d’effectuer un traitement d’arrêt de verrouillage d’opération. Il s’agit d’un cas où les opérations sur un flux de données peuvent avoir un impact sur les oplocks sur d’autres flux de données du même fichier (autrement dit, les deux derniers éléments de liste de la liste de critères suivantes). Si un ou plusieurs des critères suivants sont remplis, le système de fichiers envoie une demande au package oplock pour effectuer un traitement d’arrêt de blocage d’opération :

  • Demandez une pause s’il s’agit d’une requête réseau ouverte et qu’une transaction KTM est présente. Sinon, ne demandez pas d’arrêt sur la requête réseau ouverte.

  • Si une opération REMPLACE, OVERWRITE ou OVERWRITE_IF est effectuée sur un autre flux de données et que FILE_SHARE_DELETE n’est pas spécifié et qu’il existe un oplock Batch ou Filter sur le flux de données principal, demandez l’arrêt de l’opération Batch ou Filter sur le flux de données principal.

  • Si une opération REMPLACE, OVERWRITE ou OVERWRITE_IF est effectuée sur le flux de données principal et que l’accès DELETE a été demandé et qu’il existe des oplocks Batch ou Filter sur tout autre flux de données, demandez l’arrêt des oplocks Batch ou Filter sur tous les autres flux de données qui en contiennent.

Lorsque le système de fichiers décide de demander au package oplock d’effectuer un traitement d’arrêt d’opération, les règles décrites dans le tableau précédent s’appliquent.

L’case activée pour arrêter les blocages de lots et de filtres se produit avant que les vérifications d’accès au partage soient effectuées. Cela signifie que l’oplock batch ou Filter est interrompu même si la demande ouverte échoue finalement en raison d’une violation de partage.