static blk_status_t pmem_clear_poison(struct pmem_device *pmem, phys_addr_t offset, unsigned int len) { struct device *dev = to_dev(pmem); sector_t sector; long cleared; blk_status_t rc = BLK_STS_OK; sector = (offset - pmem->data_offset) / 512; cleared = nvdimm_clear_poison(dev, pmem->phys_addr + offset, len); if (cleared < len) rc = BLK_STS_IOERR; if (cleared > 0 && cleared / 512) { hwpoison_clear(pmem, pmem->phys_addr + offset, cleared); cleared /= 512; dev_dbg(dev, "%#llx clear %ld sector%s\n", (unsigned long long) sector, cleared, cleared > 1 ? "s" : ""); badblocks_clear(&pmem->bb, sector, cleared); if (pmem->bb_state) sysfs_notify_dirent(pmem->bb_state); } arch_invalidate_pmem(pmem->virt_addr + offset, len); return rc; }
void cosm_set_state(struct cosm_device *cdev, u8 state) { dev_dbg(&cdev->dev, "State %s -> %s\n", cosm_state_string[cdev->state], cosm_state_string[state]); cdev->state = state; sysfs_notify_dirent(cdev->state_sysfs); }
void sysfs_notify(struct kobject *k, const char *dir, const char *attr) { struct sysfs_dirent *sd = k->sd; mutex_lock(&sysfs_mutex); if (sd && dir) sd = sysfs_find_dirent(sd, dir); if (sd && attr) sd = sysfs_find_dirent(sd, attr); if (sd) sysfs_notify_dirent(sd); mutex_unlock(&sysfs_mutex); }
void sysfs_notify(struct kobject *k, const char *dir, const char *attr) { struct sysfs_dirent *sd = k->sd; mutex_lock(&sysfs_mutex); if (sd && dir) /* Only directories are tagged, so no need to pass * a tag explicitly. */ sd = sysfs_find_dirent(sd, NULL, dir); if (sd && attr) sd = sysfs_find_dirent(sd, NULL, attr); if (sd) sysfs_notify_dirent(sd); mutex_unlock(&sysfs_mutex); }
void vsync_notify_handler(void *arg) { struct mdp3_session_data *session = (struct mdp3_session_data *)arg; session->vsync_time = ktime_get(); sysfs_notify_dirent(session->vsync_event_sd); }