aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs/cifssmb.c
diff options
context:
space:
mode:
authorSteve French <sfrench@us.ibm.com>2008-10-07 16:03:33 -0400
committerSteve French <sfrench@us.ibm.com>2008-10-07 16:03:33 -0400
commit0752f1522a9120f731232919f7ad904e9e22b8ce (patch)
tree3abf826e49b8e550863254f135ec573d7fd1107c /fs/cifs/cifssmb.c
parent6050247d8089037d6d8ea0f3c62fe4a931c1ab14 (diff)
[CIFS] make sure we have the right resume info before calling CIFSFindNext
When we do a seekdir() or equivalent, we usually end up doing a FindFirst call and then call FindNext until we get to the offset that we want. The problem is that when we call FindNext, the code usually doesn't have the proper info (mostly, the filename of the entry from the last search) to resume the search. Add a "last_entry" field to the cifs_search_info that points to the last entry in the search. We calculate this pointer by using the LastNameOffset field from the search parms that are returned. We then use that info to do a cifs_save_resume_key before we call CIFSFindNext. This patch allows CIFS to reliably pass the "telldir" connectathon test. Signed-off-by: Jeff Layton <jlayton@redhat.com> CC: Stable <stable@kernel.org> Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs/cifs/cifssmb.c')
-rw-r--r--fs/cifs/cifssmb.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
index 7504d1514c77..7b00a16e1352 100644
--- a/fs/cifs/cifssmb.c
+++ b/fs/cifs/cifssmb.c
@@ -3636,6 +3636,8 @@ findFirstRetry:
3636 le16_to_cpu(parms->SearchCount); 3636 le16_to_cpu(parms->SearchCount);
3637 psrch_inf->index_of_last_entry = 2 /* skip . and .. */ + 3637 psrch_inf->index_of_last_entry = 2 /* skip . and .. */ +
3638 psrch_inf->entries_in_buffer; 3638 psrch_inf->entries_in_buffer;
3639 psrch_inf->last_entry = psrch_inf->srch_entries_start +
3640 le16_to_cpu(parms->LastNameOffset);
3639 *pnetfid = parms->SearchHandle; 3641 *pnetfid = parms->SearchHandle;
3640 } else { 3642 } else {
3641 cifs_buf_release(pSMB); 3643 cifs_buf_release(pSMB);
@@ -3751,6 +3753,8 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon,
3751 le16_to_cpu(parms->SearchCount); 3753 le16_to_cpu(parms->SearchCount);
3752 psrch_inf->index_of_last_entry += 3754 psrch_inf->index_of_last_entry +=
3753 psrch_inf->entries_in_buffer; 3755 psrch_inf->entries_in_buffer;
3756 psrch_inf->last_entry = psrch_inf->srch_entries_start +
3757 le16_to_cpu(parms->LastNameOffset);
3754/* cFYI(1,("fnxt2 entries in buf %d index_of_last %d", 3758/* cFYI(1,("fnxt2 entries in buf %d index_of_last %d",
3755 psrch_inf->entries_in_buffer, psrch_inf->index_of_last_entry)); */ 3759 psrch_inf->entries_in_buffer, psrch_inf->index_of_last_entry)); */
3756 3760