Oplock'ları Kırma

İlgili bir oplockistendikten veverildikten sonra, bu oplock'un sahibi, talep edilen oplock türüne göre veri akışına erişebilir. Alınan işlem geçerli oplock ile uyumlu değilse sistem oplock'u kırar.

Bir oplock verildiğinde, sistem istenen IRP'yi askıya alır. Bir oplock bozulduğunda, bekleyen oplock'un istek IRP'si STATUS_SUCCESS ile tamamlanır. Düzey 1, Batch ve Filter oplockları için IRP'nin IoStatus.Information üyesini, oplock'un kırıldığı düzeyi gösterecek şekilde ayarlar. Bu düzeyler şunlardır:

  • FILE_OPLOCK_BROKEN_TO_NONE: Oplock bozuktu ve akışta geçerli bir oplock yok. Oplock'un "hiçbir şey yok" şeklinde bozulduğundan bahsedilir.

  • FILE_OPLOCK_BROKEN_TO_LEVEL_2: Mevcut oplock (Düzey 1 veya Batch), Düzey 2 oplock olarak değiştirildi. Filtre oplock'ları hiçbir zaman Düzey 2'ye değişmez, her zaman Yok olarak değişir.

Okuma-Tanıtıcı, Okuma-Yazma ve Okuma-Write-Handle oplock'ları için, oplock'un kırılma düzeyi, DeviceIoControlişleminin lpOutBuffer parametresi olarak geçirilen REQUEST_OPLOCK_OUTPUT_BUFFER yapısının NewOplockLevel üyesinde, sıfır veya daha fazla OPLOCK_LEVEL_CACHE_READ, OPLOCK_LEVEL_CACHE_HANDLE veya OPLOCK_LEVEL_CACHE_WRITE bayrağının bir kombinasyonu olarak tanımlanır. Benzer şekilde, FltFsControlFile ve ZwFsControlFile çekirdek modundan Windows 7 oplocks istemek için kullanılabilir. Daha fazla bilgi için bkz. FSCTL_REQUEST_OPLOCK.

Sistemin oplock paketi Düzey 1, Batch, Filter, Read-Write, Read-Write-Handle veya belirli koşullar altında bir Read-Handle oplock'u kırdığında:

  • oplock paketi, bekletilen oplock isteği IRP'sini tamamlar.
  • Oplock molasına neden olan işlem beklemeye alındı.

G/Ç yöneticisi, eğer işlem şu durumlarda gerçekleşirse, STATUS_PENDING döndürmek yerine işlemi engeller:

  • Senkron bir tutamak üzerinde verilir.
  • Her zaman eşzamanlı olan bir IRP_MJ_CREATE.

G/Ç yöneticisi, oplock sahibinden işlemlerini tamamladıklarını ve ertelenmiş işlemin devam etmesinin güvenli olduğunu oplock paketine bildirmek için bir onay bekler. Bu gecikme, oplock sahibinin geçerli işlem devam etmeden önce akışı tutarlı bir duruma geri koymasını sağlar. Zaman aşımı olmadığından sistem onay almak için sonsuza kadar bekler. Bu nedenle, kırılmayı zamanında kabul etmek oplock'un sahibinin sorumluluğundadır. Askıya alınmış işlemin IRP'si iptal edilebilir bir duruma ayarlanır. Beklemeyi gerçekleştiren uygulama veya sürücü sonlandırıldıysa, oplock paketi STATUS_CANCELLED ile IRP'yi hemen tamamlar.

Bir IRP_MJ_CREATE IRP, oplock kesme onayının bir parçası olarak engellenmemek için FILE_COMPLETE_IF_OPLOCKED oluşturma seçeneğini belirtebilir. Bu seçenek, oplock paketine, oplock kırılma bildirimi alınana kadar oluşturma IRP'sini engellememesi gerektiğini bildirir. Bunun yerine oluşturma işleminin devam etmesine izin verilir. Başarılı bir oluşturma işlemi oplock kesintisiyle sonuçlanırsa, dönüş kodu STATUS_SUCCESS yerine STATUS_OPLOCK_BREAK_IN_PROGRESS olur. FILE_COMPLETE_IF_OPLOCKED bayrağı genellikle kilitlenmeleri önlemek için kullanılır. Örneğin, bir istemci bir akışta oplock'a sahipse ve aynı istemci daha sonra aynı akışı açarsa, istemci oplock sonunu kabul etmek için kendisini beklemeyi engeller. Bu senaryoda, FILE_COMPLETE_IF_OPLOCKED bayrağının kullanılması kilitlenmeyi önler.

NTFS dosya sistemi, paylaşım ihlallerini denetlemeden önce Batch ve Filter oplock'ları için oplock kesintilerini başlatır. Bu nedenle, FILE_COMPLETE_IF_OPLOCKED belirten bir oluşturma işlemi, STATUS_SHARING_VIOLATION ile başarısız olabilir, ancak yine de bir Batch veya Filter oplock'un bozulmasına neden olabilir. Bu durumda, çağıranın bu durumu tespit etmesine olanak tanımak amacıyla, IO_STATUS_BLOCK yapısının bilgi üyesi, FILE_OPBATCH_BREAK_UNDERWAY olarak ayarlanır.

Read-Handle ve Read-Write-Handle oplock'lar için, NTFS bir paylaşım ihlali denetledikten ve algıladıktan sonra oplock kırılması başlatılır. Bu dizi, oplock sahiplerine kollarını kapatma ve geri çekilme fırsatı verir, böylece paylaşım ihlalinin kullanıcıya iletilmemesi için bir olasılık yaratır. Ayrıca, oplock'un önbelleğe aldığı tanıtıcının yeni oluşturma işlemiyle çakışmadığı durumlarda, oplock'un gereksiz yere devredışı bırakılmasını önler.

Düzey 2, Okuma veya belirli koşullar altında Read-Handle oplock'lar kesildiğinde, sistem bir onay beklemez. Bunun nedeni, diğer istemcilerin dosyaya erişmesine izin vermeden önce akışta önbelleğe alınmış bir durumun dosyaya geri yüklenmesi gerekmemesidir.

Oplock'un kırılması gerekip gerekmediğini belirlemek için mevcut oplock durumunu denetleyen bazı dosya sistemi işlemleri vardır. Aşağıdaki işleme özgü makaleler, oplock kesmesini neyin tetiklediğini, oplock'un hangi düzeyde kesileceğini neyin belirlediğini ve kesme onayı gerekip gerekmediğini açıklar:

Windows 7 oplock'unun bozulması, REQUEST_OPLOCK_OUTPUT_BUFFER yapısının Flags üyesinde REQUEST_OPLOCK_OUTPUT_FLAG_ACK_REQUIRED bayrağı ayarlanmışsa bildirim gerektirir. Bu durumlarda, DeviceIoControl(lpOutBuffer)'ın çıkış parametresi olarak, FltFsControlFile(OutBuffer)'a veya ZwFsControlFile(OutBuffer)'a gönderilmelidir. Daha fazla bilgi için bkz. FSCTL_REQUEST_OPLOCK.

Her bir işlemle ilgili makalelerde, bir Read-Handle oplock'un ne zaman kesilmesinin, oplock'u bozan işlemin beklemeye alınmasına neden olan ayrıntıları açıklanmaktadır. Örneğin, IRP_MJ_CREATE makale ilişkili Read-Handle ayrıntılarını içerir.