Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 273d81d6 authored by Dave Kleikamp's avatar Dave Kleikamp Committed by Steve French
Browse files

[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: default avatarDave Kleikamp <shaggy@austin.ibm.com>
Signed-off-by: default avatarSteven French <sfrench@us.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
parent 3856a9d4
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@
#endif

extern struct address_space_operations cifs_addr_ops;
extern struct address_space_operations cifs_addr_ops_smallbuf;

/* Functions related to super block operations */
extern struct super_operations cifs_super_ops;
+16 −0
Original line number Diff line number Diff line
@@ -1959,3 +1959,19 @@ struct address_space_operations cifs_addr_ops = {
	/* .sync_page = cifs_sync_page, */
	/* .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 = */
};
+8 −6
Original line number Diff line number Diff line
@@ -180,11 +180,12 @@ int cifs_get_inode_info_unix(struct inode **pinode,
			else /* not direct, send byte range locks */ 
				inode->i_fop = &cifs_file_ops;

			inode->i_data.a_ops = &cifs_addr_ops;
			/* check if server can support readpages */
			if(pTcon->ses->server->maxBuf < 
			    4096 + MAX_CIFS_HDR_SIZE)
				inode->i_data.a_ops->readpages = NULL;
			    PAGE_CACHE_SIZE + MAX_CIFS_HDR_SIZE)
				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)) {
			cFYI(1, ("Directory inode"));
			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 */
				inode->i_fop = &cifs_file_ops;

			inode->i_data.a_ops = &cifs_addr_ops;
			if(pTcon->ses->server->maxBuf < 
			     4096 + MAX_CIFS_HDR_SIZE)
				inode->i_data.a_ops->readpages = NULL;
			     PAGE_CACHE_SIZE + MAX_CIFS_HDR_SIZE)
				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)) {
			cFYI(1, ("Directory inode"));
			inode->i_op = &cifs_dir_inode_ops;
+10 −6
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */
#include <linux/fs.h>
#include <linux/pagemap.h>
#include <linux/stat.h>
#include <linux/smp_lock.h>
#include "cifspdu.h"
@@ -216,11 +217,13 @@ static void fill_in_inode(struct inode *tmp_inode,
		else
			tmp_inode->i_fop = &cifs_file_ops;

		tmp_inode->i_data.a_ops = &cifs_addr_ops;
		if((cifs_sb->tcon) && (cifs_sb->tcon->ses) &&
		   (cifs_sb->tcon->ses->server->maxBuf <
			4096 + MAX_CIFS_HDR_SIZE))
			tmp_inode->i_data.a_ops->readpages = NULL;
			PAGE_CACHE_SIZE + MAX_CIFS_HDR_SIZE))
			tmp_inode->i_data.a_ops = &cifs_addr_ops_smallbuf;
		else
			tmp_inode->i_data.a_ops = &cifs_addr_ops;

		if(isNewInode)
			return; /* No sense invalidating pages for new inode
				   since have not started caching readahead file
@@ -339,11 +342,12 @@ static void unix_fill_in_inode(struct inode *tmp_inode,
		else
			tmp_inode->i_fop = &cifs_file_ops;

		tmp_inode->i_data.a_ops = &cifs_addr_ops;
		if((cifs_sb->tcon) && (cifs_sb->tcon->ses) &&
		   (cifs_sb->tcon->ses->server->maxBuf < 
			4096 + MAX_CIFS_HDR_SIZE))
			tmp_inode->i_data.a_ops->readpages = NULL;
			PAGE_CACHE_SIZE + MAX_CIFS_HDR_SIZE))
			tmp_inode->i_data.a_ops = &cifs_addr_ops_smallbuf;
		else
			tmp_inode->i_data.a_ops = &cifs_addr_ops;

		if(isNewInode)
			return; /* No sense invalidating pages for new inode since we