[pnfs] CVS: nfsv4
Benny Halevy
bhalevy at panasas.com
Mon Dec 11 01:22:52 EST 2006
> That is why I had the comment "//??? if the right layout". I agree that
> without that check it was broken but the change you made did not fix it.
> Right now when a second request for a layout arrives from the 2nd client
> for the same file the
> while (!list_empty(&fp->fi_layouts)) {
> lp = list_entry(fp->fi_layouts.next,
> will find it and increment the hold count on lp but it will not add it to
> the 2nd client chain, so when purging the 2nd client you will find nothing
> on its chain to recall. The layout is on the file chain and the first
> client that requested this layout.
Right, the current implementation does not support multiple clients.
With my "fix" it works for a single one...
> right thing to do but I will not make any more changes until we talk on
> Wednesday meeting and decide how to do it.
Ok. same here...
Marc Eshel wrote:
> Benny Halevy <bhalevy at panasas.com> wrote on 12/10/2006 08:08:26 AM:
>
>> Marc Eshel wrote:
>>> Hi Benny,
>>> I am not sure that this is a bug. So you want to share the same layout
>
>>> struct on the server for all clients ? That might be more difficult to
>
>>> keep track of which client has which byte range. I had a layout struct
> per
>>> client which is also on the file struct. So if you need to see all
> layouts
>>> per client you run the chain of the client struct and if you need to
> see
>>> all the layouts per file you run the chain of the file struct.
>>> Marc.
>> Yes, we need a more efficient way to track the layouts eventually
>> but now the while() expression checked the client list while
>> the list operation is on the file's list. The client had a layout
>> for a different file while the file's layout list was empty...
>
> That is why I had the comment "//??? if the right layout". I agree that
> without that check it was broken but the change you made did not fix it.
> Right now when a second request for a layout arrives from the 2nd client
> for the same file the
> while (!list_empty(&fp->fi_layouts)) {
> lp = list_entry(fp->fi_layouts.next,
> will find it and increment the hold count on lp but it will not add it to
> the 2nd client chain, so when purging the 2nd client you will find nothing
> on its chain to recall. The layout is on the file chain and the first
> client that requested this layout.
>
>> I completely agree that you should either check against the per-client
>> list and compare the file and byte range, or check against the
>> per-file list and match the client and byte range. I'm not sure
>> what will be more efficient though...
>
> I had a separate layout struct for each client per file. You changed it to
> have one layout for all clients per file. I don't think that this is the
> right thing to do but I will not make any more changes until we talk on
> Wednesday meeting and decide how to do it.
>
>> If we keep a counter on both lists we can make the decision in run-time,
>> however, since file sharing is less common I believe that the per-file
>> list should typically be shorter than or equal to the per-client list.
>> Having an efficient hash table rather than a list should help both cases
> :)
>>>
>>> pnfs-bounces at linux-nfs.org wrote on 12/07/2006 11:06:01 PM:
>>>
>>>> CVSROOT: /cvs
>>>> Module name: nfsv4
>>>> Changes by: bhalevy at citi. 2006/12/08 02:06:01
>>>>
>>>> Modified files:
>>>> cvs/pnfs/fs/nfsd: nfs4state.c
>>>>
>>>> Log message:
>>>> Fix bug in nfs4_pnfs_get_layout()
>>>>
>>>> Index: fs/nfsd/nfs4state.c
>>>> ===================================================================
>>>> RCS file: /cvs/nfsv4/cvs/pnfs/fs/nfsd/nfs4state.c,v
>>>> retrieving revision 1.21
>>>> diff -u -p -r1.21 nfs4state.c
>>>> --- fs/nfsd/nfs4state.c 6 Dec 2006 23:18:02 -0000 1.21
>>>> +++ fs/nfsd/nfs4state.c 8 Dec 2006 07:05:03 -0000
>>>> @@ -3551,7 +3551,7 @@ int nfs4_pnfs_get_layout(struct super_bl
>>>> goto out;
>>>>
>>>> lgp->lg_flags = 0;
>>>> - while (!list_empty(&clp->cl_layouts)) {
>>>> + while (!list_empty(&fp->fi_layouts)) {
>>>> lp = list_entry(fp->fi_layouts.next,
>>>> struct nfs4_layout, lo_perfile);
>>>> //??? if the right layout
>>>>
>>>> _______________________________________________
>>>> pNFS mailing list
>>>> pNFS at linux-nfs.org
>>>> http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs
>>> _______________________________________________
>>> pNFS mailing list
>>> pNFS at linux-nfs.org
>>> http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs
>
More information about the pNFS
mailing list