PageRenderTime 61ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/release/src/linux/linux/fs/smbfs/sock.c

https://gitlab.com/Orvillo/Tomato
C | 935 lines | 725 code | 112 blank | 98 comment | 114 complexity | f843ed13f280505d7120f528d6bc65c1 MD5 | raw file
  1. /*
  2. * sock.c
  3. *
  4. * Copyright (C) 1995, 1996 by Paal-Kr. Engstad and Volker Lendecke
  5. * Copyright (C) 1997 by Volker Lendecke
  6. *
  7. * Please add a note about your changes to smbfs in the ChangeLog file.
  8. */
  9. #include <linux/sched.h>
  10. #include <linux/errno.h>
  11. #include <linux/socket.h>
  12. #include <linux/fcntl.h>
  13. #include <linux/file.h>
  14. #include <linux/poll.h>
  15. #include <linux/in.h>
  16. #include <linux/net.h>
  17. #include <linux/mm.h>
  18. #include <linux/netdevice.h>
  19. #include <linux/smp_lock.h>
  20. #include <net/scm.h>
  21. #include <net/ip.h>
  22. #include <linux/smb_fs.h>
  23. #include <linux/smb.h>
  24. #include <linux/smbno.h>
  25. #include <asm/uaccess.h>
  26. #include "smb_debug.h"
  27. #include "proto.h"
  28. static int
  29. _recvfrom(struct socket *socket, unsigned char *ubuf, int size,
  30. unsigned flags)
  31. {
  32. struct iovec iov;
  33. struct msghdr msg;
  34. struct scm_cookie scm;
  35. msg.msg_name = NULL;
  36. msg.msg_namelen = 0;
  37. msg.msg_iov = &iov;
  38. msg.msg_iovlen = 1;
  39. msg.msg_control = NULL;
  40. iov.iov_base = ubuf;
  41. iov.iov_len = size;
  42. memset(&scm, 0,sizeof(scm));
  43. size=socket->ops->recvmsg(socket, &msg, size, flags, &scm);
  44. if(size>=0)
  45. scm_recv(socket,&msg,&scm,flags);
  46. return size;
  47. }
  48. static int
  49. _send(struct socket *socket, const void *buff, int len)
  50. {
  51. struct iovec iov;
  52. struct msghdr msg;
  53. struct scm_cookie scm;
  54. int err;
  55. msg.msg_name = NULL;
  56. msg.msg_namelen = 0;
  57. msg.msg_iov = &iov;
  58. msg.msg_iovlen = 1;
  59. msg.msg_control = NULL;
  60. msg.msg_controllen = 0;
  61. iov.iov_base = (void *)buff;
  62. iov.iov_len = len;
  63. msg.msg_flags = 0;
  64. err = scm_send(socket, &msg, &scm);
  65. if (err >= 0)
  66. {
  67. err = socket->ops->sendmsg(socket, &msg, len, &scm);
  68. scm_destroy(&scm);
  69. }
  70. return err;
  71. }
  72. struct data_callback {
  73. struct tq_struct cb;
  74. struct sock *sk;
  75. };
  76. /*
  77. * N.B. What happens if we're in here when the socket closes??
  78. */
  79. static void
  80. found_data(struct sock *sk)
  81. {
  82. read_lock(&sk->callback_lock);
  83. if(!sk->dead) {
  84. wake_up_interruptible(sk->sleep);
  85. sock_wake_async(sk->socket,1,POLL_IN);
  86. }
  87. read_unlock(&sk->callback_lock);
  88. }
  89. static void
  90. smb_data_callback(void* ptr)
  91. {
  92. struct data_callback* job=ptr;
  93. struct socket *socket = job->sk->socket;
  94. unsigned char peek_buf[4];
  95. int result = 0;
  96. mm_segment_t fs;
  97. int count = 100; /* this is a lot, we should have some data waiting */
  98. int found = 0;
  99. fs = get_fs();
  100. set_fs(get_ds());
  101. lock_kernel();
  102. while (count-- > 0) {
  103. peek_buf[0] = 0;
  104. result = -EIO;
  105. if (job->sk->dead) {
  106. PARANOIA("sock dead!\n");
  107. break;
  108. }
  109. result = _recvfrom(socket, (void *) peek_buf, 1,
  110. MSG_PEEK | MSG_DONTWAIT);
  111. if (result < 0)
  112. break;
  113. if (peek_buf[0] != 0x85)
  114. break;
  115. /* got SESSION KEEP ALIVE */
  116. result = _recvfrom(socket, (void *) peek_buf, 4,
  117. MSG_DONTWAIT);
  118. DEBUG1("got SESSION KEEPALIVE\n");
  119. if (result < 0)
  120. break;
  121. found = 1;
  122. }
  123. unlock_kernel();
  124. set_fs(fs);
  125. DEBUG1("found=%d, count=%d, result=%d\n", found, count, result);
  126. if (found)
  127. found_data(job->sk);
  128. smb_kfree(ptr);
  129. }
  130. static void
  131. smb_data_ready(struct sock *sk, int len)
  132. {
  133. struct data_callback* job;
  134. job = smb_kmalloc(sizeof(struct data_callback),GFP_ATOMIC);
  135. if(job == 0) {
  136. printk("smb_data_ready: lost SESSION KEEPALIVE due to OOM.\n");
  137. found_data(sk);
  138. return;
  139. }
  140. INIT_LIST_HEAD(&job->cb.list);
  141. job->cb.sync = 0;
  142. job->cb.routine = smb_data_callback;
  143. job->cb.data = job;
  144. job->sk = sk;
  145. schedule_task(&job->cb);
  146. }
  147. int
  148. smb_valid_socket(struct inode * inode)
  149. {
  150. return (inode && S_ISSOCK(inode->i_mode) &&
  151. inode->u.socket_i.type == SOCK_STREAM);
  152. }
  153. static struct socket *
  154. server_sock(struct smb_sb_info *server)
  155. {
  156. struct file *file;
  157. if (server && (file = server->sock_file))
  158. {
  159. #ifdef SMBFS_PARANOIA
  160. if (!smb_valid_socket(file->f_dentry->d_inode))
  161. PARANOIA("bad socket!\n");
  162. #endif
  163. return &file->f_dentry->d_inode->u.socket_i;
  164. }
  165. return NULL;
  166. }
  167. int
  168. smb_catch_keepalive(struct smb_sb_info *server)
  169. {
  170. struct socket *socket;
  171. struct sock *sk;
  172. void *data_ready;
  173. int error;
  174. error = -EINVAL;
  175. socket = server_sock(server);
  176. if (!socket)
  177. {
  178. printk(KERN_DEBUG "smb_catch_keepalive: did not get valid server!\n");
  179. server->data_ready = NULL;
  180. goto out;
  181. }
  182. sk = socket->sk;
  183. if (sk == NULL)
  184. {
  185. DEBUG1("sk == NULL");
  186. server->data_ready = NULL;
  187. goto out;
  188. }
  189. DEBUG1("sk->d_r = %x, server->d_r = %x\n",
  190. (unsigned int) (sk->data_ready),
  191. (unsigned int) (server->data_ready));
  192. /*
  193. * Install the callback atomically to avoid races ...
  194. */
  195. data_ready = xchg(&sk->data_ready, smb_data_ready);
  196. if (data_ready != smb_data_ready) {
  197. server->data_ready = data_ready;
  198. error = 0;
  199. } else
  200. printk(KERN_ERR "smb_catch_keepalive: already done\n");
  201. out:
  202. return error;
  203. }
  204. int
  205. smb_dont_catch_keepalive(struct smb_sb_info *server)
  206. {
  207. struct socket *socket;
  208. struct sock *sk;
  209. void * data_ready;
  210. int error;
  211. error = -EINVAL;
  212. socket = server_sock(server);
  213. if (!socket)
  214. {
  215. printk(KERN_DEBUG "smb_dont_catch_keepalive: did not get valid server!\n");
  216. goto out;
  217. }
  218. sk = socket->sk;
  219. if (sk == NULL)
  220. {
  221. DEBUG1("sk == NULL");
  222. goto out;
  223. }
  224. /* Is this really an error?? */
  225. if (server->data_ready == NULL)
  226. {
  227. printk(KERN_DEBUG "smb_dont_catch_keepalive: "
  228. "server->data_ready == NULL\n");
  229. goto out;
  230. }
  231. DEBUG1("smb_dont_catch_keepalive: sk->d_r = %x, server->d_r = %x\n",
  232. (unsigned int) (sk->data_ready),
  233. (unsigned int) (server->data_ready));
  234. /*
  235. * Restore the original callback atomically to avoid races ...
  236. */
  237. data_ready = xchg(&sk->data_ready, server->data_ready);
  238. server->data_ready = NULL;
  239. if (data_ready != smb_data_ready)
  240. {
  241. printk(KERN_ERR "smb_dont_catch_keepalive: "
  242. "sk->data_ready != smb_data_ready\n");
  243. }
  244. error = 0;
  245. out:
  246. return error;
  247. }
  248. /*
  249. * Called with the server locked.
  250. */
  251. void
  252. smb_close_socket(struct smb_sb_info *server)
  253. {
  254. struct file * file = server->sock_file;
  255. if (file)
  256. {
  257. VERBOSE("closing socket %p\n", server_sock(server));
  258. #ifdef SMBFS_PARANOIA
  259. if (server_sock(server)->sk->data_ready == smb_data_ready)
  260. PARANOIA("still catching keepalives!\n");
  261. #endif
  262. server->sock_file = NULL;
  263. fput(file);
  264. }
  265. }
  266. /*
  267. * Poll the server->socket to allow receives to time out.
  268. * returns 0 when ok to continue, <0 on errors.
  269. */
  270. static int
  271. smb_receive_poll(struct smb_sb_info *server)
  272. {
  273. struct file *file = server->sock_file;
  274. poll_table wait_table;
  275. int result = 0;
  276. int timeout = server->mnt->timeo * HZ;
  277. int mask;
  278. for (;;) {
  279. poll_initwait(&wait_table);
  280. set_current_state(TASK_INTERRUPTIBLE);
  281. mask = file->f_op->poll(file, &wait_table);
  282. if (mask & POLLIN) {
  283. poll_freewait(&wait_table);
  284. current->state = TASK_RUNNING;
  285. break;
  286. }
  287. timeout = schedule_timeout(timeout);
  288. poll_freewait(&wait_table);
  289. set_current_state(TASK_RUNNING);
  290. if (wait_table.error) {
  291. result = wait_table.error;
  292. break;
  293. }
  294. if (signal_pending(current)) {
  295. /* we got a signal (which?) tell the caller to
  296. try again (on all signals?). */
  297. DEBUG1("got signal_pending()\n");
  298. result = -ERESTARTSYS;
  299. break;
  300. }
  301. if (!timeout) {
  302. printk(KERN_WARNING "SMB server not responding\n");
  303. result = -EIO;
  304. break;
  305. }
  306. }
  307. return result;
  308. }
  309. static int
  310. smb_send_raw(struct socket *socket, unsigned char *source, int length)
  311. {
  312. int result;
  313. int already_sent = 0;
  314. while (already_sent < length)
  315. {
  316. result = _send(socket,
  317. (void *) (source + already_sent),
  318. length - already_sent);
  319. if (result == 0)
  320. {
  321. return -EIO;
  322. }
  323. if (result < 0)
  324. {
  325. DEBUG1("smb_send_raw: sendto error = %d\n", -result);
  326. return result;
  327. }
  328. already_sent += result;
  329. }
  330. return already_sent;
  331. }
  332. static int
  333. smb_receive_raw(struct smb_sb_info *server, unsigned char *target, int length)
  334. {
  335. int result;
  336. int already_read = 0;
  337. struct socket *socket = server_sock(server);
  338. while (already_read < length)
  339. {
  340. result = smb_receive_poll(server);
  341. if (result < 0) {
  342. DEBUG1("poll error = %d\n", -result);
  343. return result;
  344. }
  345. result = _recvfrom(socket,
  346. (void *) (target + already_read),
  347. length - already_read, 0);
  348. if (result == 0)
  349. {
  350. return -EIO;
  351. }
  352. if (result < 0)
  353. {
  354. DEBUG1("recvfrom error = %d\n", -result);
  355. return result;
  356. }
  357. already_read += result;
  358. }
  359. return already_read;
  360. }
  361. static int
  362. smb_get_length(struct smb_sb_info *server, unsigned char *header)
  363. {
  364. int result;
  365. unsigned char peek_buf[4];
  366. mm_segment_t fs;
  367. re_recv:
  368. fs = get_fs();
  369. set_fs(get_ds());
  370. result = smb_receive_raw(server, peek_buf, 4);
  371. set_fs(fs);
  372. if (result < 0)
  373. {
  374. PARANOIA("recv error = %d\n", -result);
  375. return result;
  376. }
  377. switch (peek_buf[0])
  378. {
  379. case 0x00:
  380. case 0x82:
  381. break;
  382. case 0x85:
  383. DEBUG1("Got SESSION KEEP ALIVE\n");
  384. goto re_recv;
  385. default:
  386. PARANOIA("Invalid NBT packet, code=%x\n", peek_buf[0]);
  387. return -EIO;
  388. }
  389. if (header != NULL)
  390. {
  391. memcpy(header, peek_buf, 4);
  392. }
  393. /* The length in the RFC NB header is the raw data length */
  394. return smb_len(peek_buf);
  395. }
  396. /*
  397. * Since we allocate memory in increments of PAGE_SIZE,
  398. * round up the packet length to the next multiple.
  399. */
  400. int
  401. smb_round_length(int len)
  402. {
  403. return (len + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1);
  404. }
  405. /*
  406. * smb_receive
  407. * fs points to the correct segment
  408. */
  409. static int
  410. smb_receive(struct smb_sb_info *server)
  411. {
  412. unsigned char * packet = server->packet;
  413. int len, result;
  414. unsigned char peek_buf[4];
  415. result = smb_get_length(server, peek_buf);
  416. if (result < 0)
  417. goto out;
  418. len = result;
  419. /*
  420. * Some servers do not respect our max_xmit and send
  421. * larger packets. Try to allocate a new packet,
  422. * but don't free the old one unless we succeed.
  423. */
  424. if (len + 4 > server->packet_size)
  425. {
  426. int new_len = smb_round_length(len + 4);
  427. result = -ENOMEM;
  428. packet = smb_vmalloc(new_len);
  429. if (packet == NULL)
  430. goto out;
  431. smb_vfree(server->packet);
  432. server->packet = packet;
  433. server->packet_size = new_len;
  434. }
  435. memcpy(packet, peek_buf, 4);
  436. result = smb_receive_raw(server, packet + 4, len);
  437. if (result < 0)
  438. {
  439. VERBOSE("receive error: %d\n", result);
  440. goto out;
  441. }
  442. server->rcls = *(packet + smb_rcls);
  443. server->err = WVAL(packet, smb_err);
  444. #ifdef SMBFS_DEBUG_VERBOSE
  445. if (server->rcls != 0)
  446. VERBOSE("rcls=%d, err=%d\n", server->rcls, server->err);
  447. #endif
  448. out:
  449. return result;
  450. }
  451. /*
  452. * This routine checks first for "fast track" processing, as most
  453. * packets won't need to be copied. Otherwise, it allocates a new
  454. * packet to hold the incoming data.
  455. *
  456. * Note that the final server packet must be the larger of the two;
  457. * server packets aren't allowed to shrink.
  458. */
  459. static int
  460. smb_receive_trans2(struct smb_sb_info *server,
  461. int *ldata, unsigned char **data,
  462. int *lparm, unsigned char **parm)
  463. {
  464. unsigned char *inbuf, *base, *rcv_buf = NULL;
  465. unsigned int parm_disp, parm_offset, parm_count, parm_tot, parm_len = 0;
  466. unsigned int data_disp, data_offset, data_count, data_tot, data_len = 0;
  467. unsigned int total_p = 0, total_d = 0, buf_len = 0;
  468. int result;
  469. while (1) {
  470. result = smb_receive(server);
  471. if (result < 0)
  472. goto out;
  473. inbuf = server->packet;
  474. if (server->rcls != 0) {
  475. *parm = *data = inbuf;
  476. *ldata = *lparm = 0;
  477. goto out;
  478. }
  479. /*
  480. * Extract the control data from the packet.
  481. */
  482. data_tot = WVAL(inbuf, smb_tdrcnt);
  483. parm_tot = WVAL(inbuf, smb_tprcnt);
  484. parm_disp = WVAL(inbuf, smb_prdisp);
  485. parm_offset = WVAL(inbuf, smb_proff);
  486. parm_count = WVAL(inbuf, smb_prcnt);
  487. data_disp = WVAL(inbuf, smb_drdisp);
  488. data_offset = WVAL(inbuf, smb_droff);
  489. data_count = WVAL(inbuf, smb_drcnt);
  490. base = smb_base(inbuf);
  491. /*
  492. * Assume success and increment lengths.
  493. */
  494. parm_len += parm_count;
  495. data_len += data_count;
  496. if (!rcv_buf) {
  497. /*
  498. * Check for fast track processing ... just this packet.
  499. */
  500. if (parm_count == parm_tot && data_count == data_tot) {
  501. VERBOSE("fast track, parm=%u %u %u, data=%u %u %u\n",
  502. parm_disp, parm_offset, parm_count,
  503. data_disp, data_offset, data_count);
  504. *parm = base + parm_offset;
  505. *data = base + data_offset;
  506. goto success;
  507. }
  508. /*
  509. * Save the total parameter and data length.
  510. */
  511. total_d = data_tot;
  512. total_p = parm_tot;
  513. buf_len = total_d + total_p;
  514. if (server->packet_size > buf_len)
  515. buf_len = server->packet_size;
  516. buf_len = smb_round_length(buf_len);
  517. if (buf_len > SMB_MAX_PACKET_SIZE)
  518. goto out_too_long;
  519. rcv_buf = smb_vmalloc(buf_len);
  520. if (!rcv_buf)
  521. goto out_no_mem;
  522. *parm = rcv_buf;
  523. *data = rcv_buf + total_p;
  524. } else if (data_tot > total_d || parm_tot > total_p)
  525. goto out_data_grew;
  526. if (parm_disp + parm_count > total_p)
  527. goto out_bad_parm;
  528. if (data_disp + data_count > total_d)
  529. goto out_bad_data;
  530. memcpy(*parm + parm_disp, base + parm_offset, parm_count);
  531. memcpy(*data + data_disp, base + data_offset, data_count);
  532. PARANOIA("copied, parm=%u of %u, data=%u of %u\n",
  533. parm_len, parm_tot, data_len, data_tot);
  534. /*
  535. * Check whether we've received all of the data. Note that
  536. * we use the packet totals -- total lengths might shrink!
  537. */
  538. if (data_len >= data_tot && parm_len >= parm_tot)
  539. break;
  540. }
  541. /*
  542. * Install the new packet. Note that it's possible, though
  543. * unlikely, that the new packet could be smaller than the
  544. * old one, in which case we just copy the data.
  545. */
  546. inbuf = server->packet;
  547. if (buf_len >= server->packet_size) {
  548. server->packet_size = buf_len;
  549. server->packet = rcv_buf;
  550. rcv_buf = inbuf;
  551. } else {
  552. PARANOIA("copying data, old size=%d, new size=%u\n",
  553. server->packet_size, buf_len);
  554. memcpy(inbuf, rcv_buf, parm_len + data_len);
  555. }
  556. success:
  557. *ldata = data_len;
  558. *lparm = parm_len;
  559. out:
  560. if (rcv_buf)
  561. smb_vfree(rcv_buf);
  562. return result;
  563. out_no_mem:
  564. PARANOIA("couldn't allocate data area\n");
  565. result = -ENOMEM;
  566. goto out;
  567. out_too_long:
  568. printk(KERN_ERR "smb_receive_trans2: data/param too long, data=%d, parm=%d\n",
  569. data_tot, parm_tot);
  570. goto out_error;
  571. out_data_grew:
  572. printk(KERN_ERR "smb_receive_trans2: data/params grew!\n");
  573. goto out_error;
  574. out_bad_parm:
  575. printk(KERN_ERR "smb_receive_trans2: invalid parms, disp=%d, cnt=%d, tot=%d\n",
  576. parm_disp, parm_count, parm_tot);
  577. goto out_error;
  578. out_bad_data:
  579. printk(KERN_ERR "smb_receive_trans2: invalid data, disp=%d, cnt=%d, tot=%d\n",
  580. data_disp, data_count, data_tot);
  581. out_error:
  582. result = -EIO;
  583. goto out;
  584. }
  585. /*
  586. * Called with the server locked
  587. */
  588. int
  589. smb_request(struct smb_sb_info *server)
  590. {
  591. unsigned long flags, sigpipe;
  592. mm_segment_t fs;
  593. sigset_t old_set;
  594. int len, result;
  595. unsigned char *buffer;
  596. result = -EBADF;
  597. buffer = server->packet;
  598. if (!buffer)
  599. goto bad_no_packet;
  600. result = -EIO;
  601. if (server->state != CONN_VALID)
  602. goto bad_no_conn;
  603. if ((result = smb_dont_catch_keepalive(server)) != 0)
  604. goto bad_conn;
  605. len = smb_len(buffer) + 4;
  606. DEBUG1("len = %d cmd = 0x%X\n", len, buffer[8]);
  607. spin_lock_irqsave(&current->sigmask_lock, flags);
  608. sigpipe = sigismember(&current->pending.signal, SIGPIPE);
  609. old_set = current->blocked;
  610. siginitsetinv(&current->blocked, sigmask(SIGKILL)|sigmask(SIGSTOP));
  611. recalc_sigpending(current);
  612. spin_unlock_irqrestore(&current->sigmask_lock, flags);
  613. fs = get_fs();
  614. set_fs(get_ds());
  615. result = smb_send_raw(server_sock(server), (void *) buffer, len);
  616. if (result > 0)
  617. {
  618. result = smb_receive(server);
  619. }
  620. /* read/write errors are handled by errno */
  621. spin_lock_irqsave(&current->sigmask_lock, flags);
  622. if (result == -EPIPE && !sigpipe)
  623. sigdelset(&current->pending.signal, SIGPIPE);
  624. current->blocked = old_set;
  625. recalc_sigpending(current);
  626. spin_unlock_irqrestore(&current->sigmask_lock, flags);
  627. set_fs(fs);
  628. if (result >= 0)
  629. {
  630. int result2 = smb_catch_keepalive(server);
  631. if (result2 < 0)
  632. {
  633. printk(KERN_ERR "smb_request: catch keepalive failed\n");
  634. result = result2;
  635. }
  636. }
  637. if (result < 0)
  638. goto bad_conn;
  639. /*
  640. * Check for fatal server errors ...
  641. */
  642. if (server->rcls) {
  643. int error = smb_errno(server);
  644. if (error == -EBADSLT) {
  645. printk(KERN_ERR "smb_request: tree ID invalid\n");
  646. result = error;
  647. goto bad_conn;
  648. }
  649. }
  650. out:
  651. DEBUG1("result = %d\n", result);
  652. return result;
  653. bad_conn:
  654. PARANOIA("result %d, setting invalid\n", result);
  655. server->state = CONN_INVALID;
  656. smb_invalidate_inodes(server);
  657. goto out;
  658. bad_no_packet:
  659. printk(KERN_ERR "smb_request: no packet!\n");
  660. goto out;
  661. bad_no_conn:
  662. printk(KERN_ERR "smb_request: connection %d not valid!\n",
  663. server->state);
  664. goto out;
  665. }
  666. #define ROUND_UP(x) (((x)+3) & ~3)
  667. static int
  668. smb_send_trans2(struct smb_sb_info *server, __u16 trans2_command,
  669. int ldata, unsigned char *data,
  670. int lparam, unsigned char *param)
  671. {
  672. struct socket *sock = server_sock(server);
  673. struct scm_cookie scm;
  674. int err;
  675. int mparam, mdata;
  676. /* I know the following is very ugly, but I want to build the
  677. smb packet as efficiently as possible. */
  678. const int smb_parameters = 15;
  679. const int oparam =
  680. ROUND_UP(SMB_HEADER_LEN + 2 * smb_parameters + 2 + 3);
  681. const int odata =
  682. ROUND_UP(oparam + lparam);
  683. const int bcc =
  684. odata + ldata - (SMB_HEADER_LEN + 2 * smb_parameters + 2);
  685. const int packet_length =
  686. SMB_HEADER_LEN + 2 * smb_parameters + bcc + 2;
  687. unsigned char padding[4] =
  688. {0,};
  689. char *p;
  690. struct iovec iov[4];
  691. struct msghdr msg;
  692. if ((bcc + oparam) > server->opt.max_xmit)
  693. return -ENOMEM;
  694. p = smb_setup_header(server, SMBtrans2, smb_parameters, bcc);
  695. /*
  696. * max parameters + max data + max setup == max_xmit to make NT4 happy
  697. * and not abort the transfer or split into multiple responses.
  698. *
  699. * -100 is to make room for headers, which OS/2 seems to include in the
  700. * size calculation while NT4 does not?
  701. */
  702. mparam = SMB_TRANS2_MAX_PARAM;
  703. mdata = server->opt.max_xmit - mparam - 100;
  704. if (mdata < 1024) {
  705. mdata = 1024;
  706. mparam = 20;
  707. }
  708. WSET(server->packet, smb_tpscnt, lparam);
  709. WSET(server->packet, smb_tdscnt, ldata);
  710. WSET(server->packet, smb_mprcnt, mparam);
  711. WSET(server->packet, smb_mdrcnt, mdata);
  712. WSET(server->packet, smb_msrcnt, 0); /* max setup always 0 ? */
  713. WSET(server->packet, smb_flags, 0);
  714. DSET(server->packet, smb_timeout, 0);
  715. WSET(server->packet, smb_pscnt, lparam);
  716. WSET(server->packet, smb_psoff, oparam - 4);
  717. WSET(server->packet, smb_dscnt, ldata);
  718. WSET(server->packet, smb_dsoff, odata - 4);
  719. WSET(server->packet, smb_suwcnt, 1);
  720. WSET(server->packet, smb_setup0, trans2_command);
  721. *p++ = 0; /* null smb_name for trans2 */
  722. *p++ = 'D'; /* this was added because OS/2 does it */
  723. *p++ = ' ';
  724. msg.msg_name = NULL;
  725. msg.msg_namelen = 0;
  726. msg.msg_control = NULL;
  727. msg.msg_controllen = 0;
  728. msg.msg_iov = iov;
  729. msg.msg_iovlen = 4;
  730. msg.msg_flags = 0;
  731. iov[0].iov_base = (void *) server->packet;
  732. iov[0].iov_len = oparam;
  733. iov[1].iov_base = (param == NULL) ? padding : param;
  734. iov[1].iov_len = lparam;
  735. iov[2].iov_base = padding;
  736. iov[2].iov_len = odata - oparam - lparam;
  737. iov[3].iov_base = (data == NULL) ? padding : data;
  738. iov[3].iov_len = ldata;
  739. err = scm_send(sock, &msg, &scm);
  740. if (err >= 0) {
  741. err = sock->ops->sendmsg(sock, &msg, packet_length, &scm);
  742. scm_destroy(&scm);
  743. }
  744. return err;
  745. }
  746. /*
  747. * This is not really a trans2 request, we assume that you only have
  748. * one packet to send.
  749. */
  750. int
  751. smb_trans2_request(struct smb_sb_info *server, __u16 trans2_command,
  752. int ldata, unsigned char *data,
  753. int lparam, unsigned char *param,
  754. int *lrdata, unsigned char **rdata,
  755. int *lrparam, unsigned char **rparam)
  756. {
  757. sigset_t old_set;
  758. unsigned long flags, sigpipe;
  759. mm_segment_t fs;
  760. int result;
  761. DEBUG1("com=%d, ld=%d, lp=%d\n", trans2_command, ldata, lparam);
  762. /*
  763. * These are initialized in smb_request_ok, but not here??
  764. */
  765. server->rcls = 0;
  766. server->err = 0;
  767. result = -EIO;
  768. if (server->state != CONN_VALID)
  769. goto out;
  770. if ((result = smb_dont_catch_keepalive(server)) != 0)
  771. goto bad_conn;
  772. spin_lock_irqsave(&current->sigmask_lock, flags);
  773. sigpipe = sigismember(&current->pending.signal, SIGPIPE);
  774. old_set = current->blocked;
  775. siginitsetinv(&current->blocked, sigmask(SIGKILL)|sigmask(SIGSTOP));
  776. recalc_sigpending(current);
  777. spin_unlock_irqrestore(&current->sigmask_lock, flags);
  778. fs = get_fs();
  779. set_fs(get_ds());
  780. result = smb_send_trans2(server, trans2_command,
  781. ldata, data, lparam, param);
  782. if (result >= 0)
  783. {
  784. result = smb_receive_trans2(server,
  785. lrdata, rdata, lrparam, rparam);
  786. }
  787. /* read/write errors are handled by errno */
  788. spin_lock_irqsave(&current->sigmask_lock, flags);
  789. if (result == -EPIPE && !sigpipe)
  790. sigdelset(&current->pending.signal, SIGPIPE);
  791. current->blocked = old_set;
  792. recalc_sigpending(current);
  793. spin_unlock_irqrestore(&current->sigmask_lock, flags);
  794. set_fs(fs);
  795. if (result >= 0)
  796. {
  797. int result2 = smb_catch_keepalive(server);
  798. if (result2 < 0)
  799. {
  800. result = result2;
  801. }
  802. }
  803. if (result < 0)
  804. goto bad_conn;
  805. /*
  806. * Check for fatal server errors ...
  807. */
  808. if (server->rcls) {
  809. int error = smb_errno(server);
  810. if (error == -EBADSLT) {
  811. printk(KERN_ERR "smb_request: tree ID invalid\n");
  812. result = error;
  813. goto bad_conn;
  814. }
  815. }
  816. out:
  817. return result;
  818. bad_conn:
  819. PARANOIA("result=%d, setting invalid\n", result);
  820. server->state = CONN_INVALID;
  821. smb_invalidate_inodes(server);
  822. goto out;
  823. }