qemu-pr-helper.c 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073
  1. /*
  2. * Privileged helper to handle persistent reservation commands for QEMU
  3. *
  4. * Copyright (C) 2017 Red Hat, Inc. <pbonzini@redhat.com>
  5. *
  6. * Author: Paolo Bonzini <pbonzini@redhat.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; under version 2 of the License.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, see <http://www.gnu.org/licenses/>.
  19. */
  20. #include "qemu/osdep.h"
  21. #include <getopt.h>
  22. #include <sys/ioctl.h>
  23. #include <linux/dm-ioctl.h>
  24. #include <scsi/sg.h>
  25. #ifdef CONFIG_LIBCAP
  26. #include <cap-ng.h>
  27. #endif
  28. #include <pwd.h>
  29. #include <grp.h>
  30. #ifdef CONFIG_MPATH
  31. #include <libudev.h>
  32. #include <mpath_cmd.h>
  33. #include <mpath_persist.h>
  34. #endif
  35. #include "qapi/error.h"
  36. #include "qemu-common.h"
  37. #include "qemu/cutils.h"
  38. #include "qemu/main-loop.h"
  39. #include "qemu/error-report.h"
  40. #include "qemu/config-file.h"
  41. #include "qemu/bswap.h"
  42. #include "qemu/log.h"
  43. #include "qemu/systemd.h"
  44. #include "qapi/util.h"
  45. #include "qapi/qmp/qstring.h"
  46. #include "io/channel-socket.h"
  47. #include "trace/control.h"
  48. #include "qemu-version.h"
  49. #include "block/aio.h"
  50. #include "block/thread-pool.h"
  51. #include "scsi/constants.h"
  52. #include "scsi/utils.h"
  53. #include "pr-helper.h"
  54. #define PR_OUT_FIXED_PARAM_SIZE 24
  55. static char *socket_path;
  56. static char *pidfile;
  57. static enum { RUNNING, TERMINATE, TERMINATING } state;
  58. static QIOChannelSocket *server_ioc;
  59. static int server_watch;
  60. static int num_active_sockets = 1;
  61. static int noisy;
  62. static int verbose;
  63. #ifdef CONFIG_LIBCAP
  64. static int uid = -1;
  65. static int gid = -1;
  66. #endif
  67. static void compute_default_paths(void)
  68. {
  69. socket_path = qemu_get_local_state_pathname("run/qemu-pr-helper.sock");
  70. pidfile = qemu_get_local_state_pathname("run/qemu-pr-helper.pid");
  71. }
  72. static void usage(const char *name)
  73. {
  74. (printf) (
  75. "Usage: %s [OPTIONS] FILE\n"
  76. "Persistent Reservation helper program for QEMU\n"
  77. "\n"
  78. " -h, --help display this help and exit\n"
  79. " -V, --version output version information and exit\n"
  80. "\n"
  81. " -d, --daemon run in the background\n"
  82. " -f, --pidfile=PATH PID file when running as a daemon\n"
  83. " (default '%s')\n"
  84. " -k, --socket=PATH path to the unix socket\n"
  85. " (default '%s')\n"
  86. " -T, --trace [[enable=]<pattern>][,events=<file>][,file=<file>]\n"
  87. " specify tracing options\n"
  88. #ifdef CONFIG_LIBCAP
  89. " -u, --user=USER user to drop privileges to\n"
  90. " -g, --group=GROUP group to drop privileges to\n"
  91. #endif
  92. "\n"
  93. QEMU_HELP_BOTTOM "\n"
  94. , name, pidfile, socket_path);
  95. }
  96. static void version(const char *name)
  97. {
  98. printf(
  99. "%s " QEMU_FULL_VERSION "\n"
  100. "Written by Paolo Bonzini.\n"
  101. "\n"
  102. QEMU_COPYRIGHT "\n"
  103. "This is free software; see the source for copying conditions. There is NO\n"
  104. "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
  105. , name);
  106. }
  107. /* SG_IO support */
  108. typedef struct PRHelperSGIOData {
  109. int fd;
  110. const uint8_t *cdb;
  111. uint8_t *sense;
  112. uint8_t *buf;
  113. int sz; /* input/output */
  114. int dir;
  115. } PRHelperSGIOData;
  116. static int do_sgio_worker(void *opaque)
  117. {
  118. PRHelperSGIOData *data = opaque;
  119. struct sg_io_hdr io_hdr;
  120. int ret;
  121. int status;
  122. SCSISense sense_code;
  123. memset(data->sense, 0, PR_HELPER_SENSE_SIZE);
  124. memset(&io_hdr, 0, sizeof(io_hdr));
  125. io_hdr.interface_id = 'S';
  126. io_hdr.cmd_len = PR_HELPER_CDB_SIZE;
  127. io_hdr.cmdp = (uint8_t *)data->cdb;
  128. io_hdr.sbp = data->sense;
  129. io_hdr.mx_sb_len = PR_HELPER_SENSE_SIZE;
  130. io_hdr.timeout = 1;
  131. io_hdr.dxfer_direction = data->dir;
  132. io_hdr.dxferp = (char *)data->buf;
  133. io_hdr.dxfer_len = data->sz;
  134. ret = ioctl(data->fd, SG_IO, &io_hdr);
  135. status = sg_io_sense_from_errno(ret < 0 ? errno : 0, &io_hdr,
  136. &sense_code);
  137. if (status == GOOD) {
  138. data->sz -= io_hdr.resid;
  139. } else {
  140. data->sz = 0;
  141. }
  142. if (status == CHECK_CONDITION &&
  143. !(io_hdr.driver_status & SG_ERR_DRIVER_SENSE)) {
  144. scsi_build_sense(data->sense, sense_code);
  145. }
  146. return status;
  147. }
  148. static int do_sgio(int fd, const uint8_t *cdb, uint8_t *sense,
  149. uint8_t *buf, int *sz, int dir)
  150. {
  151. ThreadPool *pool = aio_get_thread_pool(qemu_get_aio_context());
  152. int r;
  153. PRHelperSGIOData data = {
  154. .fd = fd,
  155. .cdb = cdb,
  156. .sense = sense,
  157. .buf = buf,
  158. .sz = *sz,
  159. .dir = dir,
  160. };
  161. r = thread_pool_submit_co(pool, do_sgio_worker, &data);
  162. *sz = data.sz;
  163. return r;
  164. }
  165. /* Device mapper interface */
  166. #ifdef CONFIG_MPATH
  167. #define CONTROL_PATH "/dev/mapper/control"
  168. typedef struct DMData {
  169. struct dm_ioctl dm;
  170. uint8_t data[1024];
  171. } DMData;
  172. static int control_fd;
  173. static void *dm_ioctl(int ioc, struct dm_ioctl *dm)
  174. {
  175. static DMData d;
  176. memcpy(&d.dm, dm, sizeof(d.dm));
  177. QEMU_BUILD_BUG_ON(sizeof(d.data) < sizeof(struct dm_target_spec));
  178. d.dm.version[0] = DM_VERSION_MAJOR;
  179. d.dm.version[1] = 0;
  180. d.dm.version[2] = 0;
  181. d.dm.data_size = 1024;
  182. d.dm.data_start = offsetof(DMData, data);
  183. if (ioctl(control_fd, ioc, &d) < 0) {
  184. return NULL;
  185. }
  186. memcpy(dm, &d.dm, sizeof(d.dm));
  187. return &d.data;
  188. }
  189. static void *dm_dev_ioctl(int fd, int ioc, struct dm_ioctl *dm)
  190. {
  191. struct stat st;
  192. int r;
  193. r = fstat(fd, &st);
  194. if (r < 0) {
  195. perror("fstat");
  196. exit(1);
  197. }
  198. dm->dev = st.st_rdev;
  199. return dm_ioctl(ioc, dm);
  200. }
  201. static void dm_init(void)
  202. {
  203. control_fd = open(CONTROL_PATH, O_RDWR);
  204. if (control_fd < 0) {
  205. perror("Cannot open " CONTROL_PATH);
  206. exit(1);
  207. }
  208. struct dm_ioctl dm = { 0 };
  209. if (!dm_ioctl(DM_VERSION, &dm)) {
  210. perror("ioctl");
  211. exit(1);
  212. }
  213. if (dm.version[0] != DM_VERSION_MAJOR) {
  214. fprintf(stderr, "Unsupported device mapper interface");
  215. exit(1);
  216. }
  217. }
  218. /* Variables required by libmultipath and libmpathpersist. */
  219. QEMU_BUILD_BUG_ON(PR_HELPER_DATA_SIZE > MPATH_MAX_PARAM_LEN);
  220. static struct config *multipath_conf;
  221. unsigned mpath_mx_alloc_len = PR_HELPER_DATA_SIZE;
  222. int logsink;
  223. struct udev *udev;
  224. extern struct config *get_multipath_config(void);
  225. struct config *get_multipath_config(void)
  226. {
  227. return multipath_conf;
  228. }
  229. extern void put_multipath_config(struct config *conf);
  230. void put_multipath_config(struct config *conf)
  231. {
  232. }
  233. static void multipath_pr_init(void)
  234. {
  235. udev = udev_new();
  236. #ifdef CONFIG_MPATH_NEW_API
  237. multipath_conf = mpath_lib_init();
  238. #else
  239. mpath_lib_init(udev);
  240. #endif
  241. }
  242. static int is_mpath(int fd)
  243. {
  244. struct dm_ioctl dm = { .flags = DM_NOFLUSH_FLAG };
  245. struct dm_target_spec *tgt;
  246. tgt = dm_dev_ioctl(fd, DM_TABLE_STATUS, &dm);
  247. if (!tgt) {
  248. if (errno == ENXIO) {
  249. return 0;
  250. }
  251. perror("ioctl");
  252. exit(EXIT_FAILURE);
  253. }
  254. return !strncmp(tgt->target_type, "multipath", DM_MAX_TYPE_NAME);
  255. }
  256. static SCSISense mpath_generic_sense(int r)
  257. {
  258. switch (r) {
  259. case MPATH_PR_SENSE_NOT_READY:
  260. return SENSE_CODE(NOT_READY);
  261. case MPATH_PR_SENSE_MEDIUM_ERROR:
  262. return SENSE_CODE(READ_ERROR);
  263. case MPATH_PR_SENSE_HARDWARE_ERROR:
  264. return SENSE_CODE(TARGET_FAILURE);
  265. case MPATH_PR_SENSE_ABORTED_COMMAND:
  266. return SENSE_CODE(IO_ERROR);
  267. default:
  268. abort();
  269. }
  270. }
  271. static int mpath_reconstruct_sense(int fd, int r, uint8_t *sense)
  272. {
  273. switch (r) {
  274. case MPATH_PR_SUCCESS:
  275. return GOOD;
  276. case MPATH_PR_SENSE_NOT_READY:
  277. case MPATH_PR_SENSE_MEDIUM_ERROR:
  278. case MPATH_PR_SENSE_HARDWARE_ERROR:
  279. case MPATH_PR_SENSE_ABORTED_COMMAND:
  280. {
  281. /* libmpathpersist ate the exact sense. Try to find it by
  282. * issuing TEST UNIT READY.
  283. */
  284. uint8_t cdb[6] = { TEST_UNIT_READY };
  285. int sz = 0;
  286. int r = do_sgio(fd, cdb, sense, NULL, &sz, SG_DXFER_NONE);
  287. if (r != GOOD) {
  288. return r;
  289. }
  290. scsi_build_sense(sense, mpath_generic_sense(r));
  291. return CHECK_CONDITION;
  292. }
  293. case MPATH_PR_SENSE_UNIT_ATTENTION:
  294. /* Congratulations libmpathpersist, you ruined the Unit Attention...
  295. * Return a heavyweight one.
  296. */
  297. scsi_build_sense(sense, SENSE_CODE(SCSI_BUS_RESET));
  298. return CHECK_CONDITION;
  299. case MPATH_PR_SENSE_INVALID_OP:
  300. /* Only one valid sense. */
  301. scsi_build_sense(sense, SENSE_CODE(INVALID_OPCODE));
  302. return CHECK_CONDITION;
  303. case MPATH_PR_ILLEGAL_REQ:
  304. /* Guess. */
  305. scsi_build_sense(sense, SENSE_CODE(INVALID_PARAM));
  306. return CHECK_CONDITION;
  307. case MPATH_PR_NO_SENSE:
  308. scsi_build_sense(sense, SENSE_CODE(NO_SENSE));
  309. return CHECK_CONDITION;
  310. case MPATH_PR_RESERV_CONFLICT:
  311. return RESERVATION_CONFLICT;
  312. case MPATH_PR_OTHER:
  313. default:
  314. scsi_build_sense(sense, SENSE_CODE(LUN_COMM_FAILURE));
  315. return CHECK_CONDITION;
  316. }
  317. }
  318. static int multipath_pr_in(int fd, const uint8_t *cdb, uint8_t *sense,
  319. uint8_t *data, int sz)
  320. {
  321. int rq_servact = cdb[1];
  322. struct prin_resp resp;
  323. size_t written;
  324. int r;
  325. switch (rq_servact) {
  326. case MPATH_PRIN_RKEY_SA:
  327. case MPATH_PRIN_RRES_SA:
  328. case MPATH_PRIN_RCAP_SA:
  329. break;
  330. case MPATH_PRIN_RFSTAT_SA:
  331. /* Nobody implements it anyway, so bail out. */
  332. default:
  333. /* Cannot parse any other output. */
  334. scsi_build_sense(sense, SENSE_CODE(INVALID_FIELD));
  335. return CHECK_CONDITION;
  336. }
  337. r = mpath_persistent_reserve_in(fd, rq_servact, &resp, noisy, verbose);
  338. if (r == MPATH_PR_SUCCESS) {
  339. switch (rq_servact) {
  340. case MPATH_PRIN_RKEY_SA:
  341. case MPATH_PRIN_RRES_SA: {
  342. struct prin_readdescr *out = &resp.prin_descriptor.prin_readkeys;
  343. assert(sz >= 8);
  344. written = MIN(out->additional_length + 8, sz);
  345. stl_be_p(&data[0], out->prgeneration);
  346. stl_be_p(&data[4], out->additional_length);
  347. memcpy(&data[8], out->key_list, written - 8);
  348. break;
  349. }
  350. case MPATH_PRIN_RCAP_SA: {
  351. struct prin_capdescr *out = &resp.prin_descriptor.prin_readcap;
  352. assert(sz >= 6);
  353. written = 6;
  354. stw_be_p(&data[0], out->length);
  355. data[2] = out->flags[0];
  356. data[3] = out->flags[1];
  357. stw_be_p(&data[4], out->pr_type_mask);
  358. break;
  359. }
  360. default:
  361. scsi_build_sense(sense, SENSE_CODE(INVALID_OPCODE));
  362. return CHECK_CONDITION;
  363. }
  364. assert(written <= sz);
  365. memset(data + written, 0, sz - written);
  366. }
  367. return mpath_reconstruct_sense(fd, r, sense);
  368. }
  369. static int multipath_pr_out(int fd, const uint8_t *cdb, uint8_t *sense,
  370. const uint8_t *param, int sz)
  371. {
  372. int rq_servact = cdb[1];
  373. int rq_scope = cdb[2] >> 4;
  374. int rq_type = cdb[2] & 0xf;
  375. struct prout_param_descriptor paramp;
  376. char transportids[PR_HELPER_DATA_SIZE];
  377. int r;
  378. if (sz < PR_OUT_FIXED_PARAM_SIZE) {
  379. /* Illegal request, Parameter list length error. This isn't fatal;
  380. * we have read the data, send an error without closing the socket.
  381. */
  382. scsi_build_sense(sense, SENSE_CODE(INVALID_PARAM_LEN));
  383. return CHECK_CONDITION;
  384. }
  385. switch (rq_servact) {
  386. case MPATH_PROUT_REG_SA:
  387. case MPATH_PROUT_RES_SA:
  388. case MPATH_PROUT_REL_SA:
  389. case MPATH_PROUT_CLEAR_SA:
  390. case MPATH_PROUT_PREE_SA:
  391. case MPATH_PROUT_PREE_AB_SA:
  392. case MPATH_PROUT_REG_IGN_SA:
  393. break;
  394. case MPATH_PROUT_REG_MOV_SA:
  395. /* Not supported by struct prout_param_descriptor. */
  396. default:
  397. /* Cannot parse any other input. */
  398. scsi_build_sense(sense, SENSE_CODE(INVALID_FIELD));
  399. return CHECK_CONDITION;
  400. }
  401. /* Convert input data, especially transport IDs, to the structs
  402. * used by libmpathpersist (which, of course, will immediately
  403. * do the opposite).
  404. */
  405. memset(&paramp, 0, sizeof(paramp));
  406. memcpy(&paramp.key, &param[0], 8);
  407. memcpy(&paramp.sa_key, &param[8], 8);
  408. paramp.sa_flags = param[20];
  409. if (sz > PR_OUT_FIXED_PARAM_SIZE) {
  410. size_t transportid_len;
  411. int i, j;
  412. if (sz < PR_OUT_FIXED_PARAM_SIZE + 4) {
  413. scsi_build_sense(sense, SENSE_CODE(INVALID_PARAM_LEN));
  414. return CHECK_CONDITION;
  415. }
  416. transportid_len = ldl_be_p(&param[24]) + PR_OUT_FIXED_PARAM_SIZE + 4;
  417. if (transportid_len > sz) {
  418. scsi_build_sense(sense, SENSE_CODE(INVALID_PARAM));
  419. return CHECK_CONDITION;
  420. }
  421. for (i = PR_OUT_FIXED_PARAM_SIZE + 4, j = 0; i < transportid_len; ) {
  422. struct transportid *id = (struct transportid *) &transportids[j];
  423. int len;
  424. id->format_code = param[i] & 0xc0;
  425. id->protocol_id = param[i] & 0x0f;
  426. switch (param[i] & 0xcf) {
  427. case 0:
  428. /* FC transport. */
  429. if (i + 24 > transportid_len) {
  430. goto illegal_req;
  431. }
  432. memcpy(id->n_port_name, &param[i + 8], 8);
  433. j += offsetof(struct transportid, n_port_name[8]);
  434. i += 24;
  435. break;
  436. case 5:
  437. case 0x45:
  438. /* iSCSI transport. */
  439. len = lduw_be_p(&param[i + 2]);
  440. if (len > 252 || (len & 3) || i + len + 4 > transportid_len) {
  441. /* For format code 00, the standard says the maximum is 223
  442. * plus the NUL terminator. For format code 01 there is no
  443. * maximum length, but libmpathpersist ignores the first
  444. * byte of id->iscsi_name so our maximum is 252.
  445. */
  446. goto illegal_req;
  447. }
  448. if (memchr(&param[i + 4], 0, len) == NULL) {
  449. goto illegal_req;
  450. }
  451. memcpy(id->iscsi_name, &param[i + 2], len + 2);
  452. j += offsetof(struct transportid, iscsi_name[len + 2]);
  453. i += len + 4;
  454. break;
  455. case 6:
  456. /* SAS transport. */
  457. if (i + 24 > transportid_len) {
  458. goto illegal_req;
  459. }
  460. memcpy(id->sas_address, &param[i + 4], 8);
  461. j += offsetof(struct transportid, sas_address[8]);
  462. i += 24;
  463. break;
  464. default:
  465. illegal_req:
  466. scsi_build_sense(sense, SENSE_CODE(INVALID_PARAM));
  467. return CHECK_CONDITION;
  468. }
  469. paramp.trnptid_list[paramp.num_transportid++] = id;
  470. }
  471. }
  472. r = mpath_persistent_reserve_out(fd, rq_servact, rq_scope, rq_type,
  473. &paramp, noisy, verbose);
  474. return mpath_reconstruct_sense(fd, r, sense);
  475. }
  476. #endif
  477. static int do_pr_in(int fd, const uint8_t *cdb, uint8_t *sense,
  478. uint8_t *data, int *resp_sz)
  479. {
  480. #ifdef CONFIG_MPATH
  481. if (is_mpath(fd)) {
  482. /* multipath_pr_in fills the whole input buffer. */
  483. int r = multipath_pr_in(fd, cdb, sense, data, *resp_sz);
  484. if (r != GOOD) {
  485. *resp_sz = 0;
  486. }
  487. return r;
  488. }
  489. #endif
  490. return do_sgio(fd, cdb, sense, data, resp_sz,
  491. SG_DXFER_FROM_DEV);
  492. }
  493. static int do_pr_out(int fd, const uint8_t *cdb, uint8_t *sense,
  494. const uint8_t *param, int sz)
  495. {
  496. int resp_sz;
  497. if ((fcntl(fd, F_GETFL) & O_ACCMODE) == O_RDONLY) {
  498. scsi_build_sense(sense, SENSE_CODE(INVALID_OPCODE));
  499. return CHECK_CONDITION;
  500. }
  501. #ifdef CONFIG_MPATH
  502. if (is_mpath(fd)) {
  503. return multipath_pr_out(fd, cdb, sense, param, sz);
  504. }
  505. #endif
  506. resp_sz = sz;
  507. return do_sgio(fd, cdb, sense, (uint8_t *)param, &resp_sz,
  508. SG_DXFER_TO_DEV);
  509. }
  510. /* Client */
  511. typedef struct PRHelperClient {
  512. QIOChannelSocket *ioc;
  513. Coroutine *co;
  514. int fd;
  515. uint8_t data[PR_HELPER_DATA_SIZE];
  516. } PRHelperClient;
  517. typedef struct PRHelperRequest {
  518. int fd;
  519. size_t sz;
  520. uint8_t cdb[PR_HELPER_CDB_SIZE];
  521. } PRHelperRequest;
  522. static int coroutine_fn prh_read(PRHelperClient *client, void *buf, int sz,
  523. Error **errp)
  524. {
  525. int ret = 0;
  526. while (sz > 0) {
  527. int *fds = NULL;
  528. size_t nfds = 0;
  529. int i;
  530. struct iovec iov;
  531. ssize_t n_read;
  532. iov.iov_base = buf;
  533. iov.iov_len = sz;
  534. n_read = qio_channel_readv_full(QIO_CHANNEL(client->ioc), &iov, 1,
  535. &fds, &nfds, errp);
  536. if (n_read == QIO_CHANNEL_ERR_BLOCK) {
  537. qio_channel_yield(QIO_CHANNEL(client->ioc), G_IO_IN);
  538. continue;
  539. }
  540. if (n_read <= 0) {
  541. ret = n_read ? n_read : -1;
  542. goto err;
  543. }
  544. /* Stash one file descriptor per request. */
  545. if (nfds) {
  546. bool too_many = false;
  547. for (i = 0; i < nfds; i++) {
  548. if (client->fd == -1) {
  549. client->fd = fds[i];
  550. } else {
  551. close(fds[i]);
  552. too_many = true;
  553. }
  554. }
  555. g_free(fds);
  556. if (too_many) {
  557. ret = -1;
  558. goto err;
  559. }
  560. }
  561. buf += n_read;
  562. sz -= n_read;
  563. }
  564. return 0;
  565. err:
  566. if (client->fd != -1) {
  567. close(client->fd);
  568. client->fd = -1;
  569. }
  570. return ret;
  571. }
  572. static int coroutine_fn prh_read_request(PRHelperClient *client,
  573. PRHelperRequest *req,
  574. PRHelperResponse *resp, Error **errp)
  575. {
  576. uint32_t sz;
  577. if (prh_read(client, req->cdb, sizeof(req->cdb), NULL) < 0) {
  578. return -1;
  579. }
  580. if (client->fd == -1) {
  581. error_setg(errp, "No file descriptor in request.");
  582. return -1;
  583. }
  584. if (req->cdb[0] != PERSISTENT_RESERVE_OUT &&
  585. req->cdb[0] != PERSISTENT_RESERVE_IN) {
  586. error_setg(errp, "Invalid CDB, closing socket.");
  587. goto out_close;
  588. }
  589. sz = scsi_cdb_xfer(req->cdb);
  590. if (sz > sizeof(client->data)) {
  591. goto out_close;
  592. }
  593. if (req->cdb[0] == PERSISTENT_RESERVE_OUT) {
  594. if (qio_channel_read_all(QIO_CHANNEL(client->ioc),
  595. (char *)client->data, sz,
  596. errp) < 0) {
  597. goto out_close;
  598. }
  599. }
  600. req->fd = client->fd;
  601. req->sz = sz;
  602. client->fd = -1;
  603. return sz;
  604. out_close:
  605. close(client->fd);
  606. client->fd = -1;
  607. return -1;
  608. }
  609. static int coroutine_fn prh_write_response(PRHelperClient *client,
  610. PRHelperRequest *req,
  611. PRHelperResponse *resp, Error **errp)
  612. {
  613. ssize_t r;
  614. size_t sz;
  615. if (req->cdb[0] == PERSISTENT_RESERVE_IN && resp->result == GOOD) {
  616. assert(resp->sz <= req->sz && resp->sz <= sizeof(client->data));
  617. } else {
  618. assert(resp->sz == 0);
  619. }
  620. sz = resp->sz;
  621. resp->result = cpu_to_be32(resp->result);
  622. resp->sz = cpu_to_be32(resp->sz);
  623. r = qio_channel_write_all(QIO_CHANNEL(client->ioc),
  624. (char *) resp, sizeof(*resp), errp);
  625. if (r < 0) {
  626. return r;
  627. }
  628. r = qio_channel_write_all(QIO_CHANNEL(client->ioc),
  629. (char *) client->data,
  630. sz, errp);
  631. return r < 0 ? r : 0;
  632. }
  633. static void coroutine_fn prh_co_entry(void *opaque)
  634. {
  635. PRHelperClient *client = opaque;
  636. Error *local_err = NULL;
  637. uint32_t flags;
  638. int r;
  639. qio_channel_set_blocking(QIO_CHANNEL(client->ioc),
  640. false, NULL);
  641. qio_channel_attach_aio_context(QIO_CHANNEL(client->ioc),
  642. qemu_get_aio_context());
  643. /* A very simple negotiation for future extensibility. No features
  644. * are defined so write 0.
  645. */
  646. flags = cpu_to_be32(0);
  647. r = qio_channel_write_all(QIO_CHANNEL(client->ioc),
  648. (char *) &flags, sizeof(flags), NULL);
  649. if (r < 0) {
  650. goto out;
  651. }
  652. r = qio_channel_read_all(QIO_CHANNEL(client->ioc),
  653. (char *) &flags, sizeof(flags), NULL);
  654. if (be32_to_cpu(flags) != 0 || r < 0) {
  655. goto out;
  656. }
  657. while (atomic_read(&state) == RUNNING) {
  658. PRHelperRequest req;
  659. PRHelperResponse resp;
  660. int sz;
  661. sz = prh_read_request(client, &req, &resp, &local_err);
  662. if (sz < 0) {
  663. break;
  664. }
  665. num_active_sockets++;
  666. if (req.cdb[0] == PERSISTENT_RESERVE_OUT) {
  667. r = do_pr_out(req.fd, req.cdb, resp.sense,
  668. client->data, sz);
  669. resp.sz = 0;
  670. } else {
  671. resp.sz = sizeof(client->data);
  672. r = do_pr_in(req.fd, req.cdb, resp.sense,
  673. client->data, &resp.sz);
  674. resp.sz = MIN(resp.sz, sz);
  675. }
  676. num_active_sockets--;
  677. close(req.fd);
  678. if (r == -1) {
  679. break;
  680. }
  681. resp.result = r;
  682. if (prh_write_response(client, &req, &resp, &local_err) < 0) {
  683. break;
  684. }
  685. }
  686. if (local_err) {
  687. if (verbose == 0) {
  688. error_free(local_err);
  689. } else {
  690. error_report_err(local_err);
  691. }
  692. }
  693. out:
  694. qio_channel_detach_aio_context(QIO_CHANNEL(client->ioc));
  695. object_unref(OBJECT(client->ioc));
  696. g_free(client);
  697. }
  698. static gboolean accept_client(QIOChannel *ioc, GIOCondition cond, gpointer opaque)
  699. {
  700. QIOChannelSocket *cioc;
  701. PRHelperClient *prh;
  702. cioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(ioc),
  703. NULL);
  704. if (!cioc) {
  705. return TRUE;
  706. }
  707. prh = g_new(PRHelperClient, 1);
  708. prh->ioc = cioc;
  709. prh->fd = -1;
  710. prh->co = qemu_coroutine_create(prh_co_entry, prh);
  711. qemu_coroutine_enter(prh->co);
  712. return TRUE;
  713. }
  714. static void termsig_handler(int signum)
  715. {
  716. atomic_cmpxchg(&state, RUNNING, TERMINATE);
  717. qemu_notify_event();
  718. }
  719. static void close_server_socket(void)
  720. {
  721. assert(server_ioc);
  722. g_source_remove(server_watch);
  723. server_watch = -1;
  724. object_unref(OBJECT(server_ioc));
  725. num_active_sockets--;
  726. }
  727. #ifdef CONFIG_LIBCAP
  728. static int drop_privileges(void)
  729. {
  730. /* clear all capabilities */
  731. capng_clear(CAPNG_SELECT_BOTH);
  732. if (capng_update(CAPNG_ADD, CAPNG_EFFECTIVE | CAPNG_PERMITTED,
  733. CAP_SYS_RAWIO) < 0) {
  734. return -1;
  735. }
  736. #ifdef CONFIG_MPATH
  737. /* For /dev/mapper/control ioctls */
  738. if (capng_update(CAPNG_ADD, CAPNG_EFFECTIVE | CAPNG_PERMITTED,
  739. CAP_SYS_ADMIN) < 0) {
  740. return -1;
  741. }
  742. #endif
  743. /* Change user/group id, retaining the capabilities. Because file descriptors
  744. * are passed via SCM_RIGHTS, we don't need supplementary groups (and in
  745. * fact the helper can run as "nobody").
  746. */
  747. if (capng_change_id(uid != -1 ? uid : getuid(),
  748. gid != -1 ? gid : getgid(),
  749. CAPNG_DROP_SUPP_GRP | CAPNG_CLEAR_BOUNDING)) {
  750. return -1;
  751. }
  752. return 0;
  753. }
  754. #endif
  755. int main(int argc, char **argv)
  756. {
  757. const char *sopt = "hVk:f:dT:u:g:vq";
  758. struct option lopt[] = {
  759. { "help", no_argument, NULL, 'h' },
  760. { "version", no_argument, NULL, 'V' },
  761. { "socket", required_argument, NULL, 'k' },
  762. { "pidfile", required_argument, NULL, 'f' },
  763. { "daemon", no_argument, NULL, 'd' },
  764. { "trace", required_argument, NULL, 'T' },
  765. { "user", required_argument, NULL, 'u' },
  766. { "group", required_argument, NULL, 'g' },
  767. { "verbose", no_argument, NULL, 'v' },
  768. { "quiet", no_argument, NULL, 'q' },
  769. { NULL, 0, NULL, 0 }
  770. };
  771. int opt_ind = 0;
  772. int loglevel = 1;
  773. int quiet = 0;
  774. int ch;
  775. Error *local_err = NULL;
  776. char *trace_file = NULL;
  777. bool daemonize = false;
  778. bool pidfile_specified = false;
  779. bool socket_path_specified = false;
  780. unsigned socket_activation;
  781. struct sigaction sa_sigterm;
  782. memset(&sa_sigterm, 0, sizeof(sa_sigterm));
  783. sa_sigterm.sa_handler = termsig_handler;
  784. sigaction(SIGTERM, &sa_sigterm, NULL);
  785. sigaction(SIGINT, &sa_sigterm, NULL);
  786. sigaction(SIGHUP, &sa_sigterm, NULL);
  787. signal(SIGPIPE, SIG_IGN);
  788. module_call_init(MODULE_INIT_TRACE);
  789. module_call_init(MODULE_INIT_QOM);
  790. qemu_add_opts(&qemu_trace_opts);
  791. qemu_init_exec_dir(argv[0]);
  792. compute_default_paths();
  793. while ((ch = getopt_long(argc, argv, sopt, lopt, &opt_ind)) != -1) {
  794. switch (ch) {
  795. case 'k':
  796. g_free(socket_path);
  797. socket_path = g_strdup(optarg);
  798. socket_path_specified = true;
  799. if (socket_path[0] != '/') {
  800. error_report("socket path must be absolute");
  801. exit(EXIT_FAILURE);
  802. }
  803. break;
  804. case 'f':
  805. g_free(pidfile);
  806. pidfile = g_strdup(optarg);
  807. pidfile_specified = true;
  808. break;
  809. #ifdef CONFIG_LIBCAP
  810. case 'u': {
  811. unsigned long res;
  812. struct passwd *userinfo = getpwnam(optarg);
  813. if (userinfo) {
  814. uid = userinfo->pw_uid;
  815. } else if (qemu_strtoul(optarg, NULL, 10, &res) == 0 &&
  816. (uid_t)res == res) {
  817. uid = res;
  818. } else {
  819. error_report("invalid user '%s'", optarg);
  820. exit(EXIT_FAILURE);
  821. }
  822. break;
  823. }
  824. case 'g': {
  825. unsigned long res;
  826. struct group *groupinfo = getgrnam(optarg);
  827. if (groupinfo) {
  828. gid = groupinfo->gr_gid;
  829. } else if (qemu_strtoul(optarg, NULL, 10, &res) == 0 &&
  830. (gid_t)res == res) {
  831. gid = res;
  832. } else {
  833. error_report("invalid group '%s'", optarg);
  834. exit(EXIT_FAILURE);
  835. }
  836. break;
  837. }
  838. #else
  839. case 'u':
  840. case 'g':
  841. error_report("-%c not supported by this %s", ch, argv[0]);
  842. exit(1);
  843. #endif
  844. case 'd':
  845. daemonize = true;
  846. break;
  847. case 'q':
  848. quiet = 1;
  849. break;
  850. case 'v':
  851. ++loglevel;
  852. break;
  853. case 'T':
  854. g_free(trace_file);
  855. trace_file = trace_opt_parse(optarg);
  856. break;
  857. case 'V':
  858. version(argv[0]);
  859. exit(EXIT_SUCCESS);
  860. break;
  861. case 'h':
  862. usage(argv[0]);
  863. exit(EXIT_SUCCESS);
  864. break;
  865. case '?':
  866. error_report("Try `%s --help' for more information.", argv[0]);
  867. exit(EXIT_FAILURE);
  868. }
  869. }
  870. /* set verbosity */
  871. noisy = !quiet && (loglevel >= 3);
  872. verbose = quiet ? 0 : MIN(loglevel, 3);
  873. if (!trace_init_backends()) {
  874. exit(EXIT_FAILURE);
  875. }
  876. trace_init_file(trace_file);
  877. qemu_set_log(LOG_TRACE);
  878. #ifdef CONFIG_MPATH
  879. dm_init();
  880. multipath_pr_init();
  881. #endif
  882. socket_activation = check_socket_activation();
  883. if (socket_activation == 0) {
  884. SocketAddress saddr;
  885. saddr = (SocketAddress){
  886. .type = SOCKET_ADDRESS_TYPE_UNIX,
  887. .u.q_unix.path = socket_path,
  888. };
  889. server_ioc = qio_channel_socket_new();
  890. if (qio_channel_socket_listen_sync(server_ioc, &saddr, &local_err) < 0) {
  891. object_unref(OBJECT(server_ioc));
  892. error_report_err(local_err);
  893. return 1;
  894. }
  895. } else {
  896. /* Using socket activation - check user didn't use -p etc. */
  897. if (socket_path_specified) {
  898. error_report("Unix socket can't be set when using socket activation");
  899. exit(EXIT_FAILURE);
  900. }
  901. /* Can only listen on a single socket. */
  902. if (socket_activation > 1) {
  903. error_report("%s does not support socket activation with LISTEN_FDS > 1",
  904. argv[0]);
  905. exit(EXIT_FAILURE);
  906. }
  907. server_ioc = qio_channel_socket_new_fd(FIRST_SOCKET_ACTIVATION_FD,
  908. &local_err);
  909. if (server_ioc == NULL) {
  910. error_report("Failed to use socket activation: %s",
  911. error_get_pretty(local_err));
  912. exit(EXIT_FAILURE);
  913. }
  914. }
  915. if (qemu_init_main_loop(&local_err)) {
  916. error_report_err(local_err);
  917. exit(EXIT_FAILURE);
  918. }
  919. server_watch = qio_channel_add_watch(QIO_CHANNEL(server_ioc),
  920. G_IO_IN,
  921. accept_client,
  922. NULL, NULL);
  923. if (daemonize) {
  924. if (daemon(0, 0) < 0) {
  925. error_report("Failed to daemonize: %s", strerror(errno));
  926. exit(EXIT_FAILURE);
  927. }
  928. }
  929. if ((daemonize || pidfile_specified) &&
  930. !qemu_write_pidfile(pidfile, &local_err)) {
  931. error_report_err(local_err);
  932. exit(EXIT_FAILURE);
  933. }
  934. #ifdef CONFIG_LIBCAP
  935. if (drop_privileges() < 0) {
  936. error_report("Failed to drop privileges: %s", strerror(errno));
  937. exit(EXIT_FAILURE);
  938. }
  939. #endif
  940. state = RUNNING;
  941. do {
  942. main_loop_wait(false);
  943. if (state == TERMINATE) {
  944. state = TERMINATING;
  945. close_server_socket();
  946. }
  947. } while (num_active_sockets > 0);
  948. exit(EXIT_SUCCESS);
  949. }