diff --git a/fs/smb/client/file.c b/fs/smb/client/file.c index 438d68d681b1..1c7c6a4347d3 100644 --- a/fs/smb/client/file.c +++ b/fs/smb/client/file.c @@ -3821,6 +3821,7 @@ cifs_writev(struct kiocb *iocb, struct iov_iter *from) struct inode *inode = file->f_mapping->host; struct cifsInodeInfo *cinode = CIFS_I(inode); struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server; + struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); ssize_t rc; inode_lock(inode); @@ -3834,12 +3835,16 @@ cifs_writev(struct kiocb *iocb, struct iov_iter *from) if (rc <= 0) goto out; - if (!cifs_find_lock_conflict(cfile, iocb->ki_pos, iov_iter_count(from), + if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) && + (cifs_find_lock_conflict(cfile, iocb->ki_pos, iov_iter_count(from), server->vals->exclusive_lock_type, 0, - NULL, CIFS_WRITE_OP)) - rc = __generic_file_write_iter(iocb, from); - else + NULL, CIFS_WRITE_OP))) { rc = -EACCES; + goto out; + } + + rc = __generic_file_write_iter(iocb, from); + out: up_read(&cinode->lock_sem); inode_unlock(inode);