Topic : TOS - das Betriebssystem Author : Version : tos.hyp (5. März 2013) Subject : Programmieren/Atari Nodes : 3001 Index Size : 93602 HCP-Version : 5 Compiled on : Atari @charset : atarist @lang : @default : Titel @help : @options : +g -i -s +x +zz -t4 @width : 70 View Ref-File11.21.2.7 xfs_ddelete TOS Name: »xfs_ddelete« - löscht ein Verzeichnis Parameter: a0 = DD * -> d0 = long errcode Beschreibung: Diese Funktion musste ab MagiC Version 4.01 geändert werden. Für MagiC < 4.01 (Kernelversion < 3) gilt: Beim Löschen ist darauf zu achten, daß kein Verzeichnis durch den Kernel referenziert sein darf außer durch den Aufruf selbst (d.h. es muß dd_refcnt == 1 sein). Außerdem ist darauf zu achten, daß keine Dateien im Verzeichnis liegen. ELINK darf nicht zurückgegeben werden, symbolische Links dürfen nicht behandelt werden. Die Zugriffsberechtigung muß (falls eine existiert) vom XFS geprüft werden. Für MagiC < 4.01 (Kernelversion >= 3) gilt: Wegen Reentranzproblematiken ergeben sich einigen Änderungen, wobei der Kernel dem XFS Zugriffskontrollen abnimmt und weiterhin der Kernel den DD freigibt, nicht das XFS: Der Kernel öffnet zunächst mit xfs_path2DD den Parent des zu löschenden Verzeichnisses, dann testet er mit xfs_xattr, ob es sich um einen Symlink handelt, und löscht ihn ggf. per xfs_fdelete. Handelt es sich um ein Verzeichnis, öffnet der Kernel dieses wieder per xfs_path2DD (Modus 1) und gibt den Parent wieder per xfs_freeDD frei. Die Überprüfung von dd_refcnt wird vom Kernel durchgeführt, der Zähler kann und muß daher vom XFS ignoriert werden. Das XFS muß nun sicherstellen, daß das zu löschende Verzeichnis bzw. der DD nicht anderweitig geöffnet oder benutzt werden können (wichtig für reentrante XFSs). Das XFS löscht dann das Verzeichnis, gibt aber den DD nicht (!) frei, damit der Kernel im Erfolgsfall (Rückgabe E_OK) vorher seine Standardpfade freigeben kann. Der Kernel ruft dann xfs_freeDD auf. Wie gehabt, muß das XFS prüfen, ob das Verzeichnis leer ist, bzw. Zugriffsberechtigungen existieren. Nochmal im Zusammenhang: ∙ Kernel ermittelt zu löschenden DD, prüft Referenzzähler. ∙ xfs_ddelete sperrt den DD. Wenn das nicht geht, wird EACCDN geliefert. ∙ xfs_ddelete löscht das Verzeichnis, wenn es leer ist. Der DD wirkt dabei als Sperre für parallel laufende Versuche, das gerade gelöschte Verzeichnis zu benutzen. ∙ xfs_ddelete läßt den jetzt ungültigen, aber noch als Sperre dienenden DD weiterhin gültig (im Gegensatz zum alten Konzept). ∙ Der Kernel macht bei Erfolg seine Standardpfade ungültig. ∙ Der Kernel gibt den DD frei. Gruppe: Aufbau eines XFS Querverweis: XFS-Konzept in MagiC Ddelete