[CIFS] Do not overwrite aops
cifs should not be overwriting an element of the aops structure, since the structure is shared by all cifs inodes. Instead define a separate aops structure to suit each purpose. I also took the liberty of replacing a hard-coded 4096 with PAGE_CACHE_SIZE Signed-off-by: Dave Kleikamp <shaggy@austin.ibm.com> Signed-off-by: Steven French <sfrench@us.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org>
This commit is contained in:
parent
3856a9d443
commit
273d81d6ad
@ -33,6 +33,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern struct address_space_operations cifs_addr_ops;
|
extern struct address_space_operations cifs_addr_ops;
|
||||||
|
extern struct address_space_operations cifs_addr_ops_smallbuf;
|
||||||
|
|
||||||
/* Functions related to super block operations */
|
/* Functions related to super block operations */
|
||||||
extern struct super_operations cifs_super_ops;
|
extern struct super_operations cifs_super_ops;
|
||||||
|
@ -1959,3 +1959,19 @@ struct address_space_operations cifs_addr_ops = {
|
|||||||
/* .sync_page = cifs_sync_page, */
|
/* .sync_page = cifs_sync_page, */
|
||||||
/* .direct_IO = */
|
/* .direct_IO = */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* cifs_readpages requires the server to support a buffer large enough to
|
||||||
|
* contain the header plus one complete page of data. Otherwise, we need
|
||||||
|
* to leave cifs_readpages out of the address space operations.
|
||||||
|
*/
|
||||||
|
struct address_space_operations cifs_addr_ops_smallbuf = {
|
||||||
|
.readpage = cifs_readpage,
|
||||||
|
.writepage = cifs_writepage,
|
||||||
|
.writepages = cifs_writepages,
|
||||||
|
.prepare_write = cifs_prepare_write,
|
||||||
|
.commit_write = cifs_commit_write,
|
||||||
|
.set_page_dirty = __set_page_dirty_nobuffers,
|
||||||
|
/* .sync_page = cifs_sync_page, */
|
||||||
|
/* .direct_IO = */
|
||||||
|
};
|
||||||
|
@ -180,11 +180,12 @@ int cifs_get_inode_info_unix(struct inode **pinode,
|
|||||||
else /* not direct, send byte range locks */
|
else /* not direct, send byte range locks */
|
||||||
inode->i_fop = &cifs_file_ops;
|
inode->i_fop = &cifs_file_ops;
|
||||||
|
|
||||||
inode->i_data.a_ops = &cifs_addr_ops;
|
|
||||||
/* check if server can support readpages */
|
/* check if server can support readpages */
|
||||||
if(pTcon->ses->server->maxBuf <
|
if(pTcon->ses->server->maxBuf <
|
||||||
4096 + MAX_CIFS_HDR_SIZE)
|
PAGE_CACHE_SIZE + MAX_CIFS_HDR_SIZE)
|
||||||
inode->i_data.a_ops->readpages = NULL;
|
inode->i_data.a_ops = &cifs_addr_ops_smallbuf;
|
||||||
|
else
|
||||||
|
inode->i_data.a_ops = &cifs_addr_ops;
|
||||||
} else if (S_ISDIR(inode->i_mode)) {
|
} else if (S_ISDIR(inode->i_mode)) {
|
||||||
cFYI(1, ("Directory inode"));
|
cFYI(1, ("Directory inode"));
|
||||||
inode->i_op = &cifs_dir_inode_ops;
|
inode->i_op = &cifs_dir_inode_ops;
|
||||||
@ -519,10 +520,11 @@ int cifs_get_inode_info(struct inode **pinode,
|
|||||||
else /* not direct, send byte range locks */
|
else /* not direct, send byte range locks */
|
||||||
inode->i_fop = &cifs_file_ops;
|
inode->i_fop = &cifs_file_ops;
|
||||||
|
|
||||||
inode->i_data.a_ops = &cifs_addr_ops;
|
|
||||||
if(pTcon->ses->server->maxBuf <
|
if(pTcon->ses->server->maxBuf <
|
||||||
4096 + MAX_CIFS_HDR_SIZE)
|
PAGE_CACHE_SIZE + MAX_CIFS_HDR_SIZE)
|
||||||
inode->i_data.a_ops->readpages = NULL;
|
inode->i_data.a_ops = &cifs_addr_ops_smallbuf;
|
||||||
|
else
|
||||||
|
inode->i_data.a_ops = &cifs_addr_ops;
|
||||||
} else if (S_ISDIR(inode->i_mode)) {
|
} else if (S_ISDIR(inode->i_mode)) {
|
||||||
cFYI(1, ("Directory inode"));
|
cFYI(1, ("Directory inode"));
|
||||||
inode->i_op = &cifs_dir_inode_ops;
|
inode->i_op = &cifs_dir_inode_ops;
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
|
#include <linux/pagemap.h>
|
||||||
#include <linux/stat.h>
|
#include <linux/stat.h>
|
||||||
#include <linux/smp_lock.h>
|
#include <linux/smp_lock.h>
|
||||||
#include "cifspdu.h"
|
#include "cifspdu.h"
|
||||||
@ -216,11 +217,13 @@ static void fill_in_inode(struct inode *tmp_inode,
|
|||||||
else
|
else
|
||||||
tmp_inode->i_fop = &cifs_file_ops;
|
tmp_inode->i_fop = &cifs_file_ops;
|
||||||
|
|
||||||
tmp_inode->i_data.a_ops = &cifs_addr_ops;
|
|
||||||
if((cifs_sb->tcon) && (cifs_sb->tcon->ses) &&
|
if((cifs_sb->tcon) && (cifs_sb->tcon->ses) &&
|
||||||
(cifs_sb->tcon->ses->server->maxBuf <
|
(cifs_sb->tcon->ses->server->maxBuf <
|
||||||
4096 + MAX_CIFS_HDR_SIZE))
|
PAGE_CACHE_SIZE + MAX_CIFS_HDR_SIZE))
|
||||||
tmp_inode->i_data.a_ops->readpages = NULL;
|
tmp_inode->i_data.a_ops = &cifs_addr_ops_smallbuf;
|
||||||
|
else
|
||||||
|
tmp_inode->i_data.a_ops = &cifs_addr_ops;
|
||||||
|
|
||||||
if(isNewInode)
|
if(isNewInode)
|
||||||
return; /* No sense invalidating pages for new inode
|
return; /* No sense invalidating pages for new inode
|
||||||
since have not started caching readahead file
|
since have not started caching readahead file
|
||||||
@ -339,11 +342,12 @@ static void unix_fill_in_inode(struct inode *tmp_inode,
|
|||||||
else
|
else
|
||||||
tmp_inode->i_fop = &cifs_file_ops;
|
tmp_inode->i_fop = &cifs_file_ops;
|
||||||
|
|
||||||
tmp_inode->i_data.a_ops = &cifs_addr_ops;
|
|
||||||
if((cifs_sb->tcon) && (cifs_sb->tcon->ses) &&
|
if((cifs_sb->tcon) && (cifs_sb->tcon->ses) &&
|
||||||
(cifs_sb->tcon->ses->server->maxBuf <
|
(cifs_sb->tcon->ses->server->maxBuf <
|
||||||
4096 + MAX_CIFS_HDR_SIZE))
|
PAGE_CACHE_SIZE + MAX_CIFS_HDR_SIZE))
|
||||||
tmp_inode->i_data.a_ops->readpages = NULL;
|
tmp_inode->i_data.a_ops = &cifs_addr_ops_smallbuf;
|
||||||
|
else
|
||||||
|
tmp_inode->i_data.a_ops = &cifs_addr_ops;
|
||||||
|
|
||||||
if(isNewInode)
|
if(isNewInode)
|
||||||
return; /* No sense invalidating pages for new inode since we
|
return; /* No sense invalidating pages for new inode since we
|
||||||
|
Loading…
Reference in New Issue
Block a user