disk-events.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Disk events - monitor disk events like media change and eject request.
  4. */
  5. #include <linux/export.h>
  6. #include <linux/moduleparam.h>
  7. #include <linux/blkdev.h>
  8. #include "blk.h"
  9. struct disk_events {
  10. struct list_head node; /* all disk_event's */
  11. struct gendisk *disk; /* the associated disk */
  12. spinlock_t lock;
  13. struct mutex block_mutex; /* protects blocking */
  14. int block; /* event blocking depth */
  15. unsigned int pending; /* events already sent out */
  16. unsigned int clearing; /* events being cleared */
  17. long poll_msecs; /* interval, -1 for default */
  18. struct delayed_work dwork;
  19. };
  20. static const char *disk_events_strs[] = {
  21. [ilog2(DISK_EVENT_MEDIA_CHANGE)] = "media_change",
  22. [ilog2(DISK_EVENT_EJECT_REQUEST)] = "eject_request",
  23. };
  24. static char *disk_uevents[] = {
  25. [ilog2(DISK_EVENT_MEDIA_CHANGE)] = "DISK_MEDIA_CHANGE=1",
  26. [ilog2(DISK_EVENT_EJECT_REQUEST)] = "DISK_EJECT_REQUEST=1",
  27. };
  28. /* list of all disk_events */
  29. static DEFINE_MUTEX(disk_events_mutex);
  30. static LIST_HEAD(disk_events);
  31. /* disable in-kernel polling by default */
  32. static unsigned long disk_events_dfl_poll_msecs;
  33. static unsigned long disk_events_poll_jiffies(struct gendisk *disk)
  34. {
  35. struct disk_events *ev = disk->ev;
  36. long intv_msecs = 0;
  37. /*
  38. * If device-specific poll interval is set, always use it. If
  39. * the default is being used, poll if the POLL flag is set.
  40. */
  41. if (ev->poll_msecs >= 0)
  42. intv_msecs = ev->poll_msecs;
  43. else if (disk->event_flags & DISK_EVENT_FLAG_POLL)
  44. intv_msecs = disk_events_dfl_poll_msecs;
  45. return msecs_to_jiffies(intv_msecs);
  46. }
  47. /**
  48. * disk_block_events - block and flush disk event checking
  49. * @disk: disk to block events for
  50. *
  51. * On return from this function, it is guaranteed that event checking
  52. * isn't in progress and won't happen until unblocked by
  53. * disk_unblock_events(). Events blocking is counted and the actual
  54. * unblocking happens after the matching number of unblocks are done.
  55. *
  56. * Note that this intentionally does not block event checking from
  57. * disk_clear_events().
  58. *
  59. * CONTEXT:
  60. * Might sleep.
  61. */
  62. void disk_block_events(struct gendisk *disk)
  63. {
  64. struct disk_events *ev = disk->ev;
  65. unsigned long flags;
  66. bool cancel;
  67. if (!ev)
  68. return;
  69. /*
  70. * Outer mutex ensures that the first blocker completes canceling
  71. * the event work before further blockers are allowed to finish.
  72. */
  73. mutex_lock(&ev->block_mutex);
  74. spin_lock_irqsave(&ev->lock, flags);
  75. cancel = !ev->block++;
  76. spin_unlock_irqrestore(&ev->lock, flags);
  77. if (cancel)
  78. cancel_delayed_work_sync(&disk->ev->dwork);
  79. mutex_unlock(&ev->block_mutex);
  80. }
  81. static void __disk_unblock_events(struct gendisk *disk, bool check_now)
  82. {
  83. struct disk_events *ev = disk->ev;
  84. unsigned long intv;
  85. unsigned long flags;
  86. spin_lock_irqsave(&ev->lock, flags);
  87. if (WARN_ON_ONCE(ev->block <= 0))
  88. goto out_unlock;
  89. if (--ev->block)
  90. goto out_unlock;
  91. intv = disk_events_poll_jiffies(disk);
  92. if (check_now)
  93. queue_delayed_work(system_freezable_power_efficient_wq,
  94. &ev->dwork, 0);
  95. else if (intv)
  96. queue_delayed_work(system_freezable_power_efficient_wq,
  97. &ev->dwork, intv);
  98. out_unlock:
  99. spin_unlock_irqrestore(&ev->lock, flags);
  100. }
  101. /**
  102. * disk_unblock_events - unblock disk event checking
  103. * @disk: disk to unblock events for
  104. *
  105. * Undo disk_block_events(). When the block count reaches zero, it
  106. * starts events polling if configured.
  107. *
  108. * CONTEXT:
  109. * Don't care. Safe to call from irq context.
  110. */
  111. void disk_unblock_events(struct gendisk *disk)
  112. {
  113. if (disk->ev)
  114. __disk_unblock_events(disk, false);
  115. }
  116. /**
  117. * disk_flush_events - schedule immediate event checking and flushing
  118. * @disk: disk to check and flush events for
  119. * @mask: events to flush
  120. *
  121. * Schedule immediate event checking on @disk if not blocked. Events in
  122. * @mask are scheduled to be cleared from the driver. Note that this
  123. * doesn't clear the events from @disk->ev.
  124. *
  125. * CONTEXT:
  126. * If @mask is non-zero must be called with disk->open_mutex held.
  127. */
  128. void disk_flush_events(struct gendisk *disk, unsigned int mask)
  129. {
  130. struct disk_events *ev = disk->ev;
  131. if (!ev)
  132. return;
  133. spin_lock_irq(&ev->lock);
  134. ev->clearing |= mask;
  135. if (!ev->block)
  136. mod_delayed_work(system_freezable_power_efficient_wq,
  137. &ev->dwork, 0);
  138. spin_unlock_irq(&ev->lock);
  139. }
  140. /*
  141. * Tell userland about new events. Only the events listed in @disk->events are
  142. * reported, and only if DISK_EVENT_FLAG_UEVENT is set. Otherwise, events are
  143. * processed internally but never get reported to userland.
  144. */
  145. static void disk_event_uevent(struct gendisk *disk, unsigned int events)
  146. {
  147. char *envp[ARRAY_SIZE(disk_uevents) + 1] = { };
  148. int nr_events = 0, i;
  149. for (i = 0; i < ARRAY_SIZE(disk_uevents); i++)
  150. if (events & disk->events & (1 << i))
  151. envp[nr_events++] = disk_uevents[i];
  152. if (nr_events)
  153. kobject_uevent_env(&disk_to_dev(disk)->kobj, KOBJ_CHANGE, envp);
  154. }
  155. static void disk_check_events(struct disk_events *ev,
  156. unsigned int *clearing_ptr)
  157. {
  158. struct gendisk *disk = ev->disk;
  159. unsigned int clearing = *clearing_ptr;
  160. unsigned int events;
  161. unsigned long intv;
  162. /* check events */
  163. events = disk->fops->check_events(disk, clearing);
  164. /* accumulate pending events and schedule next poll if necessary */
  165. spin_lock_irq(&ev->lock);
  166. events &= ~ev->pending;
  167. ev->pending |= events;
  168. *clearing_ptr &= ~clearing;
  169. intv = disk_events_poll_jiffies(disk);
  170. if (!ev->block && intv)
  171. queue_delayed_work(system_freezable_power_efficient_wq,
  172. &ev->dwork, intv);
  173. spin_unlock_irq(&ev->lock);
  174. if (events & DISK_EVENT_MEDIA_CHANGE)
  175. inc_diskseq(disk);
  176. if (disk->event_flags & DISK_EVENT_FLAG_UEVENT)
  177. disk_event_uevent(disk, events);
  178. }
  179. /**
  180. * disk_clear_events - synchronously check, clear and return pending events
  181. * @disk: disk to fetch and clear events from
  182. * @mask: mask of events to be fetched and cleared
  183. *
  184. * Disk events are synchronously checked and pending events in @mask
  185. * are cleared and returned. This ignores the block count.
  186. *
  187. * CONTEXT:
  188. * Might sleep.
  189. */
  190. static unsigned int disk_clear_events(struct gendisk *disk, unsigned int mask)
  191. {
  192. struct disk_events *ev = disk->ev;
  193. unsigned int pending;
  194. unsigned int clearing = mask;
  195. if (!ev)
  196. return 0;
  197. disk_block_events(disk);
  198. /*
  199. * store the union of mask and ev->clearing on the stack so that the
  200. * race with disk_flush_events does not cause ambiguity (ev->clearing
  201. * can still be modified even if events are blocked).
  202. */
  203. spin_lock_irq(&ev->lock);
  204. clearing |= ev->clearing;
  205. ev->clearing = 0;
  206. spin_unlock_irq(&ev->lock);
  207. disk_check_events(ev, &clearing);
  208. /*
  209. * if ev->clearing is not 0, the disk_flush_events got called in the
  210. * middle of this function, so we want to run the workfn without delay.
  211. */
  212. __disk_unblock_events(disk, ev->clearing ? true : false);
  213. /* then, fetch and clear pending events */
  214. spin_lock_irq(&ev->lock);
  215. pending = ev->pending & mask;
  216. ev->pending &= ~mask;
  217. spin_unlock_irq(&ev->lock);
  218. WARN_ON_ONCE(clearing & mask);
  219. return pending;
  220. }
  221. /**
  222. * bdev_check_media_change - check if a removable media has been changed
  223. * @bdev: block device to check
  224. *
  225. * Check whether a removable media has been changed, and attempt to free all
  226. * dentries and inodes and invalidates all block device page cache entries in
  227. * that case.
  228. *
  229. * Returns %true if the block device changed, or %false if not.
  230. */
  231. bool bdev_check_media_change(struct block_device *bdev)
  232. {
  233. unsigned int events;
  234. events = disk_clear_events(bdev->bd_disk, DISK_EVENT_MEDIA_CHANGE |
  235. DISK_EVENT_EJECT_REQUEST);
  236. if (!(events & DISK_EVENT_MEDIA_CHANGE))
  237. return false;
  238. if (__invalidate_device(bdev, true))
  239. pr_warn("VFS: busy inodes on changed media %s\n",
  240. bdev->bd_disk->disk_name);
  241. set_bit(GD_NEED_PART_SCAN, &bdev->bd_disk->state);
  242. return true;
  243. }
  244. EXPORT_SYMBOL(bdev_check_media_change);
  245. /**
  246. * disk_force_media_change - force a media change event
  247. * @disk: the disk which will raise the event
  248. * @events: the events to raise
  249. *
  250. * Generate uevents for the disk. If DISK_EVENT_MEDIA_CHANGE is present,
  251. * attempt to free all dentries and inodes and invalidates all block
  252. * device page cache entries in that case.
  253. *
  254. * Returns %true if DISK_EVENT_MEDIA_CHANGE was raised, or %false if not.
  255. */
  256. bool disk_force_media_change(struct gendisk *disk, unsigned int events)
  257. {
  258. disk_event_uevent(disk, events);
  259. if (!(events & DISK_EVENT_MEDIA_CHANGE))
  260. return false;
  261. inc_diskseq(disk);
  262. if (__invalidate_device(disk->part0, true))
  263. pr_warn("VFS: busy inodes on changed media %s\n",
  264. disk->disk_name);
  265. set_bit(GD_NEED_PART_SCAN, &disk->state);
  266. return true;
  267. }
  268. EXPORT_SYMBOL_GPL(disk_force_media_change);
  269. /*
  270. * Separate this part out so that a different pointer for clearing_ptr can be
  271. * passed in for disk_clear_events.
  272. */
  273. static void disk_events_workfn(struct work_struct *work)
  274. {
  275. struct delayed_work *dwork = to_delayed_work(work);
  276. struct disk_events *ev = container_of(dwork, struct disk_events, dwork);
  277. disk_check_events(ev, &ev->clearing);
  278. }
  279. /*
  280. * A disk events enabled device has the following sysfs nodes under
  281. * its /sys/block/X/ directory.
  282. *
  283. * events : list of all supported events
  284. * events_async : list of events which can be detected w/o polling
  285. * (always empty, only for backwards compatibility)
  286. * events_poll_msecs : polling interval, 0: disable, -1: system default
  287. */
  288. static ssize_t __disk_events_show(unsigned int events, char *buf)
  289. {
  290. const char *delim = "";
  291. ssize_t pos = 0;
  292. int i;
  293. for (i = 0; i < ARRAY_SIZE(disk_events_strs); i++)
  294. if (events & (1 << i)) {
  295. pos += sprintf(buf + pos, "%s%s",
  296. delim, disk_events_strs[i]);
  297. delim = " ";
  298. }
  299. if (pos)
  300. pos += sprintf(buf + pos, "\n");
  301. return pos;
  302. }
  303. static ssize_t disk_events_show(struct device *dev,
  304. struct device_attribute *attr, char *buf)
  305. {
  306. struct gendisk *disk = dev_to_disk(dev);
  307. if (!(disk->event_flags & DISK_EVENT_FLAG_UEVENT))
  308. return 0;
  309. return __disk_events_show(disk->events, buf);
  310. }
  311. static ssize_t disk_events_async_show(struct device *dev,
  312. struct device_attribute *attr, char *buf)
  313. {
  314. return 0;
  315. }
  316. static ssize_t disk_events_poll_msecs_show(struct device *dev,
  317. struct device_attribute *attr,
  318. char *buf)
  319. {
  320. struct gendisk *disk = dev_to_disk(dev);
  321. if (!disk->ev)
  322. return sprintf(buf, "-1\n");
  323. return sprintf(buf, "%ld\n", disk->ev->poll_msecs);
  324. }
  325. static ssize_t disk_events_poll_msecs_store(struct device *dev,
  326. struct device_attribute *attr,
  327. const char *buf, size_t count)
  328. {
  329. struct gendisk *disk = dev_to_disk(dev);
  330. long intv;
  331. if (!count || !sscanf(buf, "%ld", &intv))
  332. return -EINVAL;
  333. if (intv < 0 && intv != -1)
  334. return -EINVAL;
  335. if (!disk->ev)
  336. return -ENODEV;
  337. disk_block_events(disk);
  338. disk->ev->poll_msecs = intv;
  339. __disk_unblock_events(disk, true);
  340. return count;
  341. }
  342. DEVICE_ATTR(events, 0444, disk_events_show, NULL);
  343. DEVICE_ATTR(events_async, 0444, disk_events_async_show, NULL);
  344. DEVICE_ATTR(events_poll_msecs, 0644, disk_events_poll_msecs_show,
  345. disk_events_poll_msecs_store);
  346. /*
  347. * The default polling interval can be specified by the kernel
  348. * parameter block.events_dfl_poll_msecs which defaults to 0
  349. * (disable). This can also be modified runtime by writing to
  350. * /sys/module/block/parameters/events_dfl_poll_msecs.
  351. */
  352. static int disk_events_set_dfl_poll_msecs(const char *val,
  353. const struct kernel_param *kp)
  354. {
  355. struct disk_events *ev;
  356. int ret;
  357. ret = param_set_ulong(val, kp);
  358. if (ret < 0)
  359. return ret;
  360. mutex_lock(&disk_events_mutex);
  361. list_for_each_entry(ev, &disk_events, node)
  362. disk_flush_events(ev->disk, 0);
  363. mutex_unlock(&disk_events_mutex);
  364. return 0;
  365. }
  366. static const struct kernel_param_ops disk_events_dfl_poll_msecs_param_ops = {
  367. .set = disk_events_set_dfl_poll_msecs,
  368. .get = param_get_ulong,
  369. };
  370. #undef MODULE_PARAM_PREFIX
  371. #define MODULE_PARAM_PREFIX "block."
  372. module_param_cb(events_dfl_poll_msecs, &disk_events_dfl_poll_msecs_param_ops,
  373. &disk_events_dfl_poll_msecs, 0644);
  374. /*
  375. * disk_{alloc|add|del|release}_events - initialize and destroy disk_events.
  376. */
  377. int disk_alloc_events(struct gendisk *disk)
  378. {
  379. struct disk_events *ev;
  380. if (!disk->fops->check_events || !disk->events)
  381. return 0;
  382. ev = kzalloc(sizeof(*ev), GFP_KERNEL);
  383. if (!ev) {
  384. pr_warn("%s: failed to initialize events\n", disk->disk_name);
  385. return -ENOMEM;
  386. }
  387. INIT_LIST_HEAD(&ev->node);
  388. ev->disk = disk;
  389. spin_lock_init(&ev->lock);
  390. mutex_init(&ev->block_mutex);
  391. ev->block = 1;
  392. ev->poll_msecs = -1;
  393. INIT_DELAYED_WORK(&ev->dwork, disk_events_workfn);
  394. disk->ev = ev;
  395. return 0;
  396. }
  397. void disk_add_events(struct gendisk *disk)
  398. {
  399. if (!disk->ev)
  400. return;
  401. mutex_lock(&disk_events_mutex);
  402. list_add_tail(&disk->ev->node, &disk_events);
  403. mutex_unlock(&disk_events_mutex);
  404. /*
  405. * Block count is initialized to 1 and the following initial
  406. * unblock kicks it into action.
  407. */
  408. __disk_unblock_events(disk, true);
  409. }
  410. void disk_del_events(struct gendisk *disk)
  411. {
  412. if (disk->ev) {
  413. disk_block_events(disk);
  414. mutex_lock(&disk_events_mutex);
  415. list_del_init(&disk->ev->node);
  416. mutex_unlock(&disk_events_mutex);
  417. }
  418. }
  419. void disk_release_events(struct gendisk *disk)
  420. {
  421. /* the block count should be 1 from disk_del_events() */
  422. WARN_ON_ONCE(disk->ev && disk->ev->block != 1);
  423. kfree(disk->ev);
  424. }