diff options
author | Jeff Layton <jlayton@redhat.com> | 2009-02-11 08:08:26 -0500 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2009-02-20 22:37:08 -0500 |
commit | 950ec52880fab89b957c7dc45e8b8476dd63741f (patch) | |
tree | dfb8bd4bdf0e455fefd453c4e899276641a60394 | |
parent | 132ac7b77cc95a22d6118d327c96586759fbf006 (diff) |
cifs: properly handle case where CIFSGetSrvInodeNumber fails
...if it does then we pass a pointer to an unintialized variable for
the inode number to cifs_new_inode. Have it pass a NULL pointer instead.
Also tweak the function prototypes to reduce the amount of casting.
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
-rw-r--r-- | fs/cifs/cifsproto.h | 3 | ||||
-rw-r--r-- | fs/cifs/inode.c | 20 | ||||
-rw-r--r-- | fs/cifs/readdir.c | 6 |
3 files changed, 14 insertions, 15 deletions
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h index 62fd5bd499f6..446e62cbece9 100644 --- a/fs/cifs/cifsproto.h +++ b/fs/cifs/cifsproto.h | |||
@@ -92,8 +92,7 @@ extern u64 cifs_UnixTimeToNT(struct timespec); | |||
92 | extern __le64 cnvrtDosCifsTm(__u16 date, __u16 time); | 92 | extern __le64 cnvrtDosCifsTm(__u16 date, __u16 time); |
93 | extern struct timespec cnvrtDosUnixTm(__u16 date, __u16 time); | 93 | extern struct timespec cnvrtDosUnixTm(__u16 date, __u16 time); |
94 | 94 | ||
95 | extern struct inode *cifs_new_inode(struct super_block *sb, | 95 | extern struct inode *cifs_new_inode(struct super_block *sb, __u64 *inum); |
96 | unsigned long *inum); | ||
97 | extern int cifs_get_inode_info(struct inode **pinode, | 96 | extern int cifs_get_inode_info(struct inode **pinode, |
98 | const unsigned char *search_path, | 97 | const unsigned char *search_path, |
99 | FILE_ALL_INFO *pfile_info, | 98 | FILE_ALL_INFO *pfile_info, |
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index c7674f595adb..475115c7cc79 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
@@ -213,7 +213,7 @@ static void fill_fake_finddataunix(FILE_UNIX_BASIC_INFO *pfnd_dat, | |||
213 | * guaranteed to be unique. | 213 | * guaranteed to be unique. |
214 | */ | 214 | */ |
215 | struct inode * | 215 | struct inode * |
216 | cifs_new_inode(struct super_block *sb, unsigned long *inum) | 216 | cifs_new_inode(struct super_block *sb, __u64 *inum) |
217 | { | 217 | { |
218 | struct inode *inode; | 218 | struct inode *inode; |
219 | 219 | ||
@@ -228,7 +228,7 @@ cifs_new_inode(struct super_block *sb, unsigned long *inum) | |||
228 | * if serverino is disabled, perhaps we should be using iunique()? | 228 | * if serverino is disabled, perhaps we should be using iunique()? |
229 | */ | 229 | */ |
230 | if (inum && (CIFS_SB(sb)->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) | 230 | if (inum && (CIFS_SB(sb)->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) |
231 | inode->i_ino = *inum; | 231 | inode->i_ino = (unsigned long) *inum; |
232 | 232 | ||
233 | /* | 233 | /* |
234 | * must set this here instead of cifs_alloc_inode since VFS will | 234 | * must set this here instead of cifs_alloc_inode since VFS will |
@@ -276,8 +276,7 @@ int cifs_get_inode_info_unix(struct inode **pinode, | |||
276 | 276 | ||
277 | /* get new inode */ | 277 | /* get new inode */ |
278 | if (*pinode == NULL) { | 278 | if (*pinode == NULL) { |
279 | *pinode = cifs_new_inode(sb, (unsigned long *) | 279 | *pinode = cifs_new_inode(sb, &find_data.UniqueId); |
280 | &find_data.UniqueId); | ||
281 | if (*pinode == NULL) { | 280 | if (*pinode == NULL) { |
282 | rc = -ENOMEM; | 281 | rc = -ENOMEM; |
283 | goto cgiiu_exit; | 282 | goto cgiiu_exit; |
@@ -499,6 +498,7 @@ int cifs_get_inode_info(struct inode **pinode, | |||
499 | /* get new inode */ | 498 | /* get new inode */ |
500 | if (*pinode == NULL) { | 499 | if (*pinode == NULL) { |
501 | __u64 inode_num; | 500 | __u64 inode_num; |
501 | __u64 *pinum = &inode_num; | ||
502 | 502 | ||
503 | /* Is an i_ino of zero legal? Can we use that to check | 503 | /* Is an i_ino of zero legal? Can we use that to check |
504 | if the server supports returning inode numbers? Are | 504 | if the server supports returning inode numbers? Are |
@@ -518,20 +518,20 @@ int cifs_get_inode_info(struct inode **pinode, | |||
518 | int rc1 = 0; | 518 | int rc1 = 0; |
519 | 519 | ||
520 | rc1 = CIFSGetSrvInodeNumber(xid, pTcon, | 520 | rc1 = CIFSGetSrvInodeNumber(xid, pTcon, |
521 | full_path, &inode_num, | 521 | full_path, pinum, |
522 | cifs_sb->local_nls, | 522 | cifs_sb->local_nls, |
523 | cifs_sb->mnt_cifs_flags & | 523 | cifs_sb->mnt_cifs_flags & |
524 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 524 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
525 | if (rc1) { | 525 | if (rc1) { |
526 | cFYI(1, ("GetSrvInodeNum rc %d", rc1)); | 526 | cFYI(1, ("GetSrvInodeNum rc %d", rc1)); |
527 | pinum = NULL; | ||
527 | /* BB EOPNOSUPP disable SERVER_INUM? */ | 528 | /* BB EOPNOSUPP disable SERVER_INUM? */ |
528 | } | 529 | } |
529 | *pinode = cifs_new_inode(sb, (unsigned long *) | ||
530 | &inode_num); | ||
531 | } else { | 530 | } else { |
532 | *pinode = cifs_new_inode(sb, NULL); | 531 | pinum = NULL; |
533 | } | 532 | } |
534 | 533 | ||
534 | *pinode = cifs_new_inode(sb, pinum); | ||
535 | if (*pinode == NULL) { | 535 | if (*pinode == NULL) { |
536 | rc = -ENOMEM; | 536 | rc = -ENOMEM; |
537 | goto cgii_exit; | 537 | goto cgii_exit; |
@@ -1148,8 +1148,8 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode) | |||
1148 | else | 1148 | else |
1149 | direntry->d_op = &cifs_dentry_ops; | 1149 | direntry->d_op = &cifs_dentry_ops; |
1150 | 1150 | ||
1151 | newinode = cifs_new_inode(inode->i_sb, (unsigned long *) | 1151 | newinode = cifs_new_inode(inode->i_sb, |
1152 | &pInfo->UniqueId); | 1152 | &pInfo->UniqueId); |
1153 | if (newinode == NULL) { | 1153 | if (newinode == NULL) { |
1154 | kfree(pInfo); | 1154 | kfree(pInfo); |
1155 | goto mkdir_get_info; | 1155 | goto mkdir_get_info; |
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index 02a20221e841..c2c01ff4c32c 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c | |||
@@ -61,7 +61,7 @@ static inline void dump_cifs_file_struct(struct file *file, char *label) | |||
61 | static int | 61 | static int |
62 | construct_dentry(struct qstr *qstring, struct file *file, | 62 | construct_dentry(struct qstr *qstring, struct file *file, |
63 | struct inode **ptmp_inode, struct dentry **pnew_dentry, | 63 | struct inode **ptmp_inode, struct dentry **pnew_dentry, |
64 | unsigned long *inum) | 64 | __u64 *inum) |
65 | { | 65 | { |
66 | struct dentry *tmp_dentry = NULL; | 66 | struct dentry *tmp_dentry = NULL; |
67 | struct super_block *sb = file->f_path.dentry->d_sb; | 67 | struct super_block *sb = file->f_path.dentry->d_sb; |
@@ -820,7 +820,7 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon, | |||
820 | /* inode num, inode type and filename returned */ | 820 | /* inode num, inode type and filename returned */ |
821 | static int cifs_get_name_from_search_buf(struct qstr *pqst, | 821 | static int cifs_get_name_from_search_buf(struct qstr *pqst, |
822 | char *current_entry, __u16 level, unsigned int unicode, | 822 | char *current_entry, __u16 level, unsigned int unicode, |
823 | struct cifs_sb_info *cifs_sb, int max_len, ino_t *pinum) | 823 | struct cifs_sb_info *cifs_sb, int max_len, __u64 *pinum) |
824 | { | 824 | { |
825 | int rc = 0; | 825 | int rc = 0; |
826 | unsigned int len = 0; | 826 | unsigned int len = 0; |
@@ -903,7 +903,7 @@ static int cifs_filldir(char *pfindEntry, struct file *file, | |||
903 | struct qstr qstring; | 903 | struct qstr qstring; |
904 | struct cifsFileInfo *pCifsF; | 904 | struct cifsFileInfo *pCifsF; |
905 | unsigned int obj_type; | 905 | unsigned int obj_type; |
906 | ino_t inum; | 906 | __u64 inum; |
907 | struct cifs_sb_info *cifs_sb; | 907 | struct cifs_sb_info *cifs_sb; |
908 | struct inode *tmp_inode; | 908 | struct inode *tmp_inode; |
909 | struct dentry *tmp_dentry; | 909 | struct dentry *tmp_dentry; |