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; |