aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs
diff options
context:
space:
mode:
Diffstat (limited to 'fs/cifs')
-rw-r--r--fs/cifs/cifsglob.h5
-rw-r--r--fs/cifs/cifsproto.h7
-rw-r--r--fs/cifs/link.c37
-rw-r--r--fs/cifs/smb1ops.c2
4 files changed, 20 insertions, 31 deletions
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
index f918a998a087..fba4d1341f88 100644
--- a/fs/cifs/cifsglob.h
+++ b/fs/cifs/cifsglob.h
@@ -370,8 +370,9 @@ struct smb_version_operations {
370 void (*new_lease_key)(struct cifs_fid *); 370 void (*new_lease_key)(struct cifs_fid *);
371 int (*generate_signingkey)(struct cifs_ses *); 371 int (*generate_signingkey)(struct cifs_ses *);
372 int (*calc_signature)(struct smb_rqst *, struct TCP_Server_Info *); 372 int (*calc_signature)(struct smb_rqst *, struct TCP_Server_Info *);
373 int (*query_mf_symlink)(const unsigned char *, char *, unsigned int *, 373 int (*query_mf_symlink)(unsigned int, struct cifs_tcon *,
374 struct cifs_sb_info *, unsigned int); 374 struct cifs_sb_info *, const unsigned char *,
375 char *, unsigned int *);
375 /* if we can do cache read operations */ 376 /* if we can do cache read operations */
376 bool (*is_read_op)(__u32); 377 bool (*is_read_op)(__u32);
377 /* set oplock level for the inode */ 378 /* set oplock level for the inode */
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
index 2c29db6a247e..10b9ab1d1ae9 100644
--- a/fs/cifs/cifsproto.h
+++ b/fs/cifs/cifsproto.h
@@ -496,7 +496,8 @@ void cifs_writev_complete(struct work_struct *work);
496struct cifs_writedata *cifs_writedata_alloc(unsigned int nr_pages, 496struct cifs_writedata *cifs_writedata_alloc(unsigned int nr_pages,
497 work_func_t complete); 497 work_func_t complete);
498void cifs_writedata_release(struct kref *refcount); 498void cifs_writedata_release(struct kref *refcount);
499int open_query_close_cifs_symlink(const unsigned char *path, char *pbuf, 499int cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
500 unsigned int *pbytes_read, struct cifs_sb_info *cifs_sb, 500 struct cifs_sb_info *cifs_sb,
501 unsigned int xid); 501 const unsigned char *path, char *pbuf,
502 unsigned int *pbytes_read);
502#endif /* _CIFSPROTO_H */ 503#endif /* _CIFSPROTO_H */
diff --git a/fs/cifs/link.c b/fs/cifs/link.c
index 28bc8ee97056..c8e29682ccdb 100644
--- a/fs/cifs/link.c
+++ b/fs/cifs/link.c
@@ -305,54 +305,41 @@ CIFSCouldBeMFSymlink(const struct cifs_fattr *fattr)
305} 305}
306 306
307int 307int
308open_query_close_cifs_symlink(const unsigned char *path, char *pbuf, 308cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
309 unsigned int *pbytes_read, struct cifs_sb_info *cifs_sb, 309 struct cifs_sb_info *cifs_sb, const unsigned char *path,
310 unsigned int xid) 310 char *pbuf, unsigned int *pbytes_read)
311{ 311{
312 int rc; 312 int rc;
313 int oplock = 0; 313 int oplock = 0;
314 __u16 netfid = 0; 314 __u16 netfid = 0;
315 struct tcon_link *tlink;
316 struct cifs_tcon *ptcon;
317 struct cifs_io_parms io_parms; 315 struct cifs_io_parms io_parms;
318 int buf_type = CIFS_NO_BUFFER; 316 int buf_type = CIFS_NO_BUFFER;
319 FILE_ALL_INFO file_info; 317 FILE_ALL_INFO file_info;
320 318
321 tlink = cifs_sb_tlink(cifs_sb); 319 rc = CIFSSMBOpen(xid, tcon, path, FILE_OPEN, GENERIC_READ,
322 if (IS_ERR(tlink))
323 return PTR_ERR(tlink);
324 ptcon = tlink_tcon(tlink);
325
326 rc = CIFSSMBOpen(xid, ptcon, path, FILE_OPEN, GENERIC_READ,
327 CREATE_NOT_DIR, &netfid, &oplock, &file_info, 320 CREATE_NOT_DIR, &netfid, &oplock, &file_info,
328 cifs_sb->local_nls, 321 cifs_sb->local_nls,
329 cifs_sb->mnt_cifs_flags & 322 cifs_sb->mnt_cifs_flags &
330 CIFS_MOUNT_MAP_SPECIAL_CHR); 323 CIFS_MOUNT_MAP_SPECIAL_CHR);
331 if (rc != 0) { 324 if (rc)
332 cifs_put_tlink(tlink);
333 return rc; 325 return rc;
334 }
335 326
336 if (file_info.EndOfFile != cpu_to_le64(CIFS_MF_SYMLINK_FILE_SIZE)) { 327 if (file_info.EndOfFile != cpu_to_le64(CIFS_MF_SYMLINK_FILE_SIZE))
337 CIFSSMBClose(xid, ptcon, netfid);
338 cifs_put_tlink(tlink);
339 /* it's not a symlink */ 328 /* it's not a symlink */
340 return rc; 329 goto out;
341 }
342 330
343 io_parms.netfid = netfid; 331 io_parms.netfid = netfid;
344 io_parms.pid = current->tgid; 332 io_parms.pid = current->tgid;
345 io_parms.tcon = ptcon; 333 io_parms.tcon = tcon;
346 io_parms.offset = 0; 334 io_parms.offset = 0;
347 io_parms.length = CIFS_MF_SYMLINK_FILE_SIZE; 335 io_parms.length = CIFS_MF_SYMLINK_FILE_SIZE;
348 336
349 rc = CIFSSMBRead(xid, &io_parms, pbytes_read, &pbuf, &buf_type); 337 rc = CIFSSMBRead(xid, &io_parms, pbytes_read, &pbuf, &buf_type);
350 CIFSSMBClose(xid, ptcon, netfid); 338out:
351 cifs_put_tlink(tlink); 339 CIFSSMBClose(xid, tcon, netfid);
352 return rc; 340 return rc;
353} 341}
354 342
355
356int 343int
357CIFSCheckMFSymlink(unsigned int xid, struct cifs_tcon *tcon, 344CIFSCheckMFSymlink(unsigned int xid, struct cifs_tcon *tcon,
358 struct cifs_sb_info *cifs_sb, struct cifs_fattr *fattr, 345 struct cifs_sb_info *cifs_sb, struct cifs_fattr *fattr,
@@ -372,8 +359,8 @@ CIFSCheckMFSymlink(unsigned int xid, struct cifs_tcon *tcon,
372 return -ENOMEM; 359 return -ENOMEM;
373 360
374 if (tcon->ses->server->ops->query_mf_symlink) 361 if (tcon->ses->server->ops->query_mf_symlink)
375 rc = tcon->ses->server->ops->query_mf_symlink(path, buf, 362 rc = tcon->ses->server->ops->query_mf_symlink(xid, tcon,
376 &bytes_read, cifs_sb, xid); 363 cifs_sb, path, buf, &bytes_read);
377 else 364 else
378 rc = -ENOSYS; 365 rc = -ENOSYS;
379 366
diff --git a/fs/cifs/smb1ops.c b/fs/cifs/smb1ops.c
index 5f5ba0dc2ee1..099c27602257 100644
--- a/fs/cifs/smb1ops.c
+++ b/fs/cifs/smb1ops.c
@@ -1009,7 +1009,7 @@ struct smb_version_operations smb1_operations = {
1009 .mand_lock = cifs_mand_lock, 1009 .mand_lock = cifs_mand_lock,
1010 .mand_unlock_range = cifs_unlock_range, 1010 .mand_unlock_range = cifs_unlock_range,
1011 .push_mand_locks = cifs_push_mandatory_locks, 1011 .push_mand_locks = cifs_push_mandatory_locks,
1012 .query_mf_symlink = open_query_close_cifs_symlink, 1012 .query_mf_symlink = cifs_query_mf_symlink,
1013 .is_read_op = cifs_is_read_op, 1013 .is_read_op = cifs_is_read_op,
1014}; 1014};
1015 1015