linux-nfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] nfsd4: set right access bmap when initializing lock stateid
@ 2011-03-28  7:15 Mi Jinlong
  2011-03-29  3:18 ` J. Bruce Fields
  0 siblings, 1 reply; 5+ messages in thread
From: Mi Jinlong @ 2011-03-28  7:15 UTC (permalink / raw)
  To: J. Bruce Fields; +Cc: NFS

 
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

------------[ cut here ]------------
kernel BUG at fs/nfsd/nfs4state.c:380!
invalid opcode: 0000 [#1] SMP
last sysfs file: /sys/kernel/mm/ksm/run
Modules linked in: nfs fscache md4 nls_utf8 cifs ip6table_filter ip6_tables ebtable_nat ebtables ipt_MASQUERADE iptable_nat nf_nat bridge stp llc nfsd lockd nfs_acl auth_rpcgss sunrpc ipv6 ppdev parport_pc parport pcnet32 mii pcspkr microcode i2c_piix4 BusLogic floppy [last unloaded: mperf]

Pid: 1468, comm: nfsd Not tainted 2.6.38+ #120 VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform
EIP: 0060:[<e24f180d>] EFLAGS: 00010297 CPU: 0
EIP is at nfs4_access_to_omode+0x1c/0x29 [nfsd]
EAX: ffffffff EBX: dd758120 ECX: 00000000 EDX: 00000004
ESI: dd758120 EDI: ddfe657c EBP: dd54dde0 ESP: dd54dde0
 DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
Process nfsd (pid: 1468, ti=dd54c000 task=ddc92580 task.ti=dd54c000)
Stack:
 dd54ddf0 e24f19ca 00000000 ddfe6560 dd54de08 e24f1a5d dd758130 deee3a20
 ddfe6560 31270000 dd54df1c e24f52fd 0000000f dd758090 e2505dd0 0be304cf
 dbb51d68 0000000e ddfe657c ddcd8020 dd758130 dd758128 dd7580d8 dd54de68
Call Trace:
 [<e24f19ca>] free_generic_stateid+0x1c/0x3e [nfsd]
 [<e24f1a5d>] release_lockowner+0x71/0x8a [nfsd]
 [<e24f52fd>] nfsd4_lock+0x617/0x66c [nfsd]
 [<e24e57b6>] ? nfsd_setuser+0x199/0x1bb [nfsd]
 [<e24e056c>] ? nfsd_setuser_and_check_port+0x65/0x81 [nfsd]
 [<c07a0052>] ? _cond_resched+0x8/0x1c
 [<c04ca61f>] ? slab_pre_alloc_hook.clone.33+0x23/0x27
 [<c04cac01>] ? kmem_cache_alloc+0x1a/0xd2
 [<c04835a0>] ? __call_rcu+0xd7/0xdd
 [<e24e0dfb>] ? fh_verify+0x401/0x452 [nfsd]
 [<e24f0b61>] ? nfsd4_encode_operation+0x52/0x117 [nfsd]
 [<e24ea0d7>] ? nfsd4_putfh+0x33/0x3b [nfsd]
 [<e24f4ce6>] ? nfsd4_delegreturn+0xd4/0xd4 [nfsd]
 [<e24ea2c9>] nfsd4_proc_compound+0x1ea/0x33e [nfsd]
 [<e24de6ee>] nfsd_dispatch+0xd1/0x1a5 [nfsd]
 [<e1d6e1c7>] svc_process_common+0x282/0x46f [sunrpc]
 [<e1d6e578>] svc_process+0xdc/0xfa [sunrpc]
 [<e24de0fa>] nfsd+0xd6/0x115 [nfsd]
 [<e24de024>] ? nfsd_shutdown+0x24/0x24 [nfsd]
 [<c0454322>] kthread+0x62/0x67
 [<c04542c0>] ? kthread_worker_fn+0x114/0x114
 [<c07a6ebe>] kernel_thread_helper+0x6/0x10
Code: eb 05 b8 00 00 27 4f 8d 65 f4 5b 5e 5f 5d c3 83 e0 03 55 83 f8 02 89 e5 74 17 83 f8 03 74 05 48 75 09 eb 09 b8 02 00 00 00 eb 0b <0f> 0b 31 c0 eb 05 b8 01 00 00 00 5d c3 55 89 e5 57 56 89 d6 8d
EIP: [<e24f180d>] nfs4_access_to_omode+0x1c/0x29 [nfsd] SS:ESP 0068:dd54dde0
---[ end trace 2b0bf6c6557cb284 ]---

The trace route is: 

 -> nfsd4_lock()
   -> if (lock->lk_is_new) {
     -> alloc_init_lock_stateid()

        3739: stp->st_access_bmap = 0;

   ->if (status && lock->lk_is_new && lock_sop)
     -> release_lockowner()
      -> free_generic_stateid()
       -> nfs4_access_bmap_to_omode()
          -> nfs4_access_to_omode()

        380: BUG();   *****

This problem was introduced by 0997b1.

Signed-off-by: Mi Jinlong <mijinlong@cn.fujitsu.com>
---
 fs/nfsd/nfs4state.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index fbde6f7..68a9dbc 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -3736,7 +3736,7 @@ alloc_init_lock_stateid(struct nfs4_stateowner *sop, struct nfs4_file *fp, struc
 	stp->st_stateid.si_stateownerid = sop->so_id;
 	stp->st_stateid.si_fileid = fp->fi_id;
 	stp->st_stateid.si_generation = 0;
-	stp->st_access_bmap = 0;
+	stp->st_access_bmap = open_stp->st_access_bmap;
 	stp->st_deny_bmap = open_stp->st_deny_bmap;
 	stp->st_openstp = open_stp;
 
-- 
1.7.4.1



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] nfsd4: set right access bmap when initializing lock stateid
  2011-03-28  7:15 [PATCH] nfsd4: set right access bmap when initializing lock stateid Mi Jinlong
@ 2011-03-29  3:18 ` J. Bruce Fields
  2011-03-29  3:41   ` Mi Jinlong
  0 siblings, 1 reply; 5+ messages in thread
From: J. Bruce Fields @ 2011-03-29  3:18 UTC (permalink / raw)
  To: Mi Jinlong; +Cc: NFS

On Mon, Mar 28, 2011 at 03:15:09PM +0800, Mi Jinlong wrote:
>  
> Content-Type: text/plain; charset=ISO-2022-JP
> Content-Transfer-Encoding: 7bit

Thanks, Mi Jinlong, the analysis is helpful, but I don't think your fix
is right.

I think the problem here is basically that the cleanup on exit from
nfsd4_lock() may have to deal with a lock stateid that is partially
initialized, in that everything has been setup except the stuff that's
done by get_lock_access().

Maybe something like this??  But I'm not able to test right now.

--b.

diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index fbde6f7..9e8ef31 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -397,10 +397,13 @@ static void unhash_generic_stateid(struct nfs4_stateid *stp)
 
 static void free_generic_stateid(struct nfs4_stateid *stp)
 {
-	int oflag = nfs4_access_bmap_to_omode(stp);
+	int oflag;
 
-	nfs4_file_put_access(stp->st_file, oflag);
-	put_nfs4_file(stp->st_file);
+	if (stp->st_access_bmap) {
+		nfs4_access_bmap_to_omode(stp);
+		nfs4_file_put_access(stp->st_file, oflag);
+		put_nfs4_file(stp->st_file);
+	}
 	kmem_cache_free(stateid_slab, stp);
 }
 

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] nfsd4: set right access bmap when initializing lock stateid
  2011-03-29  3:18 ` J. Bruce Fields
@ 2011-03-29  3:41   ` Mi Jinlong
  2011-04-10 16:20     ` J. Bruce Fields
  0 siblings, 1 reply; 5+ messages in thread
From: Mi Jinlong @ 2011-03-29  3:41 UTC (permalink / raw)
  To: J. Bruce Fields; +Cc: NFS



J. Bruce Fields:
> On Mon, Mar 28, 2011 at 03:15:09PM +0800, Mi Jinlong wrote:
>>  
>> Content-Type: text/plain; charset=ISO-2022-JP
>> Content-Transfer-Encoding: 7bit
> 
> Thanks, Mi Jinlong, the analysis is helpful, but I don't think your fix
> is right.
> 
> I think the problem here is basically that the cleanup on exit from
> nfsd4_lock() may have to deal with a lock stateid that is partially
> initialized, in that everything has been setup except the stuff that's
> done by get_lock_access().

  You are right.

> 
> Maybe something like this??  But I'm not able to test right now.
> 
> --b.
> 
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index fbde6f7..9e8ef31 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -397,10 +397,13 @@ static void unhash_generic_stateid(struct nfs4_stateid *stp)
>  
>  static void free_generic_stateid(struct nfs4_stateid *stp)
>  {
> -	int oflag = nfs4_access_bmap_to_omode(stp);
> +	int oflag;
>  
> -	nfs4_file_put_access(stp->st_file, oflag);
> -	put_nfs4_file(stp->st_file);
> +	if (stp->st_access_bmap) {
> +		nfs4_access_bmap_to_omode(stp);

 This line should be 

     oflag = nfs4_access_bmap_to_omode(stp);

 otherwise, uninitialized oflag will be used at the next line.

 After this patch, kernel runs correctly!

-- 
----
thanks
Mi Jinlong

> +		nfs4_file_put_access(stp->st_file, oflag);
> +		put_nfs4_file(stp->st_file);
> +	}
>  	kmem_cache_free(stateid_slab, stp);
>  }
>  
> 
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] nfsd4: set right access bmap when initializing lock stateid
  2011-03-29  3:41   ` Mi Jinlong
@ 2011-04-10 16:20     ` J. Bruce Fields
  2011-04-11  0:28       ` Mi Jinlong
  0 siblings, 1 reply; 5+ messages in thread
From: J. Bruce Fields @ 2011-04-10 16:20 UTC (permalink / raw)
  To: Mi Jinlong; +Cc: NFS

On Tue, Mar 29, 2011 at 11:41:39AM +0800, Mi Jinlong wrote:
> 
> 
> J. Bruce Fields:
> > On Mon, Mar 28, 2011 at 03:15:09PM +0800, Mi Jinlong wrote:
> >>  
> >> Content-Type: text/plain; charset=ISO-2022-JP
> >> Content-Transfer-Encoding: 7bit
> > 
> > Thanks, Mi Jinlong, the analysis is helpful, but I don't think your fix
> > is right.
> > 
> > I think the problem here is basically that the cleanup on exit from
> > nfsd4_lock() may have to deal with a lock stateid that is partially
> > initialized, in that everything has been setup except the stuff that's
> > done by get_lock_access().
> 
>   You are right.
> 
> > 
> > Maybe something like this??  But I'm not able to test right now.
> > 
> > --b.
> > 
> > diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> > index fbde6f7..9e8ef31 100644
> > --- a/fs/nfsd/nfs4state.c
> > +++ b/fs/nfsd/nfs4state.c
> > @@ -397,10 +397,13 @@ static void unhash_generic_stateid(struct nfs4_stateid *stp)
> >  
> >  static void free_generic_stateid(struct nfs4_stateid *stp)
> >  {
> > -	int oflag = nfs4_access_bmap_to_omode(stp);
> > +	int oflag;
> >  
> > -	nfs4_file_put_access(stp->st_file, oflag);
> > -	put_nfs4_file(stp->st_file);
> > +	if (stp->st_access_bmap) {
> > +		nfs4_access_bmap_to_omode(stp);
> 
>  This line should be 
> 
>      oflag = nfs4_access_bmap_to_omode(stp);
> 
>  otherwise, uninitialized oflag will be used at the next line.
> 
>  After this patch, kernel runs correctly!

So you tested something like this?--b.

commit f93a86b66b1778ce698051b4ebfc228abccce956
Author: J. Bruce Fields <bfields@redhat.com>
Date:   Mon Mar 28 15:15:09 2011 +0800

    nfsd4: fix oops on lock failure
    
    Lock stateid's can have access_bmap 0 if they were only partially
    initialized (due to a failed lock request); handle that case in
    free_generic_stateid.
    
    ------------[ cut here ]------------
    kernel BUG at fs/nfsd/nfs4state.c:380!
    invalid opcode: 0000 [#1] SMP
    last sysfs file: /sys/kernel/mm/ksm/run
    Modules linked in: nfs fscache md4 nls_utf8 cifs ip6table_filter ip6_tables ebtable_nat ebtables ipt_MASQUERADE iptable_nat nf_nat bridge stp llc nfsd lockd nfs_acl auth_rpcgss sunrpc ipv6 ppdev parport_pc parport pcnet32 mii pcspkr microcode i2c_piix4 BusLogic floppy [last unloaded: mperf]
    
    Pid: 1468, comm: nfsd Not tainted 2.6.38+ #120 VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform
    EIP: 0060:[<e24f180d>] EFLAGS: 00010297 CPU: 0
    EIP is at nfs4_access_to_omode+0x1c/0x29 [nfsd]
    EAX: ffffffff EBX: dd758120 ECX: 00000000 EDX: 00000004
    ESI: dd758120 EDI: ddfe657c EBP: dd54dde0 ESP: dd54dde0
     DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
    Process nfsd (pid: 1468, ti=dd54c000 task=ddc92580 task.ti=dd54c000)
    Stack:
     dd54ddf0 e24f19ca 00000000 ddfe6560 dd54de08 e24f1a5d dd758130 deee3a20
     ddfe6560 31270000 dd54df1c e24f52fd 0000000f dd758090 e2505dd0 0be304cf
     dbb51d68 0000000e ddfe657c ddcd8020 dd758130 dd758128 dd7580d8 dd54de68
    Call Trace:
     [<e24f19ca>] free_generic_stateid+0x1c/0x3e [nfsd]
     [<e24f1a5d>] release_lockowner+0x71/0x8a [nfsd]
     [<e24f52fd>] nfsd4_lock+0x617/0x66c [nfsd]
     [<e24e57b6>] ? nfsd_setuser+0x199/0x1bb [nfsd]
     [<e24e056c>] ? nfsd_setuser_and_check_port+0x65/0x81 [nfsd]
     [<c07a0052>] ? _cond_resched+0x8/0x1c
     [<c04ca61f>] ? slab_pre_alloc_hook.clone.33+0x23/0x27
     [<c04cac01>] ? kmem_cache_alloc+0x1a/0xd2
     [<c04835a0>] ? __call_rcu+0xd7/0xdd
     [<e24e0dfb>] ? fh_verify+0x401/0x452 [nfsd]
     [<e24f0b61>] ? nfsd4_encode_operation+0x52/0x117 [nfsd]
     [<e24ea0d7>] ? nfsd4_putfh+0x33/0x3b [nfsd]
     [<e24f4ce6>] ? nfsd4_delegreturn+0xd4/0xd4 [nfsd]
     [<e24ea2c9>] nfsd4_proc_compound+0x1ea/0x33e [nfsd]
     [<e24de6ee>] nfsd_dispatch+0xd1/0x1a5 [nfsd]
     [<e1d6e1c7>] svc_process_common+0x282/0x46f [sunrpc]
     [<e1d6e578>] svc_process+0xdc/0xfa [sunrpc]
     [<e24de0fa>] nfsd+0xd6/0x115 [nfsd]
     [<e24de024>] ? nfsd_shutdown+0x24/0x24 [nfsd]
     [<c0454322>] kthread+0x62/0x67
     [<c04542c0>] ? kthread_worker_fn+0x114/0x114
     [<c07a6ebe>] kernel_thread_helper+0x6/0x10
    Code: eb 05 b8 00 00 27 4f 8d 65 f4 5b 5e 5f 5d c3 83 e0 03 55 83 f8 02 89 e5 74 17 83 f8 03 74 05 48 75 09 eb 09 b8 02 00 00 00 eb 0b <0f> 0b 31 c0 eb 05 b8 01 00 00 00 5d c3 55 89 e5 57 56 89 d6 8d
    EIP: [<e24f180d>] nfs4_access_to_omode+0x1c/0x29 [nfsd] SS:ESP 0068:dd54dde0
    ---[ end trace 2b0bf6c6557cb284 ]---
    
    The trace route is:
    
     -> nfsd4_lock()
       -> if (lock->lk_is_new) {
         -> alloc_init_lock_stateid()
    
            3739: stp->st_access_bmap = 0;
    
       ->if (status && lock->lk_is_new && lock_sop)
         -> release_lockowner()
          -> free_generic_stateid()
           -> nfs4_access_bmap_to_omode()
              -> nfs4_access_to_omode()
    
            380: BUG();   *****
    
    This problem was introduced by 0997b173609b9229ece28941c118a2a9b278796e.
    
    Reported-by: Mi Jinlong <mijinlong@cn.fujitsu.com>
    Tested-by: Mi Jinlong <mijinlong@cn.fujitsu.com>
    Signed-off-by: J. Bruce Fields <bfields@redhat.com>

diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index fbde6f7..8e3c407 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -397,10 +397,13 @@ static void unhash_generic_stateid(struct nfs4_stateid *stp)
 
 static void free_generic_stateid(struct nfs4_stateid *stp)
 {
-	int oflag = nfs4_access_bmap_to_omode(stp);
+	int oflag;
 
-	nfs4_file_put_access(stp->st_file, oflag);
-	put_nfs4_file(stp->st_file);
+	if (stp->st_access_bmap) {
+		oflag = nfs4_access_bmap_to_omode(stp);
+		nfs4_file_put_access(stp->st_file, oflag);
+		put_nfs4_file(stp->st_file);
+	}
 	kmem_cache_free(stateid_slab, stp);
 }
 

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] nfsd4: set right access bmap when initializing lock stateid
  2011-04-10 16:20     ` J. Bruce Fields
@ 2011-04-11  0:28       ` Mi Jinlong
  0 siblings, 0 replies; 5+ messages in thread
From: Mi Jinlong @ 2011-04-11  0:28 UTC (permalink / raw)
  To: J. Bruce Fields; +Cc: NFS



J. Bruce Fields:
> On Tue, Mar 29, 2011 at 11:41:39AM +0800, Mi Jinlong wrote:
>>
>> J. Bruce Fields:
>>> On Mon, Mar 28, 2011 at 03:15:09PM +0800, Mi Jinlong wrote:
>>>>  
>>>> Content-Type: text/plain; charset=ISO-2022-JP
>>>> Content-Transfer-Encoding: 7bit
>>> Thanks, Mi Jinlong, the analysis is helpful, but I don't think your fix
>>> is right.
>>>
>>> I think the problem here is basically that the cleanup on exit from
>>> nfsd4_lock() may have to deal with a lock stateid that is partially
>>> initialized, in that everything has been setup except the stuff that's
>>> done by get_lock_access().
>>   You are right.
>>
>>> Maybe something like this??  But I'm not able to test right now.
>>>
>>> --b.
>>>
>>> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
>>> index fbde6f7..9e8ef31 100644
>>> --- a/fs/nfsd/nfs4state.c
>>> +++ b/fs/nfsd/nfs4state.c
>>> @@ -397,10 +397,13 @@ static void unhash_generic_stateid(struct nfs4_stateid *stp)
>>>  
>>>  static void free_generic_stateid(struct nfs4_stateid *stp)
>>>  {
>>> -	int oflag = nfs4_access_bmap_to_omode(stp);
>>> +	int oflag;
>>>  
>>> -	nfs4_file_put_access(stp->st_file, oflag);
>>> -	put_nfs4_file(stp->st_file);
>>> +	if (stp->st_access_bmap) {
>>> +		nfs4_access_bmap_to_omode(stp);
>>  This line should be 
>>
>>      oflag = nfs4_access_bmap_to_omode(stp);
>>
>>  otherwise, uninitialized oflag will be used at the next line.
>>
>>  After this patch, kernel runs correctly!
> 
> So you tested something like this?--b.

  Yes, I have test this patch again, that's OK.

-- 
----
thanks
Mi Jinlong

> 
> commit f93a86b66b1778ce698051b4ebfc228abccce956
> Author: J. Bruce Fields <bfields@redhat.com>
> Date:   Mon Mar 28 15:15:09 2011 +0800
> 
>     nfsd4: fix oops on lock failure
>     
>     Lock stateid's can have access_bmap 0 if they were only partially
>     initialized (due to a failed lock request); handle that case in
>     free_generic_stateid.
>     
>     ------------[ cut here ]------------
>     kernel BUG at fs/nfsd/nfs4state.c:380!
>     invalid opcode: 0000 [#1] SMP
>     last sysfs file: /sys/kernel/mm/ksm/run
>     Modules linked in: nfs fscache md4 nls_utf8 cifs ip6table_filter ip6_tables ebtable_nat ebtables ipt_MASQUERADE iptable_nat nf_nat bridge stp llc nfsd lockd nfs_acl auth_rpcgss sunrpc ipv6 ppdev parport_pc parport pcnet32 mii pcspkr microcode i2c_piix4 BusLogic floppy [last unloaded: mperf]
>     
>     Pid: 1468, comm: nfsd Not tainted 2.6.38+ #120 VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform
>     EIP: 0060:[<e24f180d>] EFLAGS: 00010297 CPU: 0
>     EIP is at nfs4_access_to_omode+0x1c/0x29 [nfsd]
>     EAX: ffffffff EBX: dd758120 ECX: 00000000 EDX: 00000004
>     ESI: dd758120 EDI: ddfe657c EBP: dd54dde0 ESP: dd54dde0
>      DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
>     Process nfsd (pid: 1468, ti=dd54c000 task=ddc92580 task.ti=dd54c000)
>     Stack:
>      dd54ddf0 e24f19ca 00000000 ddfe6560 dd54de08 e24f1a5d dd758130 deee3a20
>      ddfe6560 31270000 dd54df1c e24f52fd 0000000f dd758090 e2505dd0 0be304cf
>      dbb51d68 0000000e ddfe657c ddcd8020 dd758130 dd758128 dd7580d8 dd54de68
>     Call Trace:
>      [<e24f19ca>] free_generic_stateid+0x1c/0x3e [nfsd]
>      [<e24f1a5d>] release_lockowner+0x71/0x8a [nfsd]
>      [<e24f52fd>] nfsd4_lock+0x617/0x66c [nfsd]
>      [<e24e57b6>] ? nfsd_setuser+0x199/0x1bb [nfsd]
>      [<e24e056c>] ? nfsd_setuser_and_check_port+0x65/0x81 [nfsd]
>      [<c07a0052>] ? _cond_resched+0x8/0x1c
>      [<c04ca61f>] ? slab_pre_alloc_hook.clone.33+0x23/0x27
>      [<c04cac01>] ? kmem_cache_alloc+0x1a/0xd2
>      [<c04835a0>] ? __call_rcu+0xd7/0xdd
>      [<e24e0dfb>] ? fh_verify+0x401/0x452 [nfsd]
>      [<e24f0b61>] ? nfsd4_encode_operation+0x52/0x117 [nfsd]
>      [<e24ea0d7>] ? nfsd4_putfh+0x33/0x3b [nfsd]
>      [<e24f4ce6>] ? nfsd4_delegreturn+0xd4/0xd4 [nfsd]
>      [<e24ea2c9>] nfsd4_proc_compound+0x1ea/0x33e [nfsd]
>      [<e24de6ee>] nfsd_dispatch+0xd1/0x1a5 [nfsd]
>      [<e1d6e1c7>] svc_process_common+0x282/0x46f [sunrpc]
>      [<e1d6e578>] svc_process+0xdc/0xfa [sunrpc]
>      [<e24de0fa>] nfsd+0xd6/0x115 [nfsd]
>      [<e24de024>] ? nfsd_shutdown+0x24/0x24 [nfsd]
>      [<c0454322>] kthread+0x62/0x67
>      [<c04542c0>] ? kthread_worker_fn+0x114/0x114
>      [<c07a6ebe>] kernel_thread_helper+0x6/0x10
>     Code: eb 05 b8 00 00 27 4f 8d 65 f4 5b 5e 5f 5d c3 83 e0 03 55 83 f8 02 89 e5 74 17 83 f8 03 74 05 48 75 09 eb 09 b8 02 00 00 00 eb 0b <0f> 0b 31 c0 eb 05 b8 01 00 00 00 5d c3 55 89 e5 57 56 89 d6 8d
>     EIP: [<e24f180d>] nfs4_access_to_omode+0x1c/0x29 [nfsd] SS:ESP 0068:dd54dde0
>     ---[ end trace 2b0bf6c6557cb284 ]---
>     
>     The trace route is:
>     
>      -> nfsd4_lock()
>        -> if (lock->lk_is_new) {
>          -> alloc_init_lock_stateid()
>     
>             3739: stp->st_access_bmap = 0;
>     
>        ->if (status && lock->lk_is_new && lock_sop)
>          -> release_lockowner()
>           -> free_generic_stateid()
>            -> nfs4_access_bmap_to_omode()
>               -> nfs4_access_to_omode()
>     
>             380: BUG();   *****
>     
>     This problem was introduced by 0997b173609b9229ece28941c118a2a9b278796e.
>     
>     Reported-by: Mi Jinlong <mijinlong@cn.fujitsu.com>
>     Tested-by: Mi Jinlong <mijinlong@cn.fujitsu.com>
>     Signed-off-by: J. Bruce Fields <bfields@redhat.com>
> 
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index fbde6f7..8e3c407 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -397,10 +397,13 @@ static void unhash_generic_stateid(struct nfs4_stateid *stp)
>  
>  static void free_generic_stateid(struct nfs4_stateid *stp)
>  {
> -	int oflag = nfs4_access_bmap_to_omode(stp);
> +	int oflag;
>  
> -	nfs4_file_put_access(stp->st_file, oflag);
> -	put_nfs4_file(stp->st_file);
> +	if (stp->st_access_bmap) {
> +		oflag = nfs4_access_bmap_to_omode(stp);
> +		nfs4_file_put_access(stp->st_file, oflag);
> +		put_nfs4_file(stp->st_file);
> +	}
>  	kmem_cache_free(stateid_slab, stp);
>  }
>  
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2011-04-11  0:27 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-03-28  7:15 [PATCH] nfsd4: set right access bmap when initializing lock stateid Mi Jinlong
2011-03-29  3:18 ` J. Bruce Fields
2011-03-29  3:41   ` Mi Jinlong
2011-04-10 16:20     ` J. Bruce Fields
2011-04-11  0:28       ` Mi Jinlong

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).