From patchwork Tue Dec 14 11:10:57 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pavel Shilovsky X-Patchwork-Id: 409571 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id oBEBBUSL020648 for ; Tue, 14 Dec 2010 11:11:31 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757792Ab0LNLL2 (ORCPT ); Tue, 14 Dec 2010 06:11:28 -0500 Received: from mail-ey0-f171.google.com ([209.85.215.171]:38813 "EHLO mail-ey0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757224Ab0LNLL1 (ORCPT ); Tue, 14 Dec 2010 06:11:27 -0500 Received: by eyg5 with SMTP id 5so255991eyg.2 for ; Tue, 14 Dec 2010 03:11:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:subject:date :message-id:x-mailer:in-reply-to:references; bh=Afkx4kIapPzDj3oBHIPlLg8s2xHaOOC4j8uVqWGzUQ0=; b=PqWSAdPqt+meuiyBGa9RvC+lQ4evHKti2m0OhR1MW3AhYxj1LlkvkC/YZk2lImd+2F 29SDs6s7RnSmFoeGxAUfckiwvqnOORs2WxALqVAYkDVn7eeeJK942OxwGV9MQf91FDV8 vMeLEhmJqhHWed3vqfX61ywCAnz1fpBpU1C1Q= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:subject:date:message-id:x-mailer:in-reply-to:references; b=buFhEX+ps7x1/fXtz7aE26MPADEuVXAlw03Lj3uBoStbd3S086zXMQfanyFhwSEyCc 5CWiR7rnflQbLs4kXv+awot1v+L0ubP9tFmC5zXCd7I1EIcCIO2ttplnfpjS0sBJSLkk pN+xcv2zWYBf1tUJNG28mzQzSumaKbeUoF83Y= Received: by 10.213.26.74 with SMTP id d10mr3492500ebc.61.1292325086590; Tue, 14 Dec 2010 03:11:26 -0800 (PST) Received: from localhost.localdomain (PPPoE-78-29-112-8.san.ru [78.29.112.8]) by mx.google.com with ESMTPS id t5sm887776eeh.8.2010.12.14.03.11.24 (version=TLSv1/SSLv3 cipher=RC4-MD5); Tue, 14 Dec 2010 03:11:25 -0800 (PST) From: Pavel Shilovsky To: linux-cifs@vger.kernel.org Subject: [PATCH 3/6] CIFS: Implement cifs_file_strict_mmap Date: Tue, 14 Dec 2010 14:10:57 +0300 Message-Id: <1292325060-8828-3-git-send-email-piastryyy@gmail.com> X-Mailer: git-send-email 1.7.3.2 In-Reply-To: <1292325060-8828-1-git-send-email-piastryyy@gmail.com> References: <1292325060-8828-1-git-send-email-piastryyy@gmail.com> Sender: linux-cifs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-cifs@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Tue, 14 Dec 2010 11:11:31 +0000 (UTC) diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 7660133..a218afe 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c @@ -720,7 +720,7 @@ const struct file_operations cifs_file_strict_ops = { .lock = cifs_lock, .fsync = cifs_strict_fsync, .flush = cifs_flush, - .mmap = cifs_file_mmap, + .mmap = cifs_file_strict_mmap, .splice_read = generic_file_splice_read, .llseek = cifs_llseek, #ifdef CONFIG_CIFS_POSIX @@ -775,7 +775,7 @@ const struct file_operations cifs_file_strict_nobrl_ops = { .release = cifs_close, .fsync = cifs_strict_fsync, .flush = cifs_flush, - .mmap = cifs_file_mmap, + .mmap = cifs_file_strict_mmap, .splice_read = generic_file_splice_read, .llseek = cifs_llseek, #ifdef CONFIG_CIFS_POSIX diff --git a/fs/cifs/cifsfs.h b/fs/cifs/cifsfs.h index 8584829..657738f 100644 --- a/fs/cifs/cifsfs.h +++ b/fs/cifs/cifsfs.h @@ -89,6 +89,7 @@ extern int cifs_fsync(struct file *, int); extern int cifs_strict_fsync(struct file *, int); extern int cifs_flush(struct file *, fl_owner_t id); extern int cifs_file_mmap(struct file * , struct vm_area_struct *); +extern int cifs_file_strict_mmap(struct file * , struct vm_area_struct *); extern const struct file_operations cifs_dir_ops; extern int cifs_dir_open(struct inode *inode, struct file *file); extern int cifs_readdir(struct file *file, void *direntry, filldir_t filldir); diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 4e37cb8..dd1e59a 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c @@ -1827,17 +1827,34 @@ static ssize_t cifs_read(struct file *file, char *read_data, size_t read_size, return total_read; } +int cifs_file_strict_mmap(struct file *file, struct vm_area_struct *vma) +{ + int rc, xid; + struct inode *inode = file->f_path.dentry->d_inode; + + xid = GetXid(); + + if (!CIFS_I(inode)->clientCanCacheRead) + cifs_invalidate_mapping(inode); + + rc = generic_file_mmap(file, vma); + FreeXid(xid); + return rc; +} + int cifs_file_mmap(struct file *file, struct vm_area_struct *vma) { int rc, xid; xid = GetXid(); + rc = cifs_revalidate_file(file); if (rc) { cFYI(1, "Validation prior to mmap failed, error=%d", rc); FreeXid(xid); return rc; } + rc = generic_file_mmap(file, vma); FreeXid(xid); return rc;