Frank's comments are incorporated:

1) Only changes in the comments, bo change in the C code:

http://cr.opensolaris.org/~pavelf/6500269    

2) - mainly changes in the comments; only a small "int -> uint_t" change 
in the C code
    - 1  change in the comments for 6507213

http://cr.opensolaris.org/~pavelf/6707722

3) no changes

http://cr.opensolaris.org/~pavelf/6721281


--Pavel



On 06/09/09 16:40, Frank Batschulat (Home) wrote:
> On Tue, 09 Jun 2009 11:12:22 +0200, pavel filipensky <Pavel.Filipensky at 
> sun.com> wrote:
>
>   
>> I have created separated webrevs for the bugs - to make the review more
>> comfortable and allow the reviewers to review only a subset of the 3 CRs:
>>     
>
> Hi Pavel, first of all, if you expect outside reviewers you probably should 
> put the lot of analyse done in the bugs comments/evaluation section
> to either the bugs description so it appears on bugs.opensolaris.org, or even
> better, store a text file containing them at cr.opensolaris.org along
> with the webrevs, for those 3 bugs below, it would have been really helpfull
> for outside observers to better understand how you arrived here...
>
> 6500269 assertion failed: sp->mntinfo4_list == mi, file: 
> ../../common/fs/nfs/nfs4_vfsops.c, line: 3258
>   
>> http://cr.opensolaris.org/~pavelf/6500269     <<< I have added some
>>     
>
> overall looks good, comments:
>
> http://cr.opensolaris.org/~pavelf/6500269/usr/src/uts/common/nfs/nfs4_clnt.h.udiff.html
>
> 1)
>   *      The mntinfo4_t::mi_recovlock protects the following fields:
>   *              mi_srvsettime
>   *
> + * The mntinfo4_t::mi_recovlock protects also mi_srv.
>
> I'd prefer this to be instead:
>
>   *      The mntinfo4_t::mi_recovlock protects the following fields:
> ! *              mi_srvsettime, mi_srv
>
> 2)
> + * If changing mi_srv from one  server to different server, mi_recovlock
> + * as RW_WRITER is needed - happens in recov_newserver() and 
> recov_clientid().
> + * If mi_srv is set for the first time - happens in nfs4_mount()
> + * and nfs4_mountroot(), mi_recovlock is held as RW_READER.
> + * This means that holding mi_recovlock as RW_READER is enough to protect
> + * mi_srv from being changed from one server to another.
>
> this is a bit confusing...I'd prefer this to be changes like below, the 
> functions may change
> over time...and the latter part is redundant
>
> * Changing mi_srv from one nfs4_server_t to a different one requires 
> * holding the mi_recovlock as RW_WRITER.
> * Exception: setting mi_srv the first time in mount/mounroot is done
> * holding the mi_recovlock as RW_READER.
>
> http://cr.opensolaris.org/~pavelf/6500269/usr/src/uts/common/fs/nfs/nfs4_vfsops.c.udiff.html
>
> 3) find_nfs4_server_all()
>
> 3809 find_nfs4_server_all(mntinfo4_t *mi, int all)
> 3810 {
> 3811         nfs4_server_t *np = mi->mi_srv;
> 3812 
> 3813         ASSERT(nfs_rw_lock_held(&mi->mi_recovlock, RW_READER) ||
> 3814             nfs_rw_lock_held(&mi->mi_recovlock, RW_WRITER));
> 3815         
> 3816         if (np && (np->s_thread_exit != NFS4_THREAD_EXIT || all)) {
> 3817                 mutex_enter(&np->s_lock);
> 3818                 np->s_refcnt++;
> 3819                 return (np);
> 3820         }
> 3821         return (NULL);
> 3822 }
>
> now, that looks suspicious, you use the nfs4_server_t 'np' prior having a 
> lock on it, that is
> different from the old find_nfs4_server_all() impl. as well. since we're also
> no longer holding the nfs4_server_lst_lock I have doubts we're properly 
> protected here.
>
> Btw, not your changes but still worth mentioning it:
>
> 3809 find_nfs4_server_all(mntinfo4_t *mi, int all)
> 3810 {
> 3811         nfs4_server_t *np = mi->mi_srv;
> 3812 
> 3813         ASSERT(nfs_rw_lock_held(&mi->mi_recovlock, RW_READER) ||
> 3814             nfs_rw_lock_held(&mi->mi_recovlock, RW_WRITER));
>
> btw, this assert is not sufficient in the context of find_nfs4_server_all()
> it only assert that _someone_ is holding the lock:
>
>    4883 nfs_rw_lock_held(nfs_rwlock_t *l, krw_t rw)
>    4884 {
>    4885 
>    4886       if (rw == RW_READER)
>    4887               return (l->count > 0);
>    4888       ASSERT(rw == RW_WRITER);
>    4889       return (l->count < 0);
>    4890 }
>    
> in the context of find_nfs4_server_all()/find_nfs4_server() we
> really want to know that the _current caller_ is holding the lock as
> called out in the comment:
>
>    3791  * The caller should be holding mi->mi_recovlock, and it should 
> continue to
>    3792  * hold the lock until done with the returned nfs4_server_t.  Once
>    3793  * mi->mi_recovlock is released, there is no guarantee that the 
> returned
>    3794  * mi->nfs4_server_t will continue to correspond to mi.
>    3795  */
>    3796 nfs4_server_t *
>    3797 find_nfs4_server(mntinfo4_t *mi)
>    
> =================================
>
> 6707722 nfs4_start_fop() uses gethrestime_sec() with 1 second granularity to 
> detect server change
>   
>> http://cr.opensolaris.org/~pavelf/6707722
>>     
>
> looks good, but comments:
>
> http://cr.opensolaris.org/~pavelf/6707722/usr/src/uts/common/fs/nfs/nfs4_recovery.c.udiff.html
>
> +        int droplock_cnt;
>
> I'd prefer this to be a uint_t.
>
> http://cr.opensolaris.org/~pavelf/6707722/usr/src/uts/common/nfs/nfs4_clnt.h.udiff.html
> +        int mi_srvset_cnt; /* increment whenever changing the nfs4_server_t 
> */
>
> I'd prefer mi_srvset_cnt to be a uint_t.
>
> =========================================
>
> 6721281 panic: assertion failed: np != 0L, file: 
> ../../common/fs/nfs/nfs4_callback.c, line: 1309
>   
>> http://cr.opensolaris.org/~pavelf/6721281
>>     
>
> this looks good to me.
>
> =========================================
>
> Btw, since you touch nfs4_clnt.h anyways would ya mind fixing this along with 
> it ?
>
> http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6507213
>
> cheers
> frankB
>   


Reply via email to