diff options
author | Pavel Shilovsky <piastry@etersoft.ru> | 2012-11-22 08:10:57 -0500 |
---|---|---|
committer | Steve French <smfrench@gmail.com> | 2012-12-05 14:27:29 -0500 |
commit | f152fd5fffa78910c467b17f12d0aa060aa408a6 (patch) | |
tree | 156a6466d1cc3b79a82d7520615d9be0feb71d13 /fs/cifs/file.c | |
parent | b8db928b765b4b0fe1aec3eb7f1741fedbed9a33 (diff) |
CIFS: Implement cifs_relock_file
that reacquires byte-range locks when a file is reopened.
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Pavel Shilovsky <piastry@etersoft.ru>
Signed-off-by: Steve French <smfrench@gmail.com>
Diffstat (limited to 'fs/cifs/file.c')
-rw-r--r-- | fs/cifs/file.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 1747cbff7ddf..67fe0b811f23 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
@@ -505,16 +505,36 @@ out: | |||
505 | return rc; | 505 | return rc; |
506 | } | 506 | } |
507 | 507 | ||
508 | static int cifs_push_posix_locks(struct cifsFileInfo *cfile); | ||
509 | |||
508 | /* | 510 | /* |
509 | * Try to reacquire byte range locks that were released when session | 511 | * Try to reacquire byte range locks that were released when session |
510 | * to server was lost | 512 | * to server was lost. |
511 | */ | 513 | */ |
512 | static int cifs_relock_file(struct cifsFileInfo *cifsFile) | 514 | static int |
515 | cifs_relock_file(struct cifsFileInfo *cfile) | ||
513 | { | 516 | { |
517 | struct cifs_sb_info *cifs_sb = CIFS_SB(cfile->dentry->d_sb); | ||
518 | struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode); | ||
519 | struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); | ||
514 | int rc = 0; | 520 | int rc = 0; |
515 | 521 | ||
516 | /* BB list all locks open on this file and relock */ | 522 | /* we are going to update can_cache_brlcks here - need a write access */ |
523 | down_write(&cinode->lock_sem); | ||
524 | if (cinode->can_cache_brlcks) { | ||
525 | /* can cache locks - no need to push them */ | ||
526 | up_write(&cinode->lock_sem); | ||
527 | return rc; | ||
528 | } | ||
529 | |||
530 | if (cap_unix(tcon->ses) && | ||
531 | (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) && | ||
532 | ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0)) | ||
533 | rc = cifs_push_posix_locks(cfile); | ||
534 | else | ||
535 | rc = tcon->ses->server->ops->push_mand_locks(cfile); | ||
517 | 536 | ||
537 | up_write(&cinode->lock_sem); | ||
518 | return rc; | 538 | return rc; |
519 | } | 539 | } |
520 | 540 | ||