Lines Matching +full:store +full:- +full:release

1 // SPDX-License-Identifier: GPL-2.0
3 * SCLP Store Data support and sysfs interface
53 * struct sclp_sd_data - Result of a Store Data request
56 * @data: Pointer to data - must be released using vfree()
65 * struct sclp_sd_listener - Listener for asynchronous Store Data response
69 * @evbuf: Contains the resulting Store Data response after completion
79 * struct sclp_sd_file - Sysfs representation of a Store Data entity
102 * sclp_sd_listener_add() - Add listener for Store Data responses
108 list_add_tail(&listener->list, &sclp_sd_queue); in sclp_sd_listener_add()
113 * sclp_sd_listener_remove() - Remove listener for Store Data responses
119 list_del(&listener->list); in sclp_sd_listener_remove()
124 * sclp_sd_listener_init() - Initialize a Store Data response listener
128 * Initialize a listener for asynchronous Store Data responses. This listener
135 listener->id = id; in sclp_sd_listener_init()
136 init_completion(&listener->completion); in sclp_sd_listener_init()
140 * sclp_sd_receiver() - Receiver for Store Data events
143 * Process Store Data events and complete listeners with matching event IDs.
151 pr_debug("received event (id=0x%08x)\n", evbuf->id); in sclp_sd_receiver()
154 if (listener->id != evbuf->id) in sclp_sd_receiver()
157 listener->evbuf = *evbuf; in sclp_sd_receiver()
158 complete(&listener->completion); in sclp_sd_receiver()
165 pr_debug("unsolicited event (id=0x%08x)\n", evbuf->id); in sclp_sd_receiver()
175 * sclp_sd_sync() - Perform Store Data request synchronously
176 * @page: Address of work page - must be below 2GB
184 * Perform Store Data request with specified parameters and wait for completion.
186 * Return %0 on success and store resulting DSIZE and ESIZE values in
187 * @dsize_ptr and @esize_ptr (if provided). Return non-zero on error.
199 return -EIO; in sclp_sd_sync()
206 sccb->hdr.length = sizeof(sccb->hdr) + sizeof(sccb->evbuf); in sclp_sd_sync()
207 evbuf = &sccb->evbuf; in sclp_sd_sync()
208 evbuf->hdr.length = sizeof(*evbuf); in sclp_sd_sync()
209 evbuf->hdr.type = EVTYP_STORE_DATA; in sclp_sd_sync()
210 evbuf->eq = eq; in sclp_sd_sync()
211 evbuf->di = di; in sclp_sd_sync()
212 evbuf->id = listener.id; in sclp_sd_sync()
213 evbuf->fmt = 1; in sclp_sd_sync()
214 evbuf->sat = sat; in sclp_sd_sync()
215 evbuf->sa = sa; in sclp_sd_sync()
217 evbuf->dsize = *dsize_ptr; in sclp_sd_sync()
227 if (sccb->hdr.response_code == 0x73f0) { in sclp_sd_sync()
229 rc = -EIO; in sclp_sd_sync()
232 if (sccb->hdr.response_code != 0x0020 || !(evbuf->hdr.flags & 0x80)) { in sclp_sd_sync()
233 rc = -EIO; in sclp_sd_sync()
236 if (!(evbuf->rflags & 0x80)) { in sclp_sd_sync()
239 rc = -ETIME; in sclp_sd_sync()
245 switch (evbuf->status) { in sclp_sd_sync()
248 *dsize_ptr = evbuf->dsize; in sclp_sd_sync()
250 *esize_ptr = evbuf->esize; in sclp_sd_sync()
251 pr_debug("success (dsize=%u, esize=%u)\n", evbuf->dsize, in sclp_sd_sync()
252 evbuf->esize); in sclp_sd_sync()
255 rc = -ENOENT; in sclp_sd_sync()
258 rc = -EIO; in sclp_sd_sync()
264 if (rc && rc != -ENOENT) { in sclp_sd_sync()
266 pr_warn("Store Data request failed (eq=%d, di=%d, " in sclp_sd_sync()
268 eq, di, sccb->hdr.response_code, evbuf->hdr.flags, in sclp_sd_sync()
269 evbuf->status, rc); in sclp_sd_sync()
279 * sclp_sd_store_data() - Obtain data for specified Store Data entity
283 * Perform a series of Store Data requests to obtain the size and contents of
284 * the specified Store Data entity.
287 * %0: Success - result is stored in @result. @result->data must be
289 * %-ENOENT: No data available for this entity
301 return -ENOMEM; in sclp_sd_store_data()
313 rc = -ENOMEM; in sclp_sd_store_data()
321 rc = -ENOMEM; in sclp_sd_store_data()
330 if (rc == -ERESTARTSYS || rc == -ETIME) { in sclp_sd_store_data()
332 pr_warn("Could not stop Store Data request - leaking at least %zu bytes\n", in sclp_sd_store_data()
343 result->esize_bytes = (size_t) esize * PAGE_SIZE; in sclp_sd_store_data()
344 result->dsize_bytes = (size_t) dsize * PAGE_SIZE; in sclp_sd_store_data()
345 result->data = data; in sclp_sd_store_data()
355 * sclp_sd_data_reset() - Reset Store Data result buffer
358 * Reset @data to initial state and release associated memory.
362 vfree(data->data); in sclp_sd_data_reset()
363 data->data = NULL; in sclp_sd_data_reset()
364 data->dsize_bytes = 0; in sclp_sd_data_reset()
365 data->esize_bytes = 0; in sclp_sd_data_reset()
369 * sclp_sd_file_release() - Release function for sclp_sd_file object
376 sclp_sd_data_reset(&sd_file->data); in sclp_sd_file_release()
381 * sclp_sd_file_update() - Update contents of sclp_sd_file object
384 * Obtain the current version of data associated with the Store Data entity
388 * data may have changed. Return non-zero otherwise.
392 const char *name = kobject_name(&sd_file->kobj); in sclp_sd_file_update()
396 rc = sclp_sd_store_data(&data, sd_file->di); in sclp_sd_file_update()
398 if (rc == -ENOENT) { in sclp_sd_file_update()
405 mutex_lock(&sd_file->data_mutex); in sclp_sd_file_update()
406 sclp_sd_data_reset(&sd_file->data); in sclp_sd_file_update()
407 sd_file->data = data; in sclp_sd_file_update()
408 mutex_unlock(&sd_file->data_mutex); in sclp_sd_file_update()
410 pr_info("A %zu-byte %s data entity was retrieved\n", data.dsize_bytes, in sclp_sd_file_update()
412 kobject_uevent(&sd_file->kobj, KOBJ_CHANGE); in sclp_sd_file_update()
418 * sclp_sd_file_update_async() - Wrapper for asynchronous update call
430 * reload_store() - Store function for "reload" sysfs attribute
458 .release = sclp_sd_file_release,
463 * data_read() - Read function for "data" sysfs attribute
471 * Store the requested portion of the Store Data entity contents into the
483 mutex_lock(&sd_file->data_mutex); in data_read()
485 data = sd_file->data.data; in data_read()
486 data_size = sd_file->data.dsize_bytes; in data_read()
491 size = data_size - off; in data_read()
495 mutex_unlock(&sd_file->data_mutex); in data_read()
501 * sclp_sd_file_create() - Add a sysfs file representing a Store Data entity
509 * The files in this directory can be used to access the contents of the Store
524 sd_file->di = di; in sclp_sd_file_create()
525 mutex_init(&sd_file->data_mutex); in sclp_sd_file_create()
528 sd_file->kobj.kset = sclp_sd_kset; in sclp_sd_file_create()
529 rc = kobject_init_and_add(&sd_file->kobj, &sclp_sd_file_ktype, NULL, in sclp_sd_file_create()
532 kobject_put(&sd_file->kobj); in sclp_sd_file_create()
536 sysfs_bin_attr_init(&sd_file->data_attr); in sclp_sd_file_create()
537 sd_file->data_attr.attr.name = "data"; in sclp_sd_file_create()
538 sd_file->data_attr.attr.mode = 0444; in sclp_sd_file_create()
539 sd_file->data_attr.read = data_read; in sclp_sd_file_create()
541 rc = sysfs_create_bin_file(&sd_file->kobj, &sd_file->data_attr); in sclp_sd_file_create()
543 kobject_put(&sd_file->kobj); in sclp_sd_file_create()
548 * For completeness only - users interested in entity data should listen in sclp_sd_file_create()
551 kobject_uevent(&sd_file->kobj, KOBJ_ADD); in sclp_sd_file_create()
553 /* Don't let a slow Store Data request delay further initialization */ in sclp_sd_file_create()
560 * sclp_sd_init() - Initialize sclp_sd support and register sysfs files
571 rc = -ENOMEM; in sclp_sd_init()
576 rc = -EINVAL; in sclp_sd_init()