diff options
Diffstat (limited to 'fs/cifs/dir.c')
-rw-r--r-- | fs/cifs/dir.c | 83 |
1 files changed, 38 insertions, 45 deletions
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index f54e1866f0f4..12ba81d7b07f 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c | |||
@@ -284,51 +284,48 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode, | |||
284 | /* mknod case - do not leave file open */ | 284 | /* mknod case - do not leave file open */ |
285 | CIFSSMBClose(xid, pTcon, fileHandle); | 285 | CIFSSMBClose(xid, pTcon, fileHandle); |
286 | } else if(newinode) { | 286 | } else if(newinode) { |
287 | pCifsFile = (struct cifsFileInfo *) | 287 | pCifsFile = |
288 | kmalloc(sizeof (struct cifsFileInfo), GFP_KERNEL); | 288 | kmalloc(sizeof (struct cifsFileInfo), GFP_KERNEL); |
289 | 289 | ||
290 | if (pCifsFile) { | 290 | if(pCifsFile == NULL) |
291 | memset((char *)pCifsFile, 0, | 291 | goto cifs_create_out; |
292 | sizeof (struct cifsFileInfo)); | 292 | memset((char *)pCifsFile, 0, |
293 | pCifsFile->netfid = fileHandle; | 293 | sizeof (struct cifsFileInfo)); |
294 | pCifsFile->pid = current->tgid; | 294 | pCifsFile->netfid = fileHandle; |
295 | pCifsFile->pInode = newinode; | 295 | pCifsFile->pid = current->tgid; |
296 | pCifsFile->invalidHandle = FALSE; | 296 | pCifsFile->pInode = newinode; |
297 | pCifsFile->closePend = FALSE; | 297 | pCifsFile->invalidHandle = FALSE; |
298 | init_MUTEX(&pCifsFile->fh_sem); | 298 | pCifsFile->closePend = FALSE; |
299 | /* put the following in at open now */ | 299 | init_MUTEX(&pCifsFile->fh_sem); |
300 | /* pCifsFile->pfile = file; */ | 300 | /* set the following in open now |
301 | write_lock(&GlobalSMBSeslock); | 301 | pCifsFile->pfile = file; */ |
302 | list_add(&pCifsFile->tlist,&pTcon->openFileList); | 302 | write_lock(&GlobalSMBSeslock); |
303 | pCifsInode = CIFS_I(newinode); | 303 | list_add(&pCifsFile->tlist,&pTcon->openFileList); |
304 | if(pCifsInode) { | 304 | pCifsInode = CIFS_I(newinode); |
305 | if(pCifsInode) { | ||
305 | /* if readable file instance put first in list*/ | 306 | /* if readable file instance put first in list*/ |
306 | if (write_only == TRUE) { | 307 | if (write_only == TRUE) { |
307 | list_add_tail(&pCifsFile->flist, | 308 | list_add_tail(&pCifsFile->flist, |
308 | &pCifsInode->openFileList); | 309 | &pCifsInode->openFileList); |
309 | } else { | 310 | } else { |
310 | list_add(&pCifsFile->flist, | 311 | list_add(&pCifsFile->flist, |
311 | &pCifsInode->openFileList); | 312 | &pCifsInode->openFileList); |
312 | } | ||
313 | if((oplock & 0xF) == OPLOCK_EXCLUSIVE) { | ||
314 | pCifsInode->clientCanCacheAll = TRUE; | ||
315 | pCifsInode->clientCanCacheRead = TRUE; | ||
316 | cFYI(1,("Exclusive Oplock granted on inode %p", | ||
317 | newinode)); | ||
318 | } else if((oplock & 0xF) == OPLOCK_READ) | ||
319 | pCifsInode->clientCanCacheRead = TRUE; | ||
320 | } | 313 | } |
321 | write_unlock(&GlobalSMBSeslock); | 314 | if((oplock & 0xF) == OPLOCK_EXCLUSIVE) { |
315 | pCifsInode->clientCanCacheAll = TRUE; | ||
316 | pCifsInode->clientCanCacheRead = TRUE; | ||
317 | cFYI(1,("Exclusive Oplock for inode %p", | ||
318 | newinode)); | ||
319 | } else if((oplock & 0xF) == OPLOCK_READ) | ||
320 | pCifsInode->clientCanCacheRead = TRUE; | ||
322 | } | 321 | } |
322 | write_unlock(&GlobalSMBSeslock); | ||
323 | } | 323 | } |
324 | } | 324 | } |
325 | 325 | cifs_create_out: | |
326 | if (buf) | 326 | kfree(buf); |
327 | kfree(buf); | 327 | kfree(full_path); |
328 | if (full_path) | ||
329 | kfree(full_path); | ||
330 | FreeXid(xid); | 328 | FreeXid(xid); |
331 | |||
332 | return rc; | 329 | return rc; |
333 | } | 330 | } |
334 | 331 | ||
@@ -375,10 +372,8 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode, dev_t dev | |||
375 | } | 372 | } |
376 | } | 373 | } |
377 | 374 | ||
378 | if (full_path) | 375 | kfree(full_path); |
379 | kfree(full_path); | ||
380 | FreeXid(xid); | 376 | FreeXid(xid); |
381 | |||
382 | return rc; | 377 | return rc; |
383 | } | 378 | } |
384 | 379 | ||
@@ -447,8 +442,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, struct name | |||
447 | if file exists or not but no access BB */ | 442 | if file exists or not but no access BB */ |
448 | } | 443 | } |
449 | 444 | ||
450 | if (full_path) | 445 | kfree(full_path); |
451 | kfree(full_path); | ||
452 | FreeXid(xid); | 446 | FreeXid(xid); |
453 | return ERR_PTR(rc); | 447 | return ERR_PTR(rc); |
454 | } | 448 | } |
@@ -478,8 +472,7 @@ cifs_dir_open(struct inode *inode, struct file *file) | |||
478 | 472 | ||
479 | cFYI(1, ("inode = 0x%p and full path is %s", inode, full_path)); | 473 | cFYI(1, ("inode = 0x%p and full path is %s", inode, full_path)); |
480 | 474 | ||
481 | if (full_path) | 475 | kfree(full_path); |
482 | kfree(full_path); | ||
483 | FreeXid(xid); | 476 | FreeXid(xid); |
484 | return rc; | 477 | return rc; |
485 | } | 478 | } |