Commit c6ea21e35bf3691cad59647c771e6606067f627d

Authored by Linus Torvalds

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

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