zoned.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <linux/vmalloc.h>
  3. #include <linux/bitmap.h>
  4. #include "null_blk.h"
  5. #define CREATE_TRACE_POINTS
  6. #include "trace.h"
  7. #undef pr_fmt
  8. #define pr_fmt(fmt) "null_blk: " fmt
  9. #define NULL_ZONE_INVALID_WP ((sector_t)-1)
  10. static inline sector_t mb_to_sects(unsigned long mb)
  11. {
  12. return ((sector_t)mb * SZ_1M) >> SECTOR_SHIFT;
  13. }
  14. static inline unsigned int null_zone_no(struct nullb_device *dev, sector_t sect)
  15. {
  16. return sect >> ilog2(dev->zone_size_sects);
  17. }
  18. static inline void null_init_zone_lock(struct nullb_device *dev,
  19. struct nullb_zone *zone)
  20. {
  21. if (!dev->memory_backed)
  22. spin_lock_init(&zone->spinlock);
  23. else
  24. mutex_init(&zone->mutex);
  25. }
  26. static inline void null_lock_zone(struct nullb_device *dev,
  27. struct nullb_zone *zone)
  28. {
  29. if (!dev->memory_backed)
  30. spin_lock_irq(&zone->spinlock);
  31. else
  32. mutex_lock(&zone->mutex);
  33. }
  34. static inline void null_unlock_zone(struct nullb_device *dev,
  35. struct nullb_zone *zone)
  36. {
  37. if (!dev->memory_backed)
  38. spin_unlock_irq(&zone->spinlock);
  39. else
  40. mutex_unlock(&zone->mutex);
  41. }
  42. int null_init_zoned_dev(struct nullb_device *dev,
  43. struct queue_limits *lim)
  44. {
  45. sector_t dev_capacity_sects, zone_capacity_sects;
  46. struct nullb_zone *zone;
  47. sector_t sector = 0;
  48. unsigned int i;
  49. if (!is_power_of_2(dev->zone_size)) {
  50. pr_err("zone_size must be power-of-two\n");
  51. return -EINVAL;
  52. }
  53. if (dev->zone_size > dev->size) {
  54. pr_err("Zone size larger than device capacity\n");
  55. return -EINVAL;
  56. }
  57. if (!dev->zone_capacity)
  58. dev->zone_capacity = dev->zone_size;
  59. if (dev->zone_capacity > dev->zone_size) {
  60. pr_err("zone capacity (%lu MB) larger than zone size (%lu MB)\n",
  61. dev->zone_capacity, dev->zone_size);
  62. return -EINVAL;
  63. }
  64. /*
  65. * If a smaller zone capacity was requested, do not allow a smaller last
  66. * zone at the same time as such zone configuration does not correspond
  67. * to any real zoned device.
  68. */
  69. if (dev->zone_capacity != dev->zone_size &&
  70. dev->size & (dev->zone_size - 1)) {
  71. pr_err("A smaller last zone is not allowed with zone capacity smaller than zone size.\n");
  72. return -EINVAL;
  73. }
  74. zone_capacity_sects = mb_to_sects(dev->zone_capacity);
  75. dev_capacity_sects = mb_to_sects(dev->size);
  76. dev->zone_size_sects = mb_to_sects(dev->zone_size);
  77. dev->nr_zones = round_up(dev_capacity_sects, dev->zone_size_sects)
  78. >> ilog2(dev->zone_size_sects);
  79. dev->zones = kvmalloc_array(dev->nr_zones, sizeof(struct nullb_zone),
  80. GFP_KERNEL | __GFP_ZERO);
  81. if (!dev->zones)
  82. return -ENOMEM;
  83. spin_lock_init(&dev->zone_res_lock);
  84. if (dev->zone_nr_conv >= dev->nr_zones) {
  85. dev->zone_nr_conv = dev->nr_zones - 1;
  86. pr_info("changed the number of conventional zones to %u",
  87. dev->zone_nr_conv);
  88. }
  89. dev->zone_append_max_sectors =
  90. min(ALIGN_DOWN(dev->zone_append_max_sectors,
  91. dev->blocksize >> SECTOR_SHIFT),
  92. zone_capacity_sects);
  93. /* Max active zones has to be < nbr of seq zones in order to be enforceable */
  94. if (dev->zone_max_active >= dev->nr_zones - dev->zone_nr_conv) {
  95. dev->zone_max_active = 0;
  96. pr_info("zone_max_active limit disabled, limit >= zone count\n");
  97. }
  98. /* Max open zones has to be <= max active zones */
  99. if (dev->zone_max_active && dev->zone_max_open > dev->zone_max_active) {
  100. dev->zone_max_open = dev->zone_max_active;
  101. pr_info("changed the maximum number of open zones to %u\n",
  102. dev->zone_max_open);
  103. } else if (dev->zone_max_open >= dev->nr_zones - dev->zone_nr_conv) {
  104. dev->zone_max_open = 0;
  105. pr_info("zone_max_open limit disabled, limit >= zone count\n");
  106. }
  107. dev->need_zone_res_mgmt = dev->zone_max_active || dev->zone_max_open;
  108. dev->imp_close_zone_no = dev->zone_nr_conv;
  109. for (i = 0; i < dev->zone_nr_conv; i++) {
  110. zone = &dev->zones[i];
  111. null_init_zone_lock(dev, zone);
  112. zone->start = sector;
  113. zone->len = dev->zone_size_sects;
  114. zone->capacity = zone->len;
  115. zone->wp = zone->start + zone->len;
  116. zone->type = BLK_ZONE_TYPE_CONVENTIONAL;
  117. zone->cond = BLK_ZONE_COND_NOT_WP;
  118. sector += dev->zone_size_sects;
  119. }
  120. for (i = dev->zone_nr_conv; i < dev->nr_zones; i++) {
  121. zone = &dev->zones[i];
  122. null_init_zone_lock(dev, zone);
  123. zone->start = sector;
  124. if (zone->start + dev->zone_size_sects > dev_capacity_sects)
  125. zone->len = dev_capacity_sects - zone->start;
  126. else
  127. zone->len = dev->zone_size_sects;
  128. zone->capacity =
  129. min_t(sector_t, zone->len, zone_capacity_sects);
  130. zone->type = BLK_ZONE_TYPE_SEQWRITE_REQ;
  131. if (dev->zone_full) {
  132. zone->cond = BLK_ZONE_COND_FULL;
  133. zone->wp = zone->start + zone->capacity;
  134. } else{
  135. zone->cond = BLK_ZONE_COND_EMPTY;
  136. zone->wp = zone->start;
  137. }
  138. sector += dev->zone_size_sects;
  139. }
  140. lim->features |= BLK_FEAT_ZONED;
  141. lim->chunk_sectors = dev->zone_size_sects;
  142. lim->max_zone_append_sectors = dev->zone_append_max_sectors;
  143. lim->max_open_zones = dev->zone_max_open;
  144. lim->max_active_zones = dev->zone_max_active;
  145. return 0;
  146. }
  147. int null_register_zoned_dev(struct nullb *nullb)
  148. {
  149. struct request_queue *q = nullb->q;
  150. struct gendisk *disk = nullb->disk;
  151. pr_info("%s: using %s zone append\n",
  152. disk->disk_name,
  153. queue_emulates_zone_append(q) ? "emulated" : "native");
  154. return blk_revalidate_disk_zones(disk);
  155. }
  156. void null_free_zoned_dev(struct nullb_device *dev)
  157. {
  158. kvfree(dev->zones);
  159. dev->zones = NULL;
  160. }
  161. int null_report_zones(struct gendisk *disk, sector_t sector,
  162. unsigned int nr_zones, report_zones_cb cb, void *data)
  163. {
  164. struct nullb *nullb = disk->private_data;
  165. struct nullb_device *dev = nullb->dev;
  166. unsigned int first_zone, i;
  167. struct nullb_zone *zone;
  168. struct blk_zone blkz;
  169. int error;
  170. first_zone = null_zone_no(dev, sector);
  171. if (first_zone >= dev->nr_zones)
  172. return 0;
  173. nr_zones = min(nr_zones, dev->nr_zones - first_zone);
  174. trace_nullb_report_zones(nullb, nr_zones);
  175. memset(&blkz, 0, sizeof(struct blk_zone));
  176. zone = &dev->zones[first_zone];
  177. for (i = 0; i < nr_zones; i++, zone++) {
  178. /*
  179. * Stacked DM target drivers will remap the zone information by
  180. * modifying the zone information passed to the report callback.
  181. * So use a local copy to avoid corruption of the device zone
  182. * array.
  183. */
  184. null_lock_zone(dev, zone);
  185. blkz.start = zone->start;
  186. blkz.len = zone->len;
  187. blkz.wp = zone->wp;
  188. blkz.type = zone->type;
  189. blkz.cond = zone->cond;
  190. blkz.capacity = zone->capacity;
  191. null_unlock_zone(dev, zone);
  192. error = cb(&blkz, i, data);
  193. if (error)
  194. return error;
  195. }
  196. return nr_zones;
  197. }
  198. /*
  199. * This is called in the case of memory backing from null_process_cmd()
  200. * with the target zone already locked.
  201. */
  202. size_t null_zone_valid_read_len(struct nullb *nullb,
  203. sector_t sector, unsigned int len)
  204. {
  205. struct nullb_device *dev = nullb->dev;
  206. struct nullb_zone *zone = &dev->zones[null_zone_no(dev, sector)];
  207. unsigned int nr_sectors = len >> SECTOR_SHIFT;
  208. /* Read must be below the write pointer position */
  209. if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL ||
  210. sector + nr_sectors <= zone->wp)
  211. return len;
  212. if (sector > zone->wp)
  213. return 0;
  214. return (zone->wp - sector) << SECTOR_SHIFT;
  215. }
  216. static void null_close_imp_open_zone(struct nullb_device *dev)
  217. {
  218. struct nullb_zone *zone;
  219. unsigned int zno, i;
  220. zno = dev->imp_close_zone_no;
  221. if (zno >= dev->nr_zones)
  222. zno = dev->zone_nr_conv;
  223. for (i = dev->zone_nr_conv; i < dev->nr_zones; i++) {
  224. zone = &dev->zones[zno];
  225. zno++;
  226. if (zno >= dev->nr_zones)
  227. zno = dev->zone_nr_conv;
  228. if (zone->cond == BLK_ZONE_COND_IMP_OPEN) {
  229. dev->nr_zones_imp_open--;
  230. if (zone->wp == zone->start) {
  231. zone->cond = BLK_ZONE_COND_EMPTY;
  232. } else {
  233. zone->cond = BLK_ZONE_COND_CLOSED;
  234. dev->nr_zones_closed++;
  235. }
  236. dev->imp_close_zone_no = zno;
  237. return;
  238. }
  239. }
  240. }
  241. static blk_status_t null_check_active(struct nullb_device *dev)
  242. {
  243. if (!dev->zone_max_active)
  244. return BLK_STS_OK;
  245. if (dev->nr_zones_exp_open + dev->nr_zones_imp_open +
  246. dev->nr_zones_closed < dev->zone_max_active)
  247. return BLK_STS_OK;
  248. return BLK_STS_ZONE_ACTIVE_RESOURCE;
  249. }
  250. static blk_status_t null_check_open(struct nullb_device *dev)
  251. {
  252. if (!dev->zone_max_open)
  253. return BLK_STS_OK;
  254. if (dev->nr_zones_exp_open + dev->nr_zones_imp_open < dev->zone_max_open)
  255. return BLK_STS_OK;
  256. if (dev->nr_zones_imp_open) {
  257. if (null_check_active(dev) == BLK_STS_OK) {
  258. null_close_imp_open_zone(dev);
  259. return BLK_STS_OK;
  260. }
  261. }
  262. return BLK_STS_ZONE_OPEN_RESOURCE;
  263. }
  264. /*
  265. * This function matches the manage open zone resources function in the ZBC standard,
  266. * with the addition of max active zones support (added in the ZNS standard).
  267. *
  268. * The function determines if a zone can transition to implicit open or explicit open,
  269. * while maintaining the max open zone (and max active zone) limit(s). It may close an
  270. * implicit open zone in order to make additional zone resources available.
  271. *
  272. * ZBC states that an implicit open zone shall be closed only if there is not
  273. * room within the open limit. However, with the addition of an active limit,
  274. * it is not certain that closing an implicit open zone will allow a new zone
  275. * to be opened, since we might already be at the active limit capacity.
  276. */
  277. static blk_status_t null_check_zone_resources(struct nullb_device *dev,
  278. struct nullb_zone *zone)
  279. {
  280. blk_status_t ret;
  281. switch (zone->cond) {
  282. case BLK_ZONE_COND_EMPTY:
  283. ret = null_check_active(dev);
  284. if (ret != BLK_STS_OK)
  285. return ret;
  286. fallthrough;
  287. case BLK_ZONE_COND_CLOSED:
  288. return null_check_open(dev);
  289. default:
  290. /* Should never be called for other states */
  291. WARN_ON(1);
  292. return BLK_STS_IOERR;
  293. }
  294. }
  295. static blk_status_t null_zone_write(struct nullb_cmd *cmd, sector_t sector,
  296. unsigned int nr_sectors, bool append)
  297. {
  298. struct nullb_device *dev = cmd->nq->dev;
  299. unsigned int zno = null_zone_no(dev, sector);
  300. struct nullb_zone *zone = &dev->zones[zno];
  301. blk_status_t ret;
  302. trace_nullb_zone_op(cmd, zno, zone->cond);
  303. if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL) {
  304. if (append)
  305. return BLK_STS_IOERR;
  306. return null_process_cmd(cmd, REQ_OP_WRITE, sector, nr_sectors);
  307. }
  308. null_lock_zone(dev, zone);
  309. /*
  310. * Regular writes must be at the write pointer position. Zone append
  311. * writes are automatically issued at the write pointer and the position
  312. * returned using the request sector. Note that we do not check the zone
  313. * condition because for FULL, READONLY and OFFLINE zones, the sector
  314. * check against the zone write pointer will always result in failing
  315. * the command.
  316. */
  317. if (append) {
  318. if (WARN_ON_ONCE(!dev->zone_append_max_sectors) ||
  319. zone->wp == NULL_ZONE_INVALID_WP) {
  320. ret = BLK_STS_IOERR;
  321. goto unlock_zone;
  322. }
  323. sector = zone->wp;
  324. blk_mq_rq_from_pdu(cmd)->__sector = sector;
  325. }
  326. if (sector != zone->wp ||
  327. zone->wp + nr_sectors > zone->start + zone->capacity) {
  328. ret = BLK_STS_IOERR;
  329. goto unlock_zone;
  330. }
  331. if (zone->cond == BLK_ZONE_COND_CLOSED ||
  332. zone->cond == BLK_ZONE_COND_EMPTY) {
  333. if (dev->need_zone_res_mgmt) {
  334. spin_lock(&dev->zone_res_lock);
  335. ret = null_check_zone_resources(dev, zone);
  336. if (ret != BLK_STS_OK) {
  337. spin_unlock(&dev->zone_res_lock);
  338. goto unlock_zone;
  339. }
  340. if (zone->cond == BLK_ZONE_COND_CLOSED) {
  341. dev->nr_zones_closed--;
  342. dev->nr_zones_imp_open++;
  343. } else if (zone->cond == BLK_ZONE_COND_EMPTY) {
  344. dev->nr_zones_imp_open++;
  345. }
  346. spin_unlock(&dev->zone_res_lock);
  347. }
  348. zone->cond = BLK_ZONE_COND_IMP_OPEN;
  349. }
  350. ret = null_process_cmd(cmd, REQ_OP_WRITE, sector, nr_sectors);
  351. if (ret != BLK_STS_OK)
  352. goto unlock_zone;
  353. zone->wp += nr_sectors;
  354. if (zone->wp == zone->start + zone->capacity) {
  355. if (dev->need_zone_res_mgmt) {
  356. spin_lock(&dev->zone_res_lock);
  357. if (zone->cond == BLK_ZONE_COND_EXP_OPEN)
  358. dev->nr_zones_exp_open--;
  359. else if (zone->cond == BLK_ZONE_COND_IMP_OPEN)
  360. dev->nr_zones_imp_open--;
  361. spin_unlock(&dev->zone_res_lock);
  362. }
  363. zone->cond = BLK_ZONE_COND_FULL;
  364. }
  365. ret = BLK_STS_OK;
  366. unlock_zone:
  367. null_unlock_zone(dev, zone);
  368. return ret;
  369. }
  370. static blk_status_t null_open_zone(struct nullb_device *dev,
  371. struct nullb_zone *zone)
  372. {
  373. blk_status_t ret = BLK_STS_OK;
  374. if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL)
  375. return BLK_STS_IOERR;
  376. switch (zone->cond) {
  377. case BLK_ZONE_COND_EXP_OPEN:
  378. /* Open operation on exp open is not an error */
  379. return BLK_STS_OK;
  380. case BLK_ZONE_COND_EMPTY:
  381. case BLK_ZONE_COND_IMP_OPEN:
  382. case BLK_ZONE_COND_CLOSED:
  383. break;
  384. case BLK_ZONE_COND_FULL:
  385. default:
  386. return BLK_STS_IOERR;
  387. }
  388. if (dev->need_zone_res_mgmt) {
  389. spin_lock(&dev->zone_res_lock);
  390. switch (zone->cond) {
  391. case BLK_ZONE_COND_EMPTY:
  392. ret = null_check_zone_resources(dev, zone);
  393. if (ret != BLK_STS_OK) {
  394. spin_unlock(&dev->zone_res_lock);
  395. return ret;
  396. }
  397. break;
  398. case BLK_ZONE_COND_IMP_OPEN:
  399. dev->nr_zones_imp_open--;
  400. break;
  401. case BLK_ZONE_COND_CLOSED:
  402. ret = null_check_zone_resources(dev, zone);
  403. if (ret != BLK_STS_OK) {
  404. spin_unlock(&dev->zone_res_lock);
  405. return ret;
  406. }
  407. dev->nr_zones_closed--;
  408. break;
  409. default:
  410. break;
  411. }
  412. dev->nr_zones_exp_open++;
  413. spin_unlock(&dev->zone_res_lock);
  414. }
  415. zone->cond = BLK_ZONE_COND_EXP_OPEN;
  416. return BLK_STS_OK;
  417. }
  418. static blk_status_t null_close_zone(struct nullb_device *dev,
  419. struct nullb_zone *zone)
  420. {
  421. if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL)
  422. return BLK_STS_IOERR;
  423. switch (zone->cond) {
  424. case BLK_ZONE_COND_CLOSED:
  425. /* close operation on closed is not an error */
  426. return BLK_STS_OK;
  427. case BLK_ZONE_COND_IMP_OPEN:
  428. case BLK_ZONE_COND_EXP_OPEN:
  429. break;
  430. case BLK_ZONE_COND_EMPTY:
  431. case BLK_ZONE_COND_FULL:
  432. default:
  433. return BLK_STS_IOERR;
  434. }
  435. if (dev->need_zone_res_mgmt) {
  436. spin_lock(&dev->zone_res_lock);
  437. switch (zone->cond) {
  438. case BLK_ZONE_COND_IMP_OPEN:
  439. dev->nr_zones_imp_open--;
  440. break;
  441. case BLK_ZONE_COND_EXP_OPEN:
  442. dev->nr_zones_exp_open--;
  443. break;
  444. default:
  445. break;
  446. }
  447. if (zone->wp > zone->start)
  448. dev->nr_zones_closed++;
  449. spin_unlock(&dev->zone_res_lock);
  450. }
  451. if (zone->wp == zone->start)
  452. zone->cond = BLK_ZONE_COND_EMPTY;
  453. else
  454. zone->cond = BLK_ZONE_COND_CLOSED;
  455. return BLK_STS_OK;
  456. }
  457. static blk_status_t null_finish_zone(struct nullb_device *dev,
  458. struct nullb_zone *zone)
  459. {
  460. blk_status_t ret = BLK_STS_OK;
  461. if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL)
  462. return BLK_STS_IOERR;
  463. if (dev->need_zone_res_mgmt) {
  464. spin_lock(&dev->zone_res_lock);
  465. switch (zone->cond) {
  466. case BLK_ZONE_COND_FULL:
  467. /* Finish operation on full is not an error */
  468. spin_unlock(&dev->zone_res_lock);
  469. return BLK_STS_OK;
  470. case BLK_ZONE_COND_EMPTY:
  471. ret = null_check_zone_resources(dev, zone);
  472. if (ret != BLK_STS_OK) {
  473. spin_unlock(&dev->zone_res_lock);
  474. return ret;
  475. }
  476. break;
  477. case BLK_ZONE_COND_IMP_OPEN:
  478. dev->nr_zones_imp_open--;
  479. break;
  480. case BLK_ZONE_COND_EXP_OPEN:
  481. dev->nr_zones_exp_open--;
  482. break;
  483. case BLK_ZONE_COND_CLOSED:
  484. ret = null_check_zone_resources(dev, zone);
  485. if (ret != BLK_STS_OK) {
  486. spin_unlock(&dev->zone_res_lock);
  487. return ret;
  488. }
  489. dev->nr_zones_closed--;
  490. break;
  491. default:
  492. spin_unlock(&dev->zone_res_lock);
  493. return BLK_STS_IOERR;
  494. }
  495. spin_unlock(&dev->zone_res_lock);
  496. }
  497. zone->cond = BLK_ZONE_COND_FULL;
  498. zone->wp = zone->start + zone->len;
  499. return BLK_STS_OK;
  500. }
  501. static blk_status_t null_reset_zone(struct nullb_device *dev,
  502. struct nullb_zone *zone)
  503. {
  504. if (zone->type == BLK_ZONE_TYPE_CONVENTIONAL)
  505. return BLK_STS_IOERR;
  506. if (dev->need_zone_res_mgmt) {
  507. spin_lock(&dev->zone_res_lock);
  508. switch (zone->cond) {
  509. case BLK_ZONE_COND_IMP_OPEN:
  510. dev->nr_zones_imp_open--;
  511. break;
  512. case BLK_ZONE_COND_EXP_OPEN:
  513. dev->nr_zones_exp_open--;
  514. break;
  515. case BLK_ZONE_COND_CLOSED:
  516. dev->nr_zones_closed--;
  517. break;
  518. case BLK_ZONE_COND_EMPTY:
  519. case BLK_ZONE_COND_FULL:
  520. break;
  521. default:
  522. spin_unlock(&dev->zone_res_lock);
  523. return BLK_STS_IOERR;
  524. }
  525. spin_unlock(&dev->zone_res_lock);
  526. }
  527. zone->cond = BLK_ZONE_COND_EMPTY;
  528. zone->wp = zone->start;
  529. if (dev->memory_backed)
  530. return null_handle_discard(dev, zone->start, zone->len);
  531. return BLK_STS_OK;
  532. }
  533. static blk_status_t null_zone_mgmt(struct nullb_cmd *cmd, enum req_op op,
  534. sector_t sector)
  535. {
  536. struct nullb_device *dev = cmd->nq->dev;
  537. unsigned int zone_no;
  538. struct nullb_zone *zone;
  539. blk_status_t ret;
  540. size_t i;
  541. if (op == REQ_OP_ZONE_RESET_ALL) {
  542. for (i = dev->zone_nr_conv; i < dev->nr_zones; i++) {
  543. zone = &dev->zones[i];
  544. null_lock_zone(dev, zone);
  545. if (zone->cond != BLK_ZONE_COND_EMPTY &&
  546. zone->cond != BLK_ZONE_COND_READONLY &&
  547. zone->cond != BLK_ZONE_COND_OFFLINE) {
  548. null_reset_zone(dev, zone);
  549. trace_nullb_zone_op(cmd, i, zone->cond);
  550. }
  551. null_unlock_zone(dev, zone);
  552. }
  553. return BLK_STS_OK;
  554. }
  555. zone_no = null_zone_no(dev, sector);
  556. zone = &dev->zones[zone_no];
  557. null_lock_zone(dev, zone);
  558. if (zone->cond == BLK_ZONE_COND_READONLY ||
  559. zone->cond == BLK_ZONE_COND_OFFLINE) {
  560. ret = BLK_STS_IOERR;
  561. goto unlock;
  562. }
  563. switch (op) {
  564. case REQ_OP_ZONE_RESET:
  565. ret = null_reset_zone(dev, zone);
  566. break;
  567. case REQ_OP_ZONE_OPEN:
  568. ret = null_open_zone(dev, zone);
  569. break;
  570. case REQ_OP_ZONE_CLOSE:
  571. ret = null_close_zone(dev, zone);
  572. break;
  573. case REQ_OP_ZONE_FINISH:
  574. ret = null_finish_zone(dev, zone);
  575. break;
  576. default:
  577. ret = BLK_STS_NOTSUPP;
  578. break;
  579. }
  580. if (ret == BLK_STS_OK)
  581. trace_nullb_zone_op(cmd, zone_no, zone->cond);
  582. unlock:
  583. null_unlock_zone(dev, zone);
  584. return ret;
  585. }
  586. blk_status_t null_process_zoned_cmd(struct nullb_cmd *cmd, enum req_op op,
  587. sector_t sector, sector_t nr_sectors)
  588. {
  589. struct nullb_device *dev;
  590. struct nullb_zone *zone;
  591. blk_status_t sts;
  592. switch (op) {
  593. case REQ_OP_WRITE:
  594. return null_zone_write(cmd, sector, nr_sectors, false);
  595. case REQ_OP_ZONE_APPEND:
  596. return null_zone_write(cmd, sector, nr_sectors, true);
  597. case REQ_OP_ZONE_RESET:
  598. case REQ_OP_ZONE_RESET_ALL:
  599. case REQ_OP_ZONE_OPEN:
  600. case REQ_OP_ZONE_CLOSE:
  601. case REQ_OP_ZONE_FINISH:
  602. return null_zone_mgmt(cmd, op, sector);
  603. default:
  604. dev = cmd->nq->dev;
  605. zone = &dev->zones[null_zone_no(dev, sector)];
  606. if (zone->cond == BLK_ZONE_COND_OFFLINE)
  607. return BLK_STS_IOERR;
  608. null_lock_zone(dev, zone);
  609. sts = null_process_cmd(cmd, op, sector, nr_sectors);
  610. null_unlock_zone(dev, zone);
  611. return sts;
  612. }
  613. }
  614. /*
  615. * Set a zone in the read-only or offline condition.
  616. */
  617. static void null_set_zone_cond(struct nullb_device *dev,
  618. struct nullb_zone *zone, enum blk_zone_cond cond)
  619. {
  620. if (WARN_ON_ONCE(cond != BLK_ZONE_COND_READONLY &&
  621. cond != BLK_ZONE_COND_OFFLINE))
  622. return;
  623. null_lock_zone(dev, zone);
  624. /*
  625. * If the read-only condition is requested again to zones already in
  626. * read-only condition, restore back normal empty condition. Do the same
  627. * if the offline condition is requested for offline zones. Otherwise,
  628. * set the specified zone condition to the zones. Finish the zones
  629. * beforehand to free up zone resources.
  630. */
  631. if (zone->cond == cond) {
  632. zone->cond = BLK_ZONE_COND_EMPTY;
  633. zone->wp = zone->start;
  634. if (dev->memory_backed)
  635. null_handle_discard(dev, zone->start, zone->len);
  636. } else {
  637. if (zone->cond != BLK_ZONE_COND_READONLY &&
  638. zone->cond != BLK_ZONE_COND_OFFLINE)
  639. null_finish_zone(dev, zone);
  640. zone->cond = cond;
  641. zone->wp = NULL_ZONE_INVALID_WP;
  642. }
  643. null_unlock_zone(dev, zone);
  644. }
  645. /*
  646. * Identify a zone from the sector written to configfs file. Then set zone
  647. * condition to the zone.
  648. */
  649. ssize_t zone_cond_store(struct nullb_device *dev, const char *page,
  650. size_t count, enum blk_zone_cond cond)
  651. {
  652. unsigned long long sector;
  653. unsigned int zone_no;
  654. int ret;
  655. if (!dev->zoned) {
  656. pr_err("null_blk device is not zoned\n");
  657. return -EINVAL;
  658. }
  659. if (!dev->zones) {
  660. pr_err("null_blk device is not yet powered\n");
  661. return -EINVAL;
  662. }
  663. ret = kstrtoull(page, 0, &sector);
  664. if (ret < 0)
  665. return ret;
  666. zone_no = null_zone_no(dev, sector);
  667. if (zone_no >= dev->nr_zones) {
  668. pr_err("Sector out of range\n");
  669. return -EINVAL;
  670. }
  671. if (dev->zones[zone_no].type == BLK_ZONE_TYPE_CONVENTIONAL) {
  672. pr_err("Can not change condition of conventional zones\n");
  673. return -EINVAL;
  674. }
  675. null_set_zone_cond(dev, &dev->zones[zone_no], cond);
  676. return count;
  677. }