aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs/dir.c
diff options
context:
space:
mode:
authorJeff Layton <jlayton@redhat.com>2009-09-12 11:54:28 -0400
committerSteve French <sfrench@us.ibm.com>2009-09-15 15:45:03 -0400
commit590a3fe0e18473a55b0ff48548ba87a2010d7730 (patch)
tree0e5fdfa70ee40a10a5b0df3b85cef3baa0d1b2c6 /fs/cifs/dir.c
parent20d1752f3d6bd32beb90949559e0d14a0b234445 (diff)
cifs: fix oplock request handling in posix codepath
cifs_posix_open takes a "poplock" argument that's intended to be used in the actual posix open call to set the "Flags" field. It ignores this value however and declares an "oplock" parameter on the stack that it passes uninitialized to the CIFSPOSIXOpen function. Not only does this mean that the oplock request flags are bogus, but the result that's expected to be in that variable is unchanged. Fix this, and also clean up the type of the oplock parameter used. Since it's expected to be __u32, we should use that everywhere and not implicitly cast it from a signed type. Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs/cifs/dir.c')
-rw-r--r--fs/cifs/dir.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c
index a6424cfc0121..44f735aa2e3f 100644
--- a/fs/cifs/dir.c
+++ b/fs/cifs/dir.c
@@ -180,10 +180,9 @@ cifs_fill_fileinfo(struct inode *newinode, __u16 fileHandle,
180 180
181int cifs_posix_open(char *full_path, struct inode **pinode, 181int cifs_posix_open(char *full_path, struct inode **pinode,
182 struct super_block *sb, int mode, int oflags, 182 struct super_block *sb, int mode, int oflags,
183 int *poplock, __u16 *pnetfid, int xid) 183 __u32 *poplock, __u16 *pnetfid, int xid)
184{ 184{
185 int rc; 185 int rc;
186 __u32 oplock;
187 bool write_only = false; 186 bool write_only = false;
188 FILE_UNIX_BASIC_INFO *presp_data; 187 FILE_UNIX_BASIC_INFO *presp_data;
189 __u32 posix_flags = 0; 188 __u32 posix_flags = 0;
@@ -228,7 +227,7 @@ int cifs_posix_open(char *full_path, struct inode **pinode,
228 227
229 mode &= ~current_umask(); 228 mode &= ~current_umask();
230 rc = CIFSPOSIXCreate(xid, cifs_sb->tcon, posix_flags, mode, 229 rc = CIFSPOSIXCreate(xid, cifs_sb->tcon, posix_flags, mode,
231 pnetfid, presp_data, &oplock, full_path, 230 pnetfid, presp_data, poplock, full_path,
232 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & 231 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
233 CIFS_MOUNT_MAP_SPECIAL_CHR); 232 CIFS_MOUNT_MAP_SPECIAL_CHR);
234 if (rc) 233 if (rc)
@@ -280,7 +279,7 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode,
280 int rc = -ENOENT; 279 int rc = -ENOENT;
281 int xid; 280 int xid;
282 int create_options = CREATE_NOT_DIR; 281 int create_options = CREATE_NOT_DIR;
283 int oplock = 0; 282 __u32 oplock = 0;
284 int oflags; 283 int oflags;
285 bool posix_create = false; 284 bool posix_create = false;
286 /* 285 /*
@@ -611,7 +610,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry,
611{ 610{
612 int xid; 611 int xid;
613 int rc = 0; /* to get around spurious gcc warning, set to zero here */ 612 int rc = 0; /* to get around spurious gcc warning, set to zero here */
614 int oplock = 0; 613 __u32 oplock = 0;
615 __u16 fileHandle = 0; 614 __u16 fileHandle = 0;
616 bool posix_open = false; 615 bool posix_open = false;
617 struct cifs_sb_info *cifs_sb; 616 struct cifs_sb_info *cifs_sb;