linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / fs / cifs / readdir.c
index b689c50..288cc04 100644 (file)
@@ -197,10 +197,10 @@ static void fill_in_inode(struct inode *tmp_inode,
 
        if (allocation_size < end_of_file)
                cFYI(1, ("May be sparse file, allocation less than file size"));
-       cFYI(1, ("File Size %ld and blocks %llu and blocksize %ld",
-               (unsigned long)tmp_inode->i_size,
-               (unsigned long long)tmp_inode->i_blocks,
-               tmp_inode->i_blksize));
+       cFYI(1,
+            ("File Size %ld and blocks %ld and blocksize %ld",
+             (unsigned long)tmp_inode->i_size, tmp_inode->i_blocks,
+             tmp_inode->i_blksize));
        if (S_ISREG(tmp_inode->i_mode)) {
                cFYI(1, ("File inode"));
                tmp_inode->i_op = &cifs_file_inode_ops;
@@ -404,7 +404,9 @@ static int initiate_cifs_search(const int xid, struct file *file)
        if(pTcon == NULL)
                return -EINVAL;
 
+       down(&file->f_dentry->d_sb->s_vfs_rename_sem);
        full_path = build_path_from_dentry(file->f_dentry);
+       up(&file->f_dentry->d_sb->s_vfs_rename_sem);
 
        if(full_path == NULL) {
                return -ENOMEM;
@@ -590,13 +592,6 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon,
        first_entry_in_buffer = 
                cifsFile->srch_inf.index_of_last_entry - 
                        cifsFile->srch_inf.entries_in_buffer;
-
-       /* if first entry in buf is zero then is first buffer
-       in search response data which means it is likely . and ..
-       will be in this buffer, although some servers do not return
-       . and .. for the root of a drive and for those we need
-       to start two entries earlier */
-
 /*     dump_cifs_file_struct(file, "In fce ");*/
        if(((index_to_find < cifsFile->srch_inf.index_of_last_entry) && 
             is_dir_changed(file)) || 
@@ -609,12 +604,7 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon,
                cifsFile->search_resume_name = NULL;
                if(cifsFile->srch_inf.ntwrk_buf_start) {
                        cFYI(1,("freeing SMB ff cache buf on search rewind"));
-                       if(cifsFile->srch_inf.smallBuf)
-                               cifs_small_buf_release(cifsFile->srch_inf.
-                                               ntwrk_buf_start);
-                       else
-                               cifs_buf_release(cifsFile->srch_inf.
-                                               ntwrk_buf_start);
+                       cifs_buf_release(cifsFile->srch_inf.ntwrk_buf_start);
                }
                rc = initiate_cifs_search(xid,file);
                if(rc) {
@@ -639,14 +629,23 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon,
                char * end_of_smb = cifsFile->srch_inf.ntwrk_buf_start + 
                        smbCalcSize((struct smb_hdr *)
                                cifsFile->srch_inf.ntwrk_buf_start);
-
-               current_entry = cifsFile->srch_inf.srch_entries_start;
                first_entry_in_buffer = cifsFile->srch_inf.index_of_last_entry
                                        - cifsFile->srch_inf.entries_in_buffer;
                pos_in_buf = index_to_find - first_entry_in_buffer;
                cFYI(1,("found entry - pos_in_buf %d",pos_in_buf)); 
+               current_entry = cifsFile->srch_inf.srch_entries_start;
                for(i=0;(i<(pos_in_buf)) && (current_entry != NULL);i++) {
                        /* go entry by entry figuring out which is first */
+                       /* if( . or ..)
+                               skip */
+                       rc = cifs_entry_is_dot(current_entry,cifsFile);
+                       if(rc == 1) /* is . or .. so skip */ {
+                               cFYI(1,("Entry is .")); /* BB removeme BB */
+                               /* continue; */
+                       } else if (rc == 2 ) {
+                               cFYI(1,("Entry is ..")); /* BB removeme BB */
+                               /* continue; */
+                       }
                        current_entry = nxt_dir_entry(current_entry,end_of_smb);
                }
                if((current_entry == NULL) && (i < pos_in_buf)) {
@@ -766,11 +765,6 @@ static int cifs_filldir(char *pfindEntry, struct file *file,
        if(file->f_dentry == NULL)
                return -ENOENT;
 
-       rc = cifs_entry_is_dot(pfindEntry,pCifsF);
-       /* skip . and .. since we added them first */
-       if(rc != 0) 
-               return 0;
-
        cifs_sb = CIFS_SB(file->f_dentry->d_sb);
 
        qstring.name = scratch_buf;
@@ -899,22 +893,22 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir)
 
        switch ((int) file->f_pos) {
        case 0:
-               if (filldir(direntry, ".", 1, file->f_pos,
+               /*if (filldir(direntry, ".", 1, file->f_pos,
                     file->f_dentry->d_inode->i_ino, DT_DIR) < 0) {
-                       cERROR(1, ("Filldir for current dir failed"));
+                       cERROR(1, ("Filldir for current dir failed "));
                        rc = -ENOMEM;
                        break;
                }
-               file->f_pos++;
+               file->f_pos++; */
        case 1:
-               if (filldir(direntry, "..", 2, file->f_pos,
+               /* if (filldir(direntry, "..", 2, file->f_pos,
                     file->f_dentry->d_parent->d_inode->i_ino, DT_DIR) < 0) {
                        cERROR(1, ("Filldir for parent dir failed "));
                        rc = -ENOMEM;
                        break;
                }
-               file->f_pos++;
-       default:
+               file->f_pos++; */
+       case 2:
                /* 1) If search is active, 
                        is in current search buffer? 
                        if it before then restart search
@@ -928,6 +922,7 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir)
                                return rc;
                        }
                }
+       default:
                if(file->private_data == NULL) {
                        rc = -EINVAL;
                        FreeXid(xid);
@@ -947,6 +942,8 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir)
                kfree(cifsFile->search_resume_name);
                cifsFile->search_resume_name = NULL; */
 
+               /* BB account for . and .. in f_pos as special case */
+
                rc = find_cifs_entry(xid,pTcon, file,
                                &current_entry,&num_to_fill);
                if(rc) {
@@ -975,8 +972,7 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir)
                                          num_to_fill, i));
                                break;
                        }
-                       /* if buggy server returns . and .. late do
-                       we want to check for that here? */
+
                        rc = cifs_filldir(current_entry, file, 
                                        filldir, direntry,tmp_buf);
                        file->f_pos++;