Linuxの備忘録とか・・・(目次へ)Linuxの備忘録とか・・・(目次へ)LEASEロックのブレイクファイルのオープン毎に、LEASEロックのチェックを__break_lease()をコールする事で行われます。ブレイクプロセスのopenの書き込み/読み込みかに応じて、新規にfile_lockオブジェクトをF_WRLCK/F_RDLCKで割り当てます。このfile_lockオブジェクトはLEASEロックを取得するというのでなく、そのメンバーを、ブレイク処理のため(競合チェック/ウエイトリスト)に利用することにあるようです。lock_flocks()は単にスピンロックを取得しているだけで、time_out_leases()が実際のロックを解除する処理です。この関数はLEASEロックを、ブレイク時間を越えたかどうかで走査してチェックしているだけです。従って、ブレイクするまでウエイトする事はありません。inode->i_flockがNULL(いかなるロックが無い)、!IS_LEASE(flock)がLEASEロックは無い。場合、ロックブレイクにかかる処理は必要ありません。locks_conflict()でロックの競合をチェックします。これはどちらかが排他ロックなら競合となります。(ここでの処理は、すでに対象ファイルはロックを有しています。)なお、このチェックではLEASEロックとしてでなく、POSIXロック/FLOCKロックを考慮しています。1は、LEASEロックを有しているプロセスが、改めてopenしたケースの対応です。この場合、通常にopenされるのですが、同時にLEASEロックは解除されます。fl->fl_next)で、すべてのLEASEロックをブレイク処理の設定を施します(実際のブレイク処理は、time_out_leases())。書き込み要求なら、全LEASEロックは解除(FL_UNLOCK_PENDING)とし、ブレイクタイムとしてfl->fl_break_timeに設定します。読み込み要求なら、排他ロックを共通ロックに変更(FL_DOWNGRADE_PENDING)とし、fl->fl_downgrade_timeにブレイクタイムとします。fl->fl_lmops->lm_break()でこのロックを有しているプロセスにシグナルを送信します。lease_break_timeは標準秒は45で、なお0の場合、ブレイクしないことになるため、break_time++としている。restart:ラベルで、wait_event_interruptible_timeou()で、呼び出しプロセスが、LEASEロックが解除までのbreak_time秒ウエイトする。第二引数の条件となる!new_fl->fl_nextで、ここにはブロッカとなるロックオブジェクトが設定されている。これを有しているプロセスが削除された場合でないか・・・。タイムアウトでwait_event_interruptible_timeou()から復帰すると、このロックブロックを削除し、再度time_out_leases()でロックの解除を行うことになる。error;}time_out_leases()でLEASEロックの解除を行う。解除チェック対象となるLEASEロックは、ロック状態が、FL_UNLOCK_PENDING(書き込みopen)/FL_DOWNGRADE_PENDING(読み込みopen)のロックオブジェクトで、ブレイクタイマfl->fl_downgrade_time/fl->fl_break_timeを経過タイムをチェックする。この2つのタイマは、対象とならないタイマは0となっていて、past_time()の引数が0のとき、falseを返すようになっている。trueが返ってきたら、タイムアップで、該当するロックをlease_modify()で、F_RDLCK/F_UNLCKに変更する。lease_break_callback()で、kill_fasy()でSIGIOシグナルを送信する。ノースAdsense広告情報が設定されていません。