linux/fs/afs/callback.c
<<
14./spa 14./form 14.a 14 href="../linux+v3.7.3/fs/afs/callback.c"> 14.img src="../.static/gfx/right.png" alt=">>"> ./spa .spa class="lxr_search"> ="+search" method="post" onsubmit="return do_search(this);"> 14.input typ 14.input typ 14.buttopttyp Search 14Prefs 14./a> ./spa 14 4./div 14 4.form ac > ="ajax+*" method="post" onsubmit="return false;"> .input typ 14 4./form 14 4.div class="headingbottom">
.div id4 41./a>.spa class="comment">/*./spa 4 42./a>.spa class="comment"> * Copyright (c) 2002, 2007 Red Hat, Inc. All rights reserved../spa 4 43./a>.spa class="comment"> *./spa 4 44./a>.spa class="comment"> * This software may be freely redistributed under the terms of the./spa 4 45./a>.spa class="comment"> * GNU General Public License../spa 4 46./a>.spa class="comment"> *./spa 4 47./a>.spa class="comment"> * You should have received a copy of the GNU General Public License./spa 4 48./a>.spa class="comment"> * along with this program; if not, write to the Free Software./spa 4 49./a>.spa class="comment"> * Founda > , Inc., 675 Mass Ave, Cambridge, MA 02139, USA../spa 4 1 a>.spa class="comment"> *./spa 4 11./a>.spa class="comment"> * Authors: David Woodhouse <dwmw2@infradead.org>./spa 4 12./a>.spa class="comment"> * David Howells <dhowells@redhat.com>./spa 4 13./a>.spa class="comment"> *./spa 4 14./a>.spa class="comment"> */./spa 4 15./a> 4 16./a>#include <linux/kernel.h./a>> 4 17./a>#include <linux/module.h./a>> 4 18./a>#include <linux/init.h./a>> 4 19./a>#include <linux/circ_buf.h./a>> 4 20./a>#include <linux/sched.h./a>> 4 21./a>#include "internal.h./a>" 4 22./a> 4 23./a>#if 0 4 24./a>unsigned .a href="+code=afs_vnode_upda e_timeout" class="sref">afs_vnode_upda e_timeout./a> = 1 ; 4 25./a>#endif .spa class="comment">/* 0 */./spa 4 26./a> 4 27./a>#define .a href="+code=afs_breakring_space" class="sref">afs_breakring_space./a>(.a href="+code=server" class="sref">server./a>) \ 4 28./a> .a href="+code=CIRC_SPACE" class="sref">CIRC_SPACE./a>((.a href="+code=server" class="sref">server./a>)->.a href="+code=cb_break_head" class="sref">cb_break_head./a>, (.a href="+code=server" class="sref">server./a>)->.a href="+code=cb_break_tail" class="sref">cb_break_tail./a>, \ 4 29./a> .a href="+code=ARRAY_SIZE" class="sref">ARRAY_SIZE./a>((.a href="+code=server" class="sref">server./a>)->.a href="+code=cb_break" class="sref">cb_break./a>)) 4 30./a> 4 31./a>.spa class="comment">//static void afs_callback_upda er(struct work_struct *);./spa 4 32./a> 4 33./a>static struct .a href="+code=workqueue_struct" class="sref">workqueue_struct./a> *.a href="+code=afs_callback_upda e_worker" class="sref">afs_callback_upda e_worker./a>; 4 34./a> 4 35./a>.spa class="comment">/*./spa 4 36./a>.spa class="comment"> * allow the fileserver to request callback state (re-)initialisa > ./spa 4 37./a>.spa class="comment"> */./spa 4 38./a>void .a href="+code=afs_init_callback_state" class="sref">afs_init_callback_state./a>(struct .a href="+code=afs_server" class="sref">afs_server./a> *.a href="+code=server" class="sref">server./a>) 4 39./a>{ 4 40./a> struct .a href="+code=afs_vnode" class="sref">afs_vnode./a> *.a href="+code=vnode" class="sref">vnode./a>; 4 41./a> 4 42./a> .a href="+code=_enter" class="sref">_enter./a>(.spa class="string">"{%p}"server./a>); 4 43./a> 4 44./a> .a href="+code=spin_lock" class="sref">spin_lock./a>(&.a href="+code=server" class="sref">server./a>->.a href="+code=cb_lock" class="sref">cb_lock./a>); 4 45./a> 4 46./a> .spa class="comment">/* kill all the promises on record from this server */./spa 4 47./a> while (!.a href="+code=RB_EMPTY_ROOT" class="sref">RB_EMPTY_ROOT./a>(&.a href="+code=server" class="sref">server./a>->.a href="+code=cb_promises" class="sref">cb_promises./a>)) { 4 48./a> .a href="+code=vnode" class="sref">vnode./a> = .a href="+code=rb_entry" class="sref">rb_entry./a>(.a href="+code=server" class="sref">server./a>->.a href="+code=cb_promises" class="sref">cb_promises./a>..a href="+code=rb_node" class="sref">rb_node./a>, 4 49./a> struct .a href="+code=afs_vnode" class="sref">afs_vnode./a>, .a href="+code=cb_promise" class="sref">cb_promise./a>); 4 50./a> .a href="+code=_debug" class="sref">_debug./a>(.spa class="string">"UNPROMISE { vid<%x:%u uq<%u}"4 51./a> .a href="+code=vnode" class="sref">vnode./a>->.a href="+code=fid" class="sref">fid./a>..a href="+code=vid" class="sref">vid./a>, .a href="+code=vnode" class="sref">vnode./a>->.a href="+code=fid" class="sref">fid./a>..a href="+code=vnode" class="sref">vnode./a>, .a href="+code=vnode" class="sref">vnode./a>->.a href="+code=fid" class="sref">fid./a>..a href="+code=unique" class="sref">unique./a>); 4 52./a> .a href="+code=rb_erase" class="sref">rb_erase./a>(&.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cb_promise" class="sref">cb_promise./a>, &.a href="+code=server" class="sref">server./a>->.a href="+code=cb_promises" class="sref">cb_promises./a>); 4 53./a> .a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cb_promised" class="sref">cb_promised./a> = .a href="+code=false" class="sref">false./a>; 4 54./a> } 4 55./a> 4 56./a> .a href="+code=spin_unlock" class="sref">spin_unlock./a>(&.a href="+code=server" class="sref">server./a>->.a href="+code=cb_lock" class="sref">cb_lock./a>); 4 57./a> .a href="+code=_leave" class="sref">_leave./a>(.spa class="string">""4 58./a>} 4 59./a> 4 6 a>.spa class="comment">/*./spa 4 61./a>.spa class="comment"> * handle the data invalida > side of a callback being broke ./spa 4 62./a>.spa class="comment"> */./spa 4 63./a>void .a href="+code=afs_broke _callback_work" class="sref">afs_broke _callback_work./a>(struct .a href="+code=work_struct" class="sref">work_struct./a> *.a href="+code=work" class="sref">work./a>) 4 64./a>{ 4 65./a> struct .a href="+code=afs_vnode" class="sref">afs_vnode./a> *.a href="+code=vnode" class="sref">vnode./a> = 4 66./a> .a href="+code=container_of" class="sref">container_of./a>(.a href="+code=work" class="sref">work./a>, struct .a href="+code=afs_vnode" class="sref">afs_vnode./a>, .a href="+code=cb_broke _work" class="sref">cb_broke _work./a>); 4 67./a> 4 68./a> .a href="+code=_enter" class="sref">_enter./a>(.spa class="string">""4 69./a> 4 70./a> if (.a href="+code=test_bit" class="sref">test_bit./a>(.a href="+code=AFS_VNODE_DELETED" class="sref">AFS_VNODE_DELETED./a>, &.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=flags" class="sref">flags./a>)) 4 71./a> return; 4 72./a> 4 73./a> .spa class="comment">/* we're only interested in dealing with a broke callback > *this*./spa 4 74./a>.spa class="comment"> * vnode and only if no-one else has dealt with it yet */./spa 4 75./a> if (!.a href="+code=mutex_trylock" class="sref">mutex_trylock./a>(&.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=valida e_lock" class="sref">valida e_lock./a>)) 4 76./a> return; .spa class="comment">/* someone else is dealing with it */./spa 4 77./a> 4 78./a> if (.a href="+code=test_bit" class="sref">test_bit./a>(.a href="+code=AFS_VNODE_CB_BROKEN" class="sref">AFS_VNODE_CB_BROKEN./a>, &.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=flags" class="sref">flags./a>)) { 4 79./a> if (.a href="+code=S_ISDIR" class="sref">S_ISDIR./a>(.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=vfs_inode" class="sref">vfs_inode./a>..a href="+code=i_mode" class="sref">i_mode./a>)) 4 80./a> .a href="+code=afs_clear_permits" class="sref">afs_clear_permits./a>(.a href="+code=vnode" class="sref">vnode./a>); 4 81./a> 4 82./a> if (.a href="+code=afs_vnode_fetch_status" class="sref">afs_vnode_fetch_status./a>(.a href="+code=vnode" class="sref">vnode./a>, .a href="+code=NULL" class="sref">NULL./a>, .a href="+code=NULL" class="sref">NULL./a>) < 0) 4 83./a> goto .a href="+code=out" class="sref">out./a>; 4 84./a> 4 85./a> if (.a href="+code=test_bit" class="sref">test_bit./a>(.a href="+code=AFS_VNODE_DELETED" class="sref">AFS_VNODE_DELETED./a>, &.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=flags" class="sref">flags./a>)) 4 86./a> goto .a href="+code=out" class="sref">out./a>; 4 87./a> 4 88./a> .spa class="comment">/* if the vnode's data vers > number changed then its contents./spa 4 89./a>.spa class="comment"> * are different */./spa 4 90./a> if (.a href="+code=test_and_clear_bit" class="sref">test_and_clear_bit./a>(.a href="+code=AFS_VNODE_ZAP_DATA" class="sref">AFS_VNODE_ZAP_DATA./a>, &.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=flags" class="sref">flags./a>)) 4 91./a> .a href="+code=afs_zap_data" class="sref">afs_zap_data./a>(.a href="+code=vnode" class="sref">vnode./a>); 4 92./a> } 4 93./a> 4 94./a>.a href="+code=out" class="sref">out./a>: 4 95./a> .a href="+code=mutex_unlock" class="sref">mutex_unlock./a>(&.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=valida e_lock" class="sref">valida e_lock./a>); 4 96./a> 4 97./a> .spa class="comment">/* avoid the potential race whereby the mutex_trylock() in this./spa 4 98./a>.spa class="comment"> * func > happens again between the clear_bit() and the./spa 4 99./a>.spa class="comment"> * mutex_unlock() */./spa 4100./a> if (.a href="+code=test_bit" class="sref">test_bit./a>(.a href="+code=AFS_VNODE_CB_BROKEN" class="sref">AFS_VNODE_CB_BROKEN./a>, &.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=flags" class="sref">flags./a>)) { 4101./a> .a href="+code=_debug" class="sref">_debug./a>(.spa class="string">"requeue"4102./a> .a href="+code=queue_work" class="sref">queue_work./a>(.a href="+code=afs_callback_upda e_worker" class="sref">afs_callback_upda e_worker./a>, &.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cb_broke _work" class="sref">cb_broke _work./a>); 4103./a> } 4104./a> .a href="+code=_leave" class="sref">_leave./a>(.spa class="string">""4105./a>} 4106./a> 4107./a>.spa class="comment">/*./spa 4108./a>.spa class="comment"> * actually break a callback./spa 4109./a>.spa class="comment"> */./spa 411 a>static void .a href="+code=afs_break_callback" class="sref">afs_break_callback./a>(struct .a href="+code=afs_server" class="sref">afs_server./a> *.a href="+code=server" class="sref">server./a>, 4111./a> struct .a href="+code=afs_vnode" class="sref">afs_vnode./a> *.a href="+code=vnode" class="sref">vnode./a>) 4112./a>{ 4113./a> .a href="+code=_enter" class="sref">_enter./a>(.spa class="string">""4114./a> 4115./a> .a href="+code=set_bit" class="sref">set_bit./a>(.a href="+code=AFS_VNODE_CB_BROKEN" class="sref">AFS_VNODE_CB_BROKEN./a>, &.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=flags" class="sref">flags./a>); 4116./a> 4117./a> if (.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cb_promised" class="sref">cb_promised./a>) { 4118./a> .a href="+code=spin_lock" class="sref">spin_lock./a>(&.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=lock" class="sref">lock./a>); 4119./a> 4120./a> .a href="+code=_debug" class="sref">_debug./a>(.spa class="string">"break callback"4121./a> 4122./a> .a href="+code=spin_lock" class="sref">spin_lock./a>(&.a href="+code=server" class="sref">server./a>->.a href="+code=cb_lock" class="sref">cb_lock./a>); 4123./a> if (.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cb_promised" class="sref">cb_promised./a>) { 4124./a> .a href="+code=rb_erase" class="sref">rb_erase./a>(&.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cb_promise" class="sref">cb_promise./a>, &.a href="+code=server" class="sref">server./a>->.a href="+code=cb_promises" class="sref">cb_promises./a>); 4125./a> .a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cb_promised" class="sref">cb_promised./a> = .a href="+code=false" class="sref">false./a>; 4126./a> } 4127./a> .a href="+code=spin_unlock" class="sref">spin_unlock./a>(&.a href="+code=server" class="sref">server./a>->.a href="+code=cb_lock" class="sref">cb_lock./a>); 4128./a> 4129./a> .a href="+code=queue_work" class="sref">queue_work./a>(.a href="+code=afs_callback_upda e_worker" class="sref">afs_callback_upda e_worker./a>, &.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cb_broke _work" class="sref">cb_broke _work./a>); 4130./a> if (.a href="+code=list_empty" class="sref">list_empty./a>(&.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=granted_locks" class="sref">granted_locks./a>) && 4131./a> !.a href="+code=list_empty" class="sref">list_empty./a>(&.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=pending_locks" class="sref">pending_locks./a>)) 4132./a> .a href="+code=afs_lock_may_be_available" class="sref">afs_lock_may_be_available./a>(.a href="+code=vnode" class="sref">vnode./a>); 4133./a> .a href="+code=spin_unlock" class="sref">spin_unlock./a>(&.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=lock" class="sref">lock./a>); 4134./a> } 4135./a>} 4136./a> 4137./a>.spa class="comment">/*./spa 4138./a>.spa class="comment"> * allow the fileserver to explicitly break one callback./spa 4139./a>.spa class="comment"> * - happens whe ./spa 414 a>.spa class="comment"> * - the backing file is changed./spa 4141./a>.spa class="comment"> * - a lock is released./spa 4142./a>.spa class="comment"> */./spa 4143./a>static void .a href="+code=afs_break_one_callback" class="sref">afs_break_one_callback./a>(struct .a href="+code=afs_server" class="sref">afs_server./a> *.a href="+code=server" class="sref">server./a>, 4144./a> struct .a href="+code=afs_fid" class="sref">afs_fid./a> *.a href="+code=fid" class="sref">fid./a>) 4145./a>{ 4146./a> struct .a href="+code=afs_vnode" class="sref">afs_vnode./a> *.a href="+code=vnode" class="sref">vnode./a>; 4147./a> struct .a href="+code=rb_node" class="sref">rb_node./a> *.a href="+code=p" class="sref">p./a>; 4148./a> 4149./a> .a href="+code=_debug" class="sref">_debug./a>(.spa class="string">"find"4150./a> .a href="+code=spin_lock" class="sref">spin_lock./a>(&.a href="+code=server" class="sref">server./a>->.a href="+code=fs_lock" class="sref">fs_lock./a>); 4151./a> .a href="+code=p" class="sref">p./a> = .a href="+code=server" class="sref">server./a>->.a href="+code=fs_vnodes" class="sref">fs_vnodes./a>..a href="+code=rb_node" class="sref">rb_node./a>; 4152./a> while (.a href="+code=p" class="sref">p./a>) { 4153./a> .a href="+code=vnode" class="sref">vnode./a> = .a href="+code=rb_entry" class="sref">rb_entry./a>(.a href="+code=p" class="sref">p./a>, struct .a href="+code=afs_vnode" class="sref">afs_vnode./a>, .a href="+code=server_rb" class="sref">server_rb./a>); 4154./a> if (.a href="+code=fid" class="sref">fid./a>->.a href="+code=vid" class="sref">vid./a> < .a href="+code=vnode" class="sref">vnode./a>->.a href="+code=fid" class="sref">fid./a>..a href="+code=vid" class="sref">vid./a>) 4155./a> .a href="+code=p" class="sref">p./a> = .a href="+code=p" class="sref">p./a>->.a href="+code=rb_left" class="sref">rb_left./a>; 4156./a> else if (.a href="+code=fid" class="sref">fid./a>->.a href="+code=vid" class="sref">vid./a> > .a href="+code=vnode" class="sref">vnode./a>->.a href="+code=fid" class="sref">fid./a>..a href="+code=vid" class="sref">vid./a>) 4157./a> .a href="+code=p" class="sref">p./a> = .a href="+code=p" class="sref">p./a>->.a href="+code=rb_right" class="sref">rb_right./a>; 4158./a> else if (.a href="+code=fid" class="sref">fid./a>->.a href="+code=vnode" class="sref">vnode./a> < .a href="+code=vnode" class="sref">vnode./a>->.a href="+code=fid" class="sref">fid./a>..a href="+code=vnode" class="sref">vnode./a>) 4159./a> .a href="+code=p" class="sref">p./a> = .a href="+code=p" class="sref">p./a>->.a href="+code=rb_left" class="sref">rb_left./a>; 4160./a> else if (.a href="+code=fid" class="sref">fid./a>->.a href="+code=vnode" class="sref">vnode./a> > .a href="+code=vnode" class="sref">vnode./a>->.a href="+code=fid" class="sref">fid./a>..a href="+code=vnode" class="sref">vnode./a>) 4161./a> .a href="+code=p" class="sref">p./a> = .a href="+code=p" class="sref">p./a>->.a href="+code=rb_right" class="sref">rb_right./a>; 4162./a> else if (.a href="+code=fid" class="sref">fid./a>->.a href="+code=unique" class="sref">unique./a> < .a href="+code=vnode" class="sref">vnode./a>->.a href="+code=fid" class="sref">fid./a>..a href="+code=unique" class="sref">unique./a>) 4163./a> .a href="+code=p" class="sref">p./a> = .a href="+code=p" class="sref">p./a>->.a href="+code=rb_left" class="sref">rb_left./a>; 4164./a> else if (.a href="+code=fid" class="sref">fid./a>->.a href="+code=unique" class="sref">unique./a> > .a href="+code=vnode" class="sref">vnode./a>->.a href="+code=fid" class="sref">fid./a>..a href="+code=unique" class="sref">unique./a>) 4165./a> .a href="+code=p" class="sref">p./a> = .a href="+code=p" class="sref">p./a>->.a href="+code=rb_right" class="sref">rb_right./a>; 4166./a> else 4167./a> goto .a href="+code=found" class="sref">found./a>; 4168./a> } 4169./a> 4170./a> .spa class="comment">/* not found so we just ignore it (it may have moved to another./spa 4171./a>.spa class="comment"> * server) */./spa 4172./a>.a href="+code=not_available" class="sref">not_available./a>: 4173./a> .a href="+code=_debug" class="sref">_debug./a>(.spa class="string">"not avail"4174./a> .a href="+code=spin_unlock" class="sref">spin_unlock./a>(&.a href="+code=server" class="sref">server./a>->.a href="+code=fs_lock" class="sref">fs_lock./a>); 4175./a> .a href="+code=_leave" class="sref">_leave./a>(.spa class="string">""4176./a> return; 4177./a> 4178./a>.a href="+code=found" class="sref">found./a>: 4179./a> .a href="+code=_debug" class="sref">_debug./a>(.spa class="string">"found"4180./a> .a href="+code=ASSERTCMP" class="sref">ASSERTCMP./a>(.a href="+code=server" class="sref">server./a>, ==, .a href="+code=vnode" class="sref">vnode./a>->.a href="+code=server" class="sref">server./a>); 4 181./a> mutigra server./a>a href="+cTO_I href="+code=ser href="+cTO_Iss="sref">server./a>4 813./a> 1 1oto .a href="+code=outs="sref">found./a>; _available./a>: 414./a> spin_unlock./a>(&.a href="+code=server" class="sref">server./a>->.a href="+code=fs_lock" class="sref">fs_lock./a>); 4 815./a> if 1(.a h18c#L16" id4 816./a> 1 18n_unlock" class="sref">spin_">afs_break_callback./a>(struct .a href="+code=afs_serveref">server./a>, ==, .a href="+code=vnode" classref">server./a>417./a> _leave./a>ipef="fs/afs/callbaipef" class="sref">server./a>gt;.a href="+code=vfs_inode" class="sref">vfs_inode./a>..a href="+code=i_mode" class="675" id4 18../a>#include <_enter./a>(.spa class="string">""4 819./a>.spa class="commen1t"> 1 69" id4 910./a> if 1(.a h19c#L31" id4 911./a> 1 19atic void afs_callback_upda ck.c#L138" id4 912./a> } 4 813./a> 4 914./a>.a href="+code=out"1 clas1="srefallback" class="sref">afs_break_callba_status./a>(.a href=s_break_callba_;&quor" class="sref">afs_server./a> *.a href="+code=server" class="sref">server./a>, spin_uize_href="+code=AFS_Vize_hass="ss="sref">spin_c/afhref="+code=AFS_c/afhc#L142" id4 815./a> .a href="+c1ode=m19 href="+code=p" class="sref">e" class="sref">afs_vnode./k_callback./a>(struct .a hrode=afs_serv"ss="sref">spin_c_callba_status./a>(.a hk_callba_;&qu[]32" id4 916./a> 4 917./a> .spa class1="com19ave" class="sref">_leave./a>(.spa class="string">""server./a>); cb_/afhref="+code=AFS_c/afhc#L1176" id4 918./a>.spa class="commen1t"> 19c#L149" id4 919./a>.spa class="commen1t"> 19bug" class="sref">_debug./a>rver" href="+code=server" serveref">server./a>, ==, .a href="+code=vnode" cla !">p./a>->.a hrt; 0) 4 20../a>#include <ASSERTCMP./a>(.a href="+code=server" class="sref">server./a>c/afhref="+code=AFS_c/afhc#L14ss="s"sref">vnode./a>-&r hCBMAX href="+code=ser hCBMAXallba0" id4 2101./a> .a2href=20c#Lnc"4202./a> .a2href=2+code=queue_wofor (sref">vnode./a>-&c/afhref="+code=AFS_c/afhc#L1ss="sr0sref">vnode./a>-&c_callba_status./a>(.a hk_callba_;&qu++" class="sref">cb_/afhref="+code=AFS_c/afhc#L1--L153" id4203./a> } vnode./a> =(.spa class="string">"found"4204./a> .a href="+2ode=_20a href="+code=fid" class="sref">vnode./a> =c_callba_status./a>(.a hk_callba_;&qu"sref">fid./a>..a href="+code=vid" class="sref">vid./a>, .a href="+code=vnode" class="s" id420./a> .a href="+c2allba20 href="+code=p" class="sref"ef">vnode./a> =c_callba_status./a>(.a hk_callba_;&qu"sref">fid./a>..a href="+code=vid" class="sref">vid./a>, .a hra href="+code=NULL" class="sr" id420./a> vnode./a> =c_callba_status./a>(.a hk_callba_;&qu"sref">fid./a>..a href="+code=vid" class="sref">vid./a>, .a h) 420./a> .spa class2t">/*20to .a href="+code=found" claef">vnode./a> =c_callba_status./a>(.a hk_callba_;&qu"sref">fid./a>..a hr contenef="+code=NULL" contenc#L1r" id420./a>.spa class="commen2t"> *20a href="+code=fid" clnd" claef">vnode./a> =c_callba_status./a>(.a hk_callba_;&qu"sref">fid./a>..a hrexpia href="+code=p" expia c#L1r" id420./a>.spa class="commen2t"> *20 href="+code=p" class="sref"ef">vnode./a> =c_callba_status./a>(.a hk_callba_;&qu"sref">fid./a>..a hrtyphref="fs/afs/caltyph#Lnc"421 a>static void .a hre2="+co21 href="+code=afs_clear_permia0" id4211./a> 2 2 struct .a href="ck" class="sref">afs_breabreak_one_callback./a>(struct .a href="+code=afs_serveref">server./a>); server./a>c_callba_status./a>(.a hk_callba_;&qu"sref">fid./a>..a href="+code=vid" class="srea0" id4212./a>{ 4213./a> .a href="+2ode=_21c#L94" id4214./a> _leave./a>(.spa class="string">""4215./a> .a href="+2ode=s2t_bit" class="k.c#L177" id4216./a> 4217./a> if (.a hre2="+co21c#L178" id4218./a> .a2href=21llow the fileserver to expl ck.c#L138" id4219./a> 4220./a> .a2href=22 - the backing file is changed-h4221./a> 4222./a> .a2href=2+code=break_one_callback" class="srefdo_give_upak_one_callback./a>(struct .do_give_upak_one_ca;&quor" class="sref">afs_server./a> *.a href="+code=server" class="sref">server./a>, 4223./a> if2(.a h2ef="+code=vnode" classssssssssssssssssssss" class="sref">afs_vnode./a> *.a href="+code=vnode" class="sref">vnode./a>) 4224./a> 2 22.c#L65" id4225./a> 2 2a href="+code=" class="sref">afs_vnode./k_callback./a>(struct .a hrode=afs_serv"ref">vnode./a>) c 4226./a> } 2a hre22c#L137" id4227./a> .a2href=22ave" class="sref">_leave./a>(.spa class="string">""server./a>); cb4228./a> 4229./a> .a2href=22bug" class="sref">_debug./a>c server./a>->.a href="+code=cb_promises" class="sref">cb_promia hreserver./a>->.a href="+code=cb_promises" class="sref">cb_promia hre_hea = .a href="+code=fa hre_hea ises]75" id4230./a> if2(.a h23ERTCMP" class="sref">ASSERTCc fid./a>..a href="+code=vid" class="sresssssssss">p./a>->.a hrgt;.a href="+code=fid" class="sref">fid./a>..a href="+code=unique" class="75" id4231./a> 2 !.a 23class="sref">p./a> = .a hrefc fid./a>..a hr contenef="+code=NULL" contenc#L1sssss">p./a>->.a hrgt;.a href="+code=fid" class="sref">fid./a>..a hre=f contenef="+code=NULL"e=f contenss="75" id4232./a> 2 2a href="+code=p./a> = .a hrefc fid./a>..a hrexpia href="+code=p" expia c#L1ssssss">p./a>->.a hrgt;.a href="+code=fid" class="sref">fid./a>..a hre=fexpia href="+code=p" e=fexpia class="sref">fid./a>..a hre=fexpia "sref">fid./a>..a hre=fexpc .a href="+code=spin_unlock" class="s22f="+cp./a>->.a hrgt;.a href="+code=fid" .a href="+code1 fid./a>..a p.a p.a p.a p.a p.a p.a p0d./a>..a t="+code=p./a> = .a hrefc 4230./a> if2(.a h23ERTCMP" class="sref">ASSERTCc fid./a>..a href="+code=vid" class="sresssssssss">p./a>->.a hrgt;.a href="+f="+code=vid"u 1 19atic voi ,expia "sref">fid./a>..a hre=fexpc .0902L_wmass="sref">vid./a2L_wma5" clref">_debug./a>c /*./s2a <23ef="+code=flags" class="sref"> h23ERTCMP" class="sref">ASSERTCc fid./a>..a href="+code=vid" classtruct .a href="+code=afs_vnode238" class2"line" nam 4138.2a>.sp23ack.c#L1r" id4212./a>{ fid./a>..a href="+code=vid" class+ 1ss="sreruct .a href="+code=afs_vnode23ver./a>);xplicitly break one call2ack./23<8L104">420./a>.spa 1 RRAY_SIZE .a2href=2+coRRAY_SIZE20" class="line" nam 4212./a>{ 4230./a> )oL11ref">_debug./a>c * -23"+code=cb_promises" class="sref">cb - the b2cking file is changed./s2a <23">server./a>-& * server) */./spa def"lin2" i8" id * - a lock is rel2ased.2spa afs_servent"> */.2spa NULL./a>tomic_inc_ idcb_promia hre_hea = .a href="+code=fa hre_hea ises]75" idafs_break2one_c24./a>..a hre=fcase 1 ...02">4202./a> .a2href=2+code=queue_wooL11s/callback.c#L180" id *.a 2ref="+code=server" class2"sref24 hre}callback.c#L51" iddelayedbroke _work" class="sref">delayedbroke20" class="line" nam4227/callback.c#L130" id4130./a/callback.c#L180" id4145./a>{ cb_promia hre_hea = .a href="+code=fa hre_hea ises]75" id4229./a> HZhref="+code=vnoHZ./a> 2ref">_debug./a>c 2node.24ass="sr" id_debug./a>c strucase 2">4202./a> .a2href=2+code=queue_wos/callback.c#L180" id); nam 4148./a> 4212./a>{ _debug./a>c 420./a>.spa cl clinef">_debug./a>c 4150./a> 2 .a2href="+code=spdefaults/callback.c#L180" idfs_2ock./a>); _debug./a>c 2b_node./a>; 2node.2a> = .rver to expl ck.c#L138" id *.a 2 .a href="+code=afs_vnod2" cla25+code=p./a> = .a hrefc #include <ASSERTCMP./a>(.a href="ef">vnode./a>->.a href="+code=cb_promised" class="sref">cbfs/callback.c#L153" idserver./a>c/afhref="+code=AFS_c/afhc#L14ss="s"sref"ode./a>-&2t;.a href="+code=fid" cl2ss="s25f">fid./a>..a hre=fexpc .09a>->.a href="+code=cb_promises" class="sref">cb_promises./a>); 4125./a> .a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cb_promised" class="sref">cb"+code=AFS_c/afhc#L14ss="s"sref"o href="+2ref="fs/afs/callback.c#L256" i25ef="+code=flags" class="srefnam 4126./a> } 4127./a> .a href="+code=spin_unlock" class="sr2f">vnode.2a>->.a href="+code=fi2" cla25allback.c#L1675" id4216./a> ; <2 href="fs/afs/callback.c2L158"2id->.a href="+cod2=fid"25"+code=cb_promises" class="sref">cb./a>; 4220./a> "sref">vn2de./a>->.a href="+cod2=fid"26eleased./spa ck.c#L172" id4220./a> ">..a hre2 href="fs/afs/callback.c2L162"26llback./a>(struct .do_give_upak_one_ca;&quor" class="sref">afs_servs="sref">2node./a>->.a href="+c2de=fi2" clas, 4225./a> 2 2a href="+code=" class="sref">afs_vnode./k_cal./a>; 2node./a>->.a href="+c2de=fi2" class="sref" if2(.a h2ef="+code=vnode" classssssssssssssssssssss" class="sref">afs_vnode./a> *.a href="+code=vnodesref">ASSERTCc fid./a>..a href="+code=vvnode./a> *.a href="+code=vnode.c#L113" id; <2 href="fs/afs/callback.c2L166"26">server./a>, ==, .a href="+code=v2class="sr2f">found./a>; 4228./a> d"fs/afs/c2llbac2.c#L129" idrb_erase./a>(&.a href="+code=vnode" class="sref">v.c#L113" id; <2 } 4120./a> .spa class2"comm2nt">/* not foudrb_erase./a>(&.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cb_2 have mov2d to another./spa vnode./a>->.a href="+cod177" id4216./a> 4171./a>.spa 2class27ck./a>(struct .a href id4ailable" 2lass="sref">not_availabl2./a>:27_node./a>; 2debug27> = .rver to expl ck.c#L138" id4174./a2 2 .a href="+code=spin_unlock"20../a>#include <ASSERTCMP./a>(.a href="+code=server" class="sref">server./a>c/afhref="+code=AFS_c/afhc#L14ss="s"sref"ss="sref"2fs_lock./a>); 4176./a> 2eturn2 4123./a> if (.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cb_promised" class="sref">cb_promised./a>) { 4178./a>.a href="+cod2=foun2" class="sref" .a href="+code=rb_erase" class="sref">rb_erase./a>(&.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cb_2c#L179" i2#include <ASSERTCMP./a>(.a href="ef">vnode./a>->.a href="+code=cb_promised" class="sref">cbfs/callback.c#L153" idserver./a>c/afhref="+code=AFS_c/afhc#L14ss=ode=cb_2cL170">412="sref">_debug./a>(.spa 2class27ck.c#L119" id->.a href="+code=cb_promises" class="sref">cb_promises./a>); 4125./a> .a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cb_promised" class="sref">cb"+code=AFS_c/afhc#L14ss=ode=cb_2chave mov2 nam 4180./a> 2 .27s="sref">vnode./a>->.a href="+codnam 4126./a> } 4127./a> .a href="+code=spin_unlock" class="sr2vnode./a>2>.a href="+code=serve2" cla2s="sref">serveerver to expl ck.c#L138" idserver./a>a2href=28d./a>..a hre=f contenef="+coss="line" nam 4128./a> 4129./a> .a href="+code=queue_work" class="sref">queue_work./a>2s="sref">2erver./a>4216./a> 414./a2 ); (s2ruct .a href="+code=afs_2erver2f">sered-h4220./a> ode" clas2ref">server./a>4220./a> o#L179" i2.a href="+code=i_mode" c2ass="28a 41bed4 819./a>.spa cla2s="co28appens whe ./spa afs_serv11./a> 2 1 19a2ic vo2d afs_, 4223./a> if2(.a h2ef="+codeL65" class="line" nam <24225./a> 2 2a href="+code=" class="sref">afs_vnode./k_cal38" class2"line" nam oL92">4 912./2> 2 } ->.a href="+code=cb_2Howells &2t;dhowtly break one call2ack./29d./a>..a hre=s if2(.a h2ef="+code=vnode" classssssssssssssssssssss" class="sref">afs_vnode./a> *.a href="+code=vnodesref">ASSERTCc fid./a>..a href="+code=vvnode./a> *.a href="+code=vnode.c#L113" id <2 href="fs/afs/ca1llbac192pa 29> = .rver to expl ck.c#L138" idafs_break_callba_sta2us./a29 .a href="+code=spin_unlock"DECLARE_WAITQUEUE .a2href=2+cDECLARE_WAITQUEUE=.a h20ERTCMP" classmyself .a2href=2+cmyself9">4229./a> curreot;found"queue_work./a>2="+code=s2rver" class="sref">serve2./a>,29DE_CB_BROKEN./a>, &.a href="+c2atus./a>(2a hk_callba_;&qu[]32" id2oL132294228./a> d"fs/afs/c2llbac2.c#L129" idrb_erase./a>(&.a href="+code=vnode" class="sref">v.c#L113" id&qu2t;"seserver./a2); cb_/afhref="+coline" nam <24204./a> .a href="+2ode=_20a hrGIVE UP Iound href="fs/afs/c2llbact;_enter./a>(.spa class="string">""server./a>, ==2 .a h2ef="+code=vnode" cla !">p./a>->.2 hrt; 0) 2a href="fs/afs/callba0" 2drb_erase./a>(&.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cb_3>vnode./a3-&r hCBMAX href="+code=s3r hCB30ck./a>(struct .a hreft;.a href="+cod177" id4216./a> vn3de./a30./a>c_callba_status./ id3&qu++" cl3ss="sref">cb_/afhref="+c3de=AF3_c/afhc#L1--L1erver to expl ck.c#L138" idvid3/a>, .a href="+code=vnod3" cla30f">fid./a>..a hre=fexpc .0920../a>#include <ASSERTCMP./a>(.a href="+code=server" class="sref">server./a>c/afhref="+code=AFS_c/afhc#L14ss="s"sref3sref">vid3/a>, .a hra href="+code=3ULL" 30">server./a>, ==, .a href="+code=v3sref">vid3/a>, .a h) 4123./a> if (.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cb_promised" class="sref">cb_promised./a>) { 420./ .a href="+code=rb_erase" class="sref">rb_erase./a>(&.a href="+code=vnode" class="sref">s="sref">vn/a>(.a hk_callba_;&qu"sre> ASSERTCMP./a>(.a href=") == 0vnode./a>->.a href="+code=cb_3>8ontenc#31erveref">server./a>, ==3am <239L104">420./a>.spa cla>(.a hk_callba_dd_wait_sref"class="line" namdd_wait_sref" if (.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cb clin_;aitqef="+code=vnode" c clin_;aitqa> myself .a2href=2+cmyself9">4mised./a>) { 421 a>static void 53" id;vnode./a>->.a href="+code=cb_3"ck" clas3="sref">afs_breabreak_on3_call3ack./a>(struct .a href="+codeags" class="sref">t_purreot_ver."class="line" na">t_purreot_ver."=.a h20ERTCMP" classTASK_UNINTERRUPTIBLE .a2href=2+cTASK_UNINTERRUPTIBLE9">4mised./a>) { rb_erase./a>(&.a href="+code=vnode" class="sref"> ||sed./a>) { ASSERTCMP./a>(.a href=") != 0vsed./a>) { 4224./a> clinef">_debug./a>c 4215./a> 3a hre31nam 4145./a>{ 4128./a> 4129./a> .a href="+code=queue_work" class="sref">queue_work./a>3nam <2<7L304">4217./a> if (3a hre3="+co21c#L178"145./a>{ queue_work./a>3nref">vid3 .a2href=21l3ow th31ack.c#L1r" id4123./a> if (.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cb_promised" class="sref">cb_promised./a>) { 4219.3a> vnode./a>->.a href="+code=cb clin_;aitqef="+code=vnode" c clin_;aitqa> myself .a2href=2+cmyself9">4mised./a>) { vnode./a>->.a href="+cod1_">t_purreot_ver."class="line" na1_">t_purreot_ver."=.a h20ERTCMP" classTASK_RUNNING .a2href=2+cTASK_RUNNING9">4mised./a>) { serveerver to expl ck.c#L138" idafs_ser3ef="fs/af3/callback.c#L112" idafs_ser3lback./a>3struct .a hrode=afs_serv3ref">32nam 4 .a href="+code=rb_erase" class="sref">rb_erase./a>(&.a href="+code=vnode" class="sref">va;&quor" class="sref">afs_ser3lam <2<7L3class="line" nam2{gs" class="sref_;&qck.c#L142" id4223./a> f (.a href="+code=vnode" class="sref">vnode./a229./a> .a2href=22bug" class="sref">_debug./a>c &quo3;"s3rver./a>)3 cb4128./a> 4129./a> .a href="+code=queue_work" class="sref">queue_work./a>3cbc#L1 =a3s="sref">server./a>->3a hre32en1t"> 1 69" id4 910./a> if 1(.a h19c#L31" id4 3_promia h3e33href="fs/afs callback.cc#L138" id43 hrgt;.a 3ref="+code=fid" class="s3ef">f33 href="fs/afs/callbacck.c#L172di"fstchsa def"l7edc113" up"line" namioperaf="f" id43 f="fs/af3 p.a p.a p.a p.a p0d./a>3.a t33.a href=s_break_callba_;&quor" class="sref">afs_server./a> *.a hre3d"u 1 3 19atic voi ,ex3ia "s33a href="fs/afs/callback.c#L14di"fstchL113">4223./a> n_uize_href="+code=Adi"fstchL113">4223./a> n if2(.a h2ef="+;.a _ _uize_href="+co;.a _ ss" class="sref">afs_;.a href="+code=vno;.a 9">4va;&quor" class="sref">afs_ser3137./a>.s3a class="comment">/*./s3a <33ef="+ode./a>->.a href="+code=cb_338" class3"line" nam 4138.3a>.sp33ack.c#L1r" ids if2(.a h2ef="+code=vnode" classssssssssssssssssssss" class="sref">afs_vnode./a> *.a href="+code=vnodesrde./a>->.a href="+code=cb_33ver./a>)3xplicitly break one call3ack./33<8L104">420./a>.spa >4129./a> ontaeakr_of .a2href=2+c ontaeakr_of f (.a href="+co;.a href="+code=vno;.a 9">4,ds if2(.a h2ef="+code=vnode" classssssssssssssssssssss" 229./a> css="lin_;.a href="+code=vnode" clin_;.a 9">4fs/callback.c#L1;.a href="+code=vno;.a 9">4v1" class="line" nam <1oL91">4 31bc#L1 =a3./a>.spa class="comment3> * -33"+code=cb_promises" class="sref">c3 - the b3cking file is changed./s3a <33href="+code=ASSERTCMP" class=/callback.c#L1675" id4228.c#L31" id4 3ass="comm3nt"> * - a lock is rel3ased.34 } */.3spa afs_break3one_c34 href="fs/afs/callbacck.c#L1oooooooo*f-/afssrefevk.c am ENOMEM 3" some nam "l7or,afs/callb53"getssratafshref="+code=out"1 clas1="srefallback3ef="fs/af3ref="+code=server" class3"sref34.a href=s_break_callba_;&quooooooooo*f 2h"d"line" nami_;&irely,="linL172ass="liwilloline us lr."line" nam href="+code=out"1 clas1="srefallback3e"u 1 3.c#L145" id4220./a> 3a href="+3ode=vnode" class="sref">3node.34">sered-hafs_server./a> *.a hre3a8" class3class="line" nam 4223./a> n_uize_href="+code=A"m2113">4223./a> n f (.a href="+code=vnode" class="sref">vnode./a22/afs/callback.c#L129de=Aasync23./a_uize_href="+code=Aasync23./a9">4v1" class="line" nam <1oL91">4 3.ver./a>)3 nam 4148./a> c3a - the b3nam 4150./a> 3 .a34changed-h4220./a> 3sref">fs_3ock./a>); vnode.="line" nam24220./a> 3snt"> */.3="+code=rb_node" class="3ref">35llback./a>(struct .do_give_upak_one_ca;&quor" class="sref">afs_ser3a href="+3ode=vnode" class="sref">3node.35 clas, afs_vnode./a> *.a href="+code=vnodeva;&quor" class="sref">afs_ser3a/a> *.a 3 .a href="+code=afs_vnod3" cla35oL164f="f- Flba{ vl"fs/af08x n= -&3t;.a href="+code=fid" cl3ss="s35f">fid./a>..a hre=fexpc .09mod_delayedbroke _work" class="mod_delayedbroke f (.a href="+coaoL127">4227/callback.c#L130" id4130./aaef">cb_promia hre_hea = .a href="+code=fa hre_hea ises]75" id4220v1" class="line" nam <1oL91">4 3o href="+3ref="fs/afs/callback.c#L356" i35ef="+erver to expl ck.c#L138" idvnode.3a>->.a href="+code=fi3" cla35/code=,/codeperver" class="sref">s3ht./a>; <3 href="fs/afs/callback.c3L158"3ids3hbc#L1 =a3de./a>->.a href="+cod3=fid"35hrerefk.c#L138" id4220./a> 3./a>; 4220./a> 3"sref">vn3de./a>->.a href="+cod3=fid"36eleased./spa ck.c#L172" idafs_ser3">..a hre3 href="fs/afs/callback.c3L162"36llbacver./a>, afs_;.a href="+code=vno;.a 9">4va;&quor" class="sref">afs_ser3s="sref">3node./a>->.a href="+c3de=fi3" clasf="f- Flba{ vl"fs/af08x n= ; afs_vnode./a> *.a href="+code=vnode1" class="line" nam <1oL91">4 3s="sref">3node./a>->.a href="+c3de=fi3" class="sref" if2(.a h2ef="+codeL65" class="line" nam <24225./a> 2 2a href="+code=,225./a> x 2 2a hrexf="+code=1" class="line" nam <1oL91">4 3s href="+3 href="fs/afs/callback.c3L166"36e" clastimassa hrefs/callback.c#Lnow="sref">e" clasnowode=1" class="line" nam <1oL91">4 3s">vnode.3f">found./a>; 4 18../a>#itimaooLode=1" class="line" nam <1oL91">4 3st./a>; <3 } 420./ n if2(.a h2ef="+reL18">4 18../a>#ireLode=1" class="line" nam <1oL91">4 3sbc#L1 =a30./a> .spa class3"comm36"+code=cb_promises" class="sref">c3 have mov3d to another./spa *.a href="+code=vnodesref">ASSERTCc 4,ds if2(.a h2ef="+code=vnode" classssssssssssssssssssss" 229./a> am 4 3s="line" 3am 4171./a>.spa 3class37 } not_availabl3./a>:37d./a>..a hre=f contenef="+co=/callback.c#L1675" id4228.c#L31" id4 3 href="+c3de=_debug" class="sref">3debug37> = .rver to expl ck.c#L138" id4174./a3 3 .a href="+code=spin_unlock"now="sref">e" clasnowode=sref">ASSERTCc queue_work./a>3ss="sref"3fs_lock./a>); 4176./a> 3eturn3 afs_ser3 nam 4178./a>.a href="+cod3=foun37allback.c#L1675" id4123./a> if (.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cb_promised" class="sref">cb_promised./a>) { ->.a href="+code=cb_3cL170">413="sref">_debug./a>(.spa 3class37ck.c#L119" id#include <vnode./a>->.a href="+code=cbef="+code=cb_promised" class="sref">cb"vnode./a>->.a href="+code=cb_3chave mov3 nam 4180./a> 3 .37s="sref">vnode./a>-&gck.c#L1675" id4128./a> 4129./a> .a href="+code=queue_work" class="sref">queue_work./a>3vnode./a>3>.a href="+code=serve3" cla38ck./a>(struct .a href="+codeags" class="sref177" id4216./a> server./a>a3href=38./a>c_callba_status./s="line" id3s="sref">3erver./a>414./a3 ); 4145./a>{5./a> 2 2a href="+code=sref">ASSERTCc vnode./a>->.a href="+code=cbef="+code=cb_promised" class="sref">cb"a/callback.c#L180" id(s3ruct .a href="+code=afs_3erver38"+co21c#L178"145./a>{ 4229./a> css class="line" nam 4125./a> 2.c#L113" idserver./a>fid./a>..a href if (.a href="+coa href="+code=rb_erase" class="sref">rb_erase./a>usagef="+code=rb_erausagea> 2 } afs_ser3o#L179" i3.a href="+code=i_mode" c3ass="38<8L104">420./a>.spa class=" clinef">_debug./a>c 4 819./a>.spa cla3s="co38ck.c#L119" id->.a href="+code=cb_promises" class="sref">cb_promises./a>); 4125./a> .a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cb_promised" class="sref">cb"+code=AFS_c/afhc#L14ss=ode=cb_311./a> 3 1 19a3ic vo38s="sref">vnode./a>->.a href="+codnam 4126./a> } 4127./a> .a href="+code=spin_unlock" class="sr338" class3"line" nam oL92">4 912./3> 39="sref">serveerver to expl ck.c#L138" id(.a hk_callba_3813./a> <3 href="fs/afs/ca1llbac193pa 39./a>..a hre=fexpia href="+cotimaooL18">4 18../a>#itimaooLode=sref">ASSERTCc fid./a>..a href="+code=vam 4 18../a>#iam e" clasnowode=1" class="line" nam <1oL91">4 3 class="s3ef">afs_break_callba_sta3us./a39 .a href="+co .timaooL18">4 18../a>#itimaooLode=s } ->.a href="+code=cb_3="+code=s3rver" class="sref">serve3./a>,39nam 4145./a>{5./a> sref">delayedbroke _work" class="sref">delayedbroke20" class="line" nam/callback.c#L130" id/callback.c#L1a> de./a>->.a href="+code=cb_3=ck./a>(s3a hk_callba_;&qu[]32" id3oL13239"+co21c#L178"145./a>{ cb_promia hre_helassref">/callba30" id/callba5">4229./a> timaooL18">4 18../a>#itimaooLode=s*29./a> HZhref="+code=vnoHZ./a>"+code=AFS_c/afhc#L14ss=ode=cb_3ring">&qu3t;"4128./a> 4129./a> .a href="+code=queue_work" class="sref">queue_work./a>3server./a3); 420./a>.spa >4129./a> 177" id4216./a> server./a>, ==3 .a h39ck.c#L119" id3 hrt; 0) 3a href="fs/afs/callba0" 3dvnode./a4-&r hCBMAX href="+code=s4r hCB40 } vn4de./a40d./a>..a hre=f contenef="+colist>del_iniL18">4 18../a>#ilist>del_iniL if (.a href="+coa href="+code=rb_erase" class="sref">rb_erase./a>uallba30" id42.c#L113" idcb_/afhref="+c4de=AF40./a>..a hre=fexpia href="+co..a hrefrb_erase./a>usagef="+code=rb_erausagea> 2.c#L113" idafs_break_callba_sta4ret= 40 .a href="+code=spin_unlock"line"ine" nam 4128./a> 4129./a> .a href="+code=queue_work" class="sref">queue_work./a>4sref">vid4/a>, .a href="+code=vnod4" cla40DE_CB_BROKEN./a>, &.a href="+c4sref">vid4/a>, .a hra href="+code=4ULL" 40afs_ser4sref">vid4/a>, .a h) 4204./a> .a href="+2ode=_20a hram rb_erase./a>vldass="sref">vid./vldalassfs/callback.c#L1f="f="sref">e" clasn="fe_work" class="sref">queue_work./a>4s7ef">vid4/; cbfid./a>..a href="+code=vver."class="line" na"er."=.a sref">ASSERTCc 4 4>8ontenc#41erveref">server./a>, ==4am <240en1t"> 1 69" idrb_erase./a>ual_rej_cot;found"4 4>9ontenc#41 href="fs/afs/callba0" 4rb_erase./a>ual_busy_cot;found"4 4"ck" clas4="sref">afs_breabreak_on4_call41 } 4 18../a>#ireLode=sref">ASSERTCc /callbacrecor>fid./a>..a href/callbacrecor>20" class="line" namva_uize_href="+covla> vldass="sref">vid./vldalassrk" class="sref">queue_work./a>4rqu++" cl44./a> NULL./areL18">4 18../a>#ireLode=vnode./a>->.a href="+code=cb_4ref= 4215./a> 4a hre41nam 4145./a>{f">ASSERTCc /apply/callba30" id/apply/callba20" class="line" namva_uize_href="+covla> vldass="sref">vid./vldalassrk" class="sref">queue_work./a>4rref">vid404">4217./a> if (4a hre4="+co21c#L178"145./a>{bfid./a>..a href="+code=vver."class="line" na"er."=.a sref">ASSERTCc 4 4nref">vid4 .a2href=21l4ow th41ack.c#L1r" id_debug./a>c 4219.4a> ASSERTCc fid./a>..a href="+code=vver."class="line" na"er."=.a sref">ASSERTCc 4 4n9ontenc#4a2href=22 - the backing 4ile i41s="sref">vnode./a>-&g clinef">_debug./a>c servedefaults/callback.c#L180" idfid./a>..a href="+code=vver."class="line" na"er."=.a sref">ASSERTCc 4 4er./a> *.4 href="+code=server" cla4s="sr42./a>..a hre=fffffffff clinef">_debug./a>c 4struct .a hrode=afs_serv4ref">42DE_CB_BROKEN./a>, &.a href="+c4lam <2<7L4class="line" nam2afs_ser4ing">&quo4;"4204./a> .a href="+2ode=_20a hrreschedue=s/afs/c2llbac2.c#L113" id)4 cbfid./a>..a href="+code=vam 4 18../a>#iam ASSERTCc ASSERTCc /callbactimaooL18">4 18../a>#ilassref">/callbactimaooLode=1" class="line" nam <1oL91">4 4e8ontenc#4s="sref">server./a>->4a hre42"+code=cb_promises" class="sref">c4_promia h4e4123./a> if (.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cb_promised" class="sref">cb_promised./a>) { 43./a>c_callba_dempte if (.a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cbef="+code=cb_promised" class="sref">cb"vnode./a>->.a href="+code=cb_4 hrgt;.a 4ref="+code=fid" class="s4ef">f43./a>..a hre=ffffffffff * server) */./spa next2am 4.a t43.a href=s_break_callba_;&quooooooooooooooooo*ssrafssrefnewest recor> alrf">y sref"d sossratafs don't f=smss="line" nam24220./a> 4d"u 1 4 19atic voi ,ex4ia "s43nam 4220./a> 4137./a>.s4a class="comment">/*./s4a <43">sered-hafs_ser438" class4"line" nam 4138.4a>.sp43ack.c#L1r" idASSERTCc entde=fid" .a href=list>entde20" class="line" nam="sref">ASSERTCMP./a>(.a href="ef">vnode./a>->.a href="+code=cb_promised" class="sref">cbfs/callback.c#L1preve=cb_promised" preva> de./a>->.a href="+code=cb_43ver./a>)4xplicitly break one call4ack./43<8L104">420./a>.spa if2(.a h2ef="+codeL65" class="line" nam <24229./a> uallba30" id42.c#L113" id.spa class="comment4> * -43ck.c#L119" idfid./a>..a href="+code=vam 4 18../a>#iam ASSERTCc 4 18../a>#iam afs_ser4 - the b4cking file is changed./s4a <43s="sref">vnode./a>-&gck.c#L1675" idfid./a>..a href="+code=vam 4 18../a>#iam ASSERTCc 4 18../a>#iam * - a lock is rel4ased.44ck./a>(struct .a hreft;.a href="+codx 2 2a hrexf="+code=sref">ASSERTCc entde=fid" .a href=list>entde20" class="line" nam="sref">ASSERTCMP./a>(.a href="ef">vnode./a>->.a href="+code=cb_promised" class="sref">cbfs/callback.c#L1next="sref">e" clasnexta> de./a>->.a href="+code=cb_4ent"> */.4spa 4229./a> uallba30" id42.c#L113" idafs_break4one_c44./a>..a hre=ffffffffff./a> timaooL18">4 18../a>#itimaooLode=sref">ASSERTCc 4 18../a>#iam e" clasnowode=1" class="line" nam <1oL91">4 4ef="fs/af4ref="+code=server" class4"sref44s="line" nam2 .timaooL18">4 18../a>#itimaooLode=s l } afs_ser4e"u 1 4.c#L145" id4145./a>{ 4 18../a>#itimaooLode=sre01" class="line" nam <1oL91">4 4a href="+4ode=vnode" class="sref">4node.444 18../a>#itimaooLode=sref">ASSERTCc /callbactimaooL18">4 18../a>#ilassref">/callbactimaooLode=1" class="line" nam <1oL91">4 4.ver./a>)4 nam 4148./a> 420./erver to expl ck.c#L138" idc4a - the b4nam 4150./a> 4 .a44href="+code=ASSERTCMP" classlist>mdd_taia_uize_href="+colist>mdd_taia if (.a href="+coa href="+code=rb_erase" class="sref">rb_erase./a>uallba30" id4 .a href="+code=vnode" class="sref">vnode./a>->.a href="+code=cb_promised" class="sref">cb"+code=AFS_c/afhc#L14ss=ode=cb_4sref">fs_4ock./a>); */.4="+code=rb_node" class="4ref">45d./a>..a hre=f contenef="+co=line" nam <24204./a> .a href="+2ode=_20a hrtimaooLs hrefld"fs/afs/c2llbac2.c#L129" id4 18../a>#itimaooLode="+code=AFS_c/afhc#L14ss=ode=cb_4s_callbac4ode=vnode" class="sref">4node.45./a>..a hre=fexpia href="+cosref">delayedbroke _work" class="sref">delayedbroke20" class="line" nam/callback.c#L130" id/callback.c#L1a> de./a>->.a href="+code=cb_4a/a> *.a 4 .a href="+code=afs_vnod4" cla45s="line" nam24224./a> ef">cb_promia hre_helassref">/callba30" id/callba5">4229./a> timaooL18">4 18../a>#itimaooLode=s*29./a> HZhref="+code=vnoHZ./a>"+code=AFS_c/afhc#L14ss=ode=cb_4ode./a>-&4t;.a href="+code=fid" cl4ss="s45f">fid./a>..a hre=fexpc .09line"ine" nam 4128./a> 4129./a> .a href="+code=queue_work" class="sref">queue_work./a>4o href="+4ref="fs/afs/callback.c#L456" i45queue_work./a>4o8" class4a>->.a href="+code=fi4" cla45/codeerver to expl ck.c#L138" id; <4 href="fs/afs/callback.c4L158"4id->.a href="+cod4=fid"45"+code=cb_promises" class="sref">c4./a>; 4220./a> 4"sref">vn4de./a>->.a href="+cod4=fid"46eleased./spa ck.c#L172" id< iniLialise"srefallback.cam 4220./a> 4">..a hre4 href="fs/afs/callback.c4L162"46llback./a>(struct .do_give_upak_one_ca;&quor" class="sref">afs_ser4s="sref">4node./a>->.a href="+c4de=fi4" clas n if2(.a h2ef="+__iniL18">4 18../a>#i__iniL href="fs/afs/callba="line" nam 4 18../a>#illba="line" nam afs_ser4./a>; 4node./a>->.a href="+c4de=fi46f">fid./a>..a hre=fexpc .09llba="line" nam 4130./srde./a>->.a href="+code=cb_4s href="+4 href="fs/afs/callback.c4L166"46"+co21c#L178"145./a>{b130">sref"class="line" nacre130">sref"a> .a href="+2ode=_20a hrklass="line" ds/afs/c2llbac2.c#L113" idvnode.4f">found./a>; 4130./s? 0 : -f">ASSERTCc 4 4st./a>; <4 } .spa class4"comm46"+code=cb_promises" class="sref">c4 have mov4d to another./spa 4220./a> 4s="line" 4am 4171./a>.spa 4class47eleased./spa ck.c#L172" id< shoLsdown"srefallback.cam 4220./a> 4ailable" 4lass="sref">not_availabl4./a>:47llback./a>(struct .do_give_upak_one_ca;&quor" class="sref">afs_ser4 href="+c4de=_debug" class="sref">4debug47 clas, afs_ser4" class="4ine" nam 4174./a4 47oL164f="f- Flba{ vl"fs/af08x n= ); fid./a>..a hre=fexpc .09de"+2oy130">sref"class="line" nade"+2oy130">sref"20" class="line" nam4130./2.c#L113" id4176./a> 4eturn47ef="+erver to expl ck.c#L138" id4178./a>.a href="+cod4=foun47allba
fooallb> T172original LXR software by"srefver to exhttp://source53"ge.net/projects/lxlb>LXR .do_uniLy5">422this experi_gival nasion by"ver to exmailto:lxl@.a ux.no">lxl@.a ux.no">cbf subfooallb> lxl..a ux.no kindly hosted by"ver to exhttp://www.redpi/a-.a pro.no">Redpi/a La pro AS5">422providernam La ux .dnsultd