Commit c6ea21e35bf3691cad59647c771e6606067f627d
Exists in
master
and in
7 other branches
Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6: cifs: prevent infinite recursion in cifs_reconnect_tcon cifs: set backing_dev_info on new S_ISREG inodes
Showing 2 changed files Side-by-side Diff
fs/cifs/cifssmb.c
... | ... | @@ -232,7 +232,7 @@ |
232 | 232 | small_smb_init(int smb_command, int wct, struct cifsTconInfo *tcon, |
233 | 233 | void **request_buf) |
234 | 234 | { |
235 | - int rc = 0; | |
235 | + int rc; | |
236 | 236 | |
237 | 237 | rc = cifs_reconnect_tcon(tcon, smb_command); |
238 | 238 | if (rc) |
... | ... | @@ -250,7 +250,7 @@ |
250 | 250 | if (tcon != NULL) |
251 | 251 | cifs_stats_inc(&tcon->num_smbs_sent); |
252 | 252 | |
253 | - return rc; | |
253 | + return 0; | |
254 | 254 | } |
255 | 255 | |
256 | 256 | int |
257 | 257 | |
... | ... | @@ -281,16 +281,9 @@ |
281 | 281 | |
282 | 282 | /* If the return code is zero, this function must fill in request_buf pointer */ |
283 | 283 | static int |
284 | -smb_init(int smb_command, int wct, struct cifsTconInfo *tcon, | |
285 | - void **request_buf /* returned */ , | |
286 | - void **response_buf /* returned */ ) | |
284 | +__smb_init(int smb_command, int wct, struct cifsTconInfo *tcon, | |
285 | + void **request_buf, void **response_buf) | |
287 | 286 | { |
288 | - int rc = 0; | |
289 | - | |
290 | - rc = cifs_reconnect_tcon(tcon, smb_command); | |
291 | - if (rc) | |
292 | - return rc; | |
293 | - | |
294 | 287 | *request_buf = cifs_buf_get(); |
295 | 288 | if (*request_buf == NULL) { |
296 | 289 | /* BB should we add a retry in here if not a writepage? */ |
297 | 290 | |
... | ... | @@ -309,9 +302,33 @@ |
309 | 302 | if (tcon != NULL) |
310 | 303 | cifs_stats_inc(&tcon->num_smbs_sent); |
311 | 304 | |
312 | - return rc; | |
305 | + return 0; | |
313 | 306 | } |
314 | 307 | |
308 | +/* If the return code is zero, this function must fill in request_buf pointer */ | |
309 | +static int | |
310 | +smb_init(int smb_command, int wct, struct cifsTconInfo *tcon, | |
311 | + void **request_buf, void **response_buf) | |
312 | +{ | |
313 | + int rc; | |
314 | + | |
315 | + rc = cifs_reconnect_tcon(tcon, smb_command); | |
316 | + if (rc) | |
317 | + return rc; | |
318 | + | |
319 | + return __smb_init(smb_command, wct, tcon, request_buf, response_buf); | |
320 | +} | |
321 | + | |
322 | +static int | |
323 | +smb_init_no_reconnect(int smb_command, int wct, struct cifsTconInfo *tcon, | |
324 | + void **request_buf, void **response_buf) | |
325 | +{ | |
326 | + if (tcon->ses->need_reconnect || tcon->need_reconnect) | |
327 | + return -EHOSTDOWN; | |
328 | + | |
329 | + return __smb_init(smb_command, wct, tcon, request_buf, response_buf); | |
330 | +} | |
331 | + | |
315 | 332 | static int validate_t2(struct smb_t2_rsp *pSMB) |
316 | 333 | { |
317 | 334 | int rc = -EINVAL; |
... | ... | @@ -4534,8 +4551,8 @@ |
4534 | 4551 | |
4535 | 4552 | cFYI(1, "In QFSUnixInfo"); |
4536 | 4553 | QFSUnixRetry: |
4537 | - rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | |
4538 | - (void **) &pSMBr); | |
4554 | + rc = smb_init_no_reconnect(SMB_COM_TRANSACTION2, 15, tcon, | |
4555 | + (void **) &pSMB, (void **) &pSMBr); | |
4539 | 4556 | if (rc) |
4540 | 4557 | return rc; |
4541 | 4558 | |
... | ... | @@ -4604,8 +4621,8 @@ |
4604 | 4621 | cFYI(1, "In SETFSUnixInfo"); |
4605 | 4622 | SETFSUnixRetry: |
4606 | 4623 | /* BB switch to small buf init to save memory */ |
4607 | - rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | |
4608 | - (void **) &pSMBr); | |
4624 | + rc = smb_init_no_reconnect(SMB_COM_TRANSACTION2, 15, tcon, | |
4625 | + (void **) &pSMB, (void **) &pSMBr); | |
4609 | 4626 | if (rc) |
4610 | 4627 | return rc; |
4611 | 4628 |
fs/cifs/inode.c
... | ... | @@ -801,6 +801,8 @@ |
801 | 801 | inode->i_flags |= S_NOATIME | S_NOCMTIME; |
802 | 802 | if (inode->i_state & I_NEW) { |
803 | 803 | inode->i_ino = hash; |
804 | + if (S_ISREG(inode->i_mode)) | |
805 | + inode->i_data.backing_dev_info = sb->s_bdi; | |
804 | 806 | #ifdef CONFIG_CIFS_FSCACHE |
805 | 807 | /* initialize per-inode cache cookie pointer */ |
806 | 808 | CIFS_I(inode)->fscache = NULL; |