diff options
Diffstat (limited to 'fs/cifs/readdir.c')
| -rw-r--r-- | fs/cifs/readdir.c | 41 |
1 files changed, 16 insertions, 25 deletions
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index ef7bb7b50f58..a73eb9f4bdaf 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c | |||
| @@ -226,26 +226,29 @@ static int initiate_cifs_search(const int xid, struct file *file) | |||
| 226 | char *full_path = NULL; | 226 | char *full_path = NULL; |
| 227 | struct cifsFileInfo *cifsFile; | 227 | struct cifsFileInfo *cifsFile; |
| 228 | struct cifs_sb_info *cifs_sb = CIFS_SB(file->f_path.dentry->d_sb); | 228 | struct cifs_sb_info *cifs_sb = CIFS_SB(file->f_path.dentry->d_sb); |
| 229 | struct tcon_link *tlink; | 229 | struct tcon_link *tlink = NULL; |
| 230 | struct cifsTconInfo *pTcon; | 230 | struct cifsTconInfo *pTcon; |
| 231 | 231 | ||
| 232 | tlink = cifs_sb_tlink(cifs_sb); | ||
| 233 | if (IS_ERR(tlink)) | ||
| 234 | return PTR_ERR(tlink); | ||
| 235 | pTcon = tlink_tcon(tlink); | ||
| 236 | |||
| 237 | if (file->private_data == NULL) | ||
| 238 | file->private_data = | ||
| 239 | kzalloc(sizeof(struct cifsFileInfo), GFP_KERNEL); | ||
| 240 | if (file->private_data == NULL) { | 232 | if (file->private_data == NULL) { |
| 241 | rc = -ENOMEM; | 233 | tlink = cifs_sb_tlink(cifs_sb); |
| 242 | goto error_exit; | 234 | if (IS_ERR(tlink)) |
| 235 | return PTR_ERR(tlink); | ||
| 236 | |||
| 237 | cifsFile = kzalloc(sizeof(struct cifsFileInfo), GFP_KERNEL); | ||
| 238 | if (cifsFile == NULL) { | ||
| 239 | rc = -ENOMEM; | ||
| 240 | goto error_exit; | ||
| 241 | } | ||
| 242 | file->private_data = cifsFile; | ||
| 243 | cifsFile->tlink = cifs_get_tlink(tlink); | ||
| 244 | pTcon = tlink_tcon(tlink); | ||
| 245 | } else { | ||
| 246 | cifsFile = file->private_data; | ||
| 247 | pTcon = tlink_tcon(cifsFile->tlink); | ||
| 243 | } | 248 | } |
| 244 | 249 | ||
| 245 | cifsFile = file->private_data; | ||
| 246 | cifsFile->invalidHandle = true; | 250 | cifsFile->invalidHandle = true; |
| 247 | cifsFile->srch_inf.endOfSearch = false; | 251 | cifsFile->srch_inf.endOfSearch = false; |
| 248 | cifsFile->tlink = cifs_get_tlink(tlink); | ||
| 249 | 252 | ||
| 250 | full_path = build_path_from_dentry(file->f_path.dentry); | 253 | full_path = build_path_from_dentry(file->f_path.dentry); |
| 251 | if (full_path == NULL) { | 254 | if (full_path == NULL) { |
| @@ -756,18 +759,6 @@ static int cifs_filldir(char *pfindEntry, struct file *file, filldir_t filldir, | |||
| 756 | rc = filldir(direntry, qstring.name, qstring.len, file->f_pos, | 759 | rc = filldir(direntry, qstring.name, qstring.len, file->f_pos, |
| 757 | ino, fattr.cf_dtype); | 760 | ino, fattr.cf_dtype); |
| 758 | 761 | ||
| 759 | /* | ||
| 760 | * we can not return filldir errors to the caller since they are | ||
| 761 | * "normal" when the stat blocksize is too small - we return remapped | ||
| 762 | * error instead | ||
| 763 | * | ||
| 764 | * FIXME: This looks bogus. filldir returns -EOVERFLOW in the above | ||
| 765 | * case already. Why should we be clobbering other errors from it? | ||
| 766 | */ | ||
| 767 | if (rc) { | ||
| 768 | cFYI(1, "filldir rc = %d", rc); | ||
| 769 | rc = -EOVERFLOW; | ||
| 770 | } | ||
| 771 | dput(tmp_dentry); | 762 | dput(tmp_dentry); |
| 772 | return rc; | 763 | return rc; |
| 773 | } | 764 | } |
