Lines Matching refs:param
409 static struct mapped_device *dm_hash_rename(struct dm_ioctl *param, in dm_hash_rename() argument
416 unsigned change_uuid = (param->flags & DM_UUID_FLAG) ? 1 : 0; in dm_hash_rename()
440 param->name, new); in dm_hash_rename()
450 hc = __get_name_cell(param->name); in dm_hash_rename()
453 param->name, change_uuid ? "uuid " : "", new); in dm_hash_rename()
465 param->name, new, hc->uuid); in dm_hash_rename()
485 if (!dm_kobject_uevent(hc->md, KOBJ_CHANGE, param->event_nr, false)) in dm_hash_rename()
486 param->flags |= DM_UEVENT_GENERATED_FLAG; in dm_hash_rename()
510 typedef int (*ioctl_fn)(struct file *filp, struct dm_ioctl *param, size_t param_size);
512 static int remove_all(struct file *filp, struct dm_ioctl *param, size_t param_size) in remove_all() argument
514 dm_hash_remove_all(true, !!(param->flags & DM_DEFERRED_REMOVE), false); in remove_all()
515 param->data_size = 0; in remove_all()
536 static void *get_result_buffer(struct dm_ioctl *param, size_t param_size, in get_result_buffer() argument
539 param->data_start = align_ptr(param + 1) - (void *) param; in get_result_buffer()
541 if (param->data_start < param_size) in get_result_buffer()
542 *len = param_size - param->data_start; in get_result_buffer()
546 return ((void *) param) + param->data_start; in get_result_buffer()
573 static int list_devices(struct file *filp, struct dm_ioctl *param, size_t param_size) in list_devices() argument
590 if (!filter_device(hc, param->name, param->uuid)) in list_devices()
594 if (param->flags & DM_UUID_FLAG && hc->uuid) in list_devices()
601 nl = orig_nl = get_result_buffer(param, param_size, &len); in list_devices()
603 param->flags |= DM_BUFFER_FULL_FLAG; in list_devices()
606 param->data_size = param->data_start + needed; in list_devices()
616 if (!filter_device(hc, param->name, param->uuid)) in list_devices()
631 if (param->flags & DM_UUID_FLAG) { in list_devices()
662 static void list_version_get_info(struct target_type *tt, void *param) in list_version_get_info() argument
664 struct vers_iter *info = param; in list_version_get_info()
687 static int __list_versions(struct dm_ioctl *param, size_t param_size, const char *name) in __list_versions() argument
712 vers = get_result_buffer(param, param_size, &len); in __list_versions()
714 param->flags |= DM_BUFFER_FULL_FLAG; in __list_versions()
717 param->data_size = param->data_start + needed; in __list_versions()
732 param->flags |= iter_info.flags; in __list_versions()
740 static int list_versions(struct file *filp, struct dm_ioctl *param, size_t param_size) in list_versions() argument
742 return __list_versions(param, param_size, NULL); in list_versions()
745 static int get_target_version(struct file *filp, struct dm_ioctl *param, size_t param_size) in get_target_version() argument
747 return __list_versions(param, param_size, param->name); in get_target_version()
789 struct dm_ioctl *param, in dm_get_live_or_inactive_table() argument
792 return (param->flags & DM_QUERY_INACTIVE_TABLE_FLAG) ? in dm_get_live_or_inactive_table()
800 static void __dev_status(struct mapped_device *md, struct dm_ioctl *param) in __dev_status() argument
806 param->flags &= ~(DM_SUSPEND_FLAG | DM_READONLY_FLAG | in __dev_status()
810 param->flags |= DM_SUSPEND_FLAG; in __dev_status()
813 param->flags |= DM_INTERNAL_SUSPEND_FLAG; in __dev_status()
816 param->flags |= DM_DEFERRED_REMOVE; in __dev_status()
818 param->dev = huge_encode_dev(disk_devt(disk)); in __dev_status()
825 param->open_count = dm_open_count(md); in __dev_status()
827 param->event_nr = dm_get_event_nr(md); in __dev_status()
828 param->target_count = 0; in __dev_status()
832 if (!(param->flags & DM_QUERY_INACTIVE_TABLE_FLAG)) { in __dev_status()
834 param->flags |= DM_READONLY_FLAG; in __dev_status()
835 param->target_count = dm_table_get_num_targets(table); in __dev_status()
838 param->flags |= DM_ACTIVE_PRESENT_FLAG; in __dev_status()
842 if (param->flags & DM_QUERY_INACTIVE_TABLE_FLAG) { in __dev_status()
847 param->flags |= DM_READONLY_FLAG; in __dev_status()
848 param->target_count = dm_table_get_num_targets(table); in __dev_status()
854 static int dev_create(struct file *filp, struct dm_ioctl *param, size_t param_size) in dev_create() argument
859 r = check_name(param->name); in dev_create()
863 if (param->flags & DM_PERSISTENT_DEV_FLAG) in dev_create()
864 m = MINOR(huge_decode_dev(param->dev)); in dev_create()
870 r = dm_hash_insert(param->name, *param->uuid ? param->uuid : NULL, md); in dev_create()
877 param->flags &= ~DM_INACTIVE_PRESENT_FLAG; in dev_create()
879 __dev_status(md, param); in dev_create()
889 static struct hash_cell *__find_device_hash_cell(struct dm_ioctl *param) in __find_device_hash_cell() argument
893 if (*param->uuid) { in __find_device_hash_cell()
894 if (*param->name || param->dev) in __find_device_hash_cell()
897 hc = __get_uuid_cell(param->uuid); in __find_device_hash_cell()
900 } else if (*param->name) { in __find_device_hash_cell()
901 if (param->dev) in __find_device_hash_cell()
904 hc = __get_name_cell(param->name); in __find_device_hash_cell()
907 } else if (param->dev) { in __find_device_hash_cell()
908 hc = __get_dev_cell(param->dev); in __find_device_hash_cell()
918 strlcpy(param->name, hc->name, sizeof(param->name)); in __find_device_hash_cell()
920 strlcpy(param->uuid, hc->uuid, sizeof(param->uuid)); in __find_device_hash_cell()
922 param->uuid[0] = '\0'; in __find_device_hash_cell()
925 param->flags |= DM_INACTIVE_PRESENT_FLAG; in __find_device_hash_cell()
927 param->flags &= ~DM_INACTIVE_PRESENT_FLAG; in __find_device_hash_cell()
932 static struct mapped_device *find_device(struct dm_ioctl *param) in find_device() argument
938 hc = __find_device_hash_cell(param); in find_device()
946 static int dev_remove(struct file *filp, struct dm_ioctl *param, size_t param_size) in dev_remove() argument
954 hc = __find_device_hash_cell(param); in dev_remove()
967 r = dm_lock_for_deletion(md, !!(param->flags & DM_DEFERRED_REMOVE), false); in dev_remove()
969 if (r == -EBUSY && param->flags & DM_DEFERRED_REMOVE) { in dev_remove()
988 param->flags &= ~DM_DEFERRED_REMOVE; in dev_remove()
992 if (!dm_kobject_uevent(md, KOBJ_REMOVE, param->event_nr, false)) in dev_remove()
993 param->flags |= DM_UEVENT_GENERATED_FLAG; in dev_remove()
1013 static int dev_rename(struct file *filp, struct dm_ioctl *param, size_t param_size) in dev_rename() argument
1016 char *new_data = (char *) param + param->data_start; in dev_rename()
1018 unsigned change_uuid = (param->flags & DM_UUID_FLAG) ? 1 : 0; in dev_rename()
1020 if (new_data < param->data || in dev_rename()
1021 invalid_str(new_data, (void *) param + param_size) || !*new_data || in dev_rename()
1033 md = dm_hash_rename(param, new_data); in dev_rename()
1037 __dev_status(md, param); in dev_rename()
1043 static int dev_set_geometry(struct file *filp, struct dm_ioctl *param, size_t param_size) in dev_set_geometry() argument
1049 char *geostr = (char *) param + param->data_start; in dev_set_geometry()
1052 md = find_device(param); in dev_set_geometry()
1056 if (geostr < param->data || in dev_set_geometry()
1057 invalid_str(geostr, (void *) param + param_size)) { in dev_set_geometry()
1083 param->data_size = 0; in dev_set_geometry()
1090 static int do_suspend(struct dm_ioctl *param) in do_suspend() argument
1096 md = find_device(param); in do_suspend()
1100 if (param->flags & DM_SKIP_LOCKFS_FLAG) in do_suspend()
1102 if (param->flags & DM_NOFLUSH_FLAG) in do_suspend()
1111 __dev_status(md, param); in do_suspend()
1119 static int do_resume(struct dm_ioctl *param) in do_resume() argument
1130 hc = __find_device_hash_cell(param); in do_resume()
1141 param->flags &= ~DM_INACTIVE_PRESENT_FLAG; in do_resume()
1150 if (param->flags & DM_SKIP_LOCKFS_FLAG) in do_resume()
1152 if (param->flags & DM_NOFLUSH_FLAG) in do_resume()
1180 if (!dm_kobject_uevent(md, KOBJ_CHANGE, param->event_nr, need_resize_uevent)) in do_resume()
1181 param->flags |= DM_UEVENT_GENERATED_FLAG; in do_resume()
1193 __dev_status(md, param); in do_resume()
1203 static int dev_suspend(struct file *filp, struct dm_ioctl *param, size_t param_size) in dev_suspend() argument
1205 if (param->flags & DM_SUSPEND_FLAG) in dev_suspend()
1206 return do_suspend(param); in dev_suspend()
1208 return do_resume(param); in dev_suspend()
1215 static int dev_status(struct file *filp, struct dm_ioctl *param, size_t param_size) in dev_status() argument
1219 md = find_device(param); in dev_status()
1223 __dev_status(md, param); in dev_status()
1233 struct dm_ioctl *param, size_t param_size) in retrieve_status() argument
1242 outptr = outbuf = get_result_buffer(param, param_size, &len); in retrieve_status()
1244 if (param->flags & DM_STATUS_TABLE_FLAG) in retrieve_status()
1246 else if (param->flags & DM_IMA_MEASUREMENT_FLAG) in retrieve_status()
1259 param->flags |= DM_BUFFER_FULL_FLAG; in retrieve_status()
1274 param->flags |= DM_BUFFER_FULL_FLAG; in retrieve_status()
1280 if (param->flags & DM_NOFLUSH_FLAG) in retrieve_status()
1288 param->flags |= DM_BUFFER_FULL_FLAG; in retrieve_status()
1293 used = param->data_start + (outptr - outbuf); in retrieve_status()
1300 param->data_size = used; in retrieve_status()
1302 param->target_count = num_targets; in retrieve_status()
1308 static int dev_wait(struct file *filp, struct dm_ioctl *param, size_t param_size) in dev_wait() argument
1315 md = find_device(param); in dev_wait()
1322 if (dm_wait_event(md, param->event_nr)) { in dev_wait()
1332 __dev_status(md, param); in dev_wait()
1334 table = dm_get_live_or_inactive_table(md, param, &srcu_idx); in dev_wait()
1336 retrieve_status(table, param, param_size); in dev_wait()
1349 static int dev_arm_poll(struct file *filp, struct dm_ioctl *param, size_t param_size) in dev_arm_poll() argument
1358 static inline fmode_t get_mode(struct dm_ioctl *param) in get_mode() argument
1362 if (param->flags & DM_READONLY_FLAG) in get_mode()
1381 struct dm_ioctl *param, size_t param_size) in populate_table() argument
1385 struct dm_target_spec *spec = (struct dm_target_spec *) param; in populate_table()
1386 uint32_t next = param->data_start; in populate_table()
1387 void *end = (void *) param + param_size; in populate_table()
1390 if (!param->target_count) { in populate_table()
1395 for (i = 0; i < param->target_count; i++) { in populate_table()
1427 static int table_load(struct file *filp, struct dm_ioctl *param, size_t param_size) in table_load() argument
1435 md = find_device(param); in table_load()
1439 r = dm_table_create(&t, get_mode(param), param->target_count, md); in table_load()
1445 r = populate_table(t, param, param_size); in table_load()
1492 param->flags |= DM_INACTIVE_PRESENT_FLAG; in table_load()
1493 __dev_status(md, param); in table_load()
1514 static int table_clear(struct file *filp, struct dm_ioctl *param, size_t param_size) in table_clear() argument
1523 hc = __find_device_hash_cell(param); in table_clear()
1539 param->flags &= ~DM_INACTIVE_PRESENT_FLAG; in table_clear()
1540 __dev_status(md, param); in table_clear()
1556 struct dm_ioctl *param, size_t param_size) in retrieve_deps() argument
1564 deps = get_result_buffer(param, param_size, &len); in retrieve_deps()
1577 param->flags |= DM_BUFFER_FULL_FLAG; in retrieve_deps()
1589 param->data_size = param->data_start + needed; in retrieve_deps()
1592 static int table_deps(struct file *filp, struct dm_ioctl *param, size_t param_size) in table_deps() argument
1598 md = find_device(param); in table_deps()
1602 __dev_status(md, param); in table_deps()
1604 table = dm_get_live_or_inactive_table(md, param, &srcu_idx); in table_deps()
1606 retrieve_deps(table, param, param_size); in table_deps()
1618 static int table_status(struct file *filp, struct dm_ioctl *param, size_t param_size) in table_status() argument
1624 md = find_device(param); in table_status()
1628 __dev_status(md, param); in table_status()
1630 table = dm_get_live_or_inactive_table(md, param, &srcu_idx); in table_status()
1632 retrieve_status(table, param, param_size); in table_status()
1673 static int target_message(struct file *filp, struct dm_ioctl *param, size_t param_size) in target_message() argument
1680 struct dm_target_msg *tmsg = (void *) param + param->data_start; in target_message()
1682 char *result = get_result_buffer(param, param_size, &maxlen); in target_message()
1685 md = find_device(param); in target_message()
1689 if (tmsg < (struct dm_target_msg *) param->data || in target_message()
1690 invalid_str(tmsg->message, (void *) param + param_size)) { in target_message()
1738 __dev_status(md, param); in target_message()
1741 param->flags |= DM_DATA_OUT_FLAG; in target_message()
1743 param->flags |= DM_BUFFER_FULL_FLAG; in target_message()
1745 param->data_size = param->data_start + strlen(result) + 1; in target_message()
1842 static void free_params(struct dm_ioctl *param, size_t param_size, int param_flags) in free_params() argument
1845 memset(param, 0, param_size); in free_params()
1848 kvfree(param); in free_params()
1852 int ioctl_flags, struct dm_ioctl **param, int *param_flags) in copy_params() argument
1905 *param = dmi; in copy_params()
1914 static int validate_params(uint cmd, struct dm_ioctl *param) in validate_params() argument
1917 param->flags &= ~DM_BUFFER_FULL_FLAG; in validate_params()
1918 param->flags &= ~DM_UEVENT_GENERATED_FLAG; in validate_params()
1919 param->flags &= ~DM_SECURE_DATA_FLAG; in validate_params()
1920 param->flags &= ~DM_DATA_OUT_FLAG; in validate_params()
1929 if (!*param->name) { in validate_params()
1933 } else if (*param->uuid && *param->name) { in validate_params()
1939 param->name[DM_NAME_LEN - 1] = '\0'; in validate_params()
1940 param->uuid[DM_UUID_LEN - 1] = '\0'; in validate_params()
1951 struct dm_ioctl *param; in ctl_ioctl() local
1988 r = copy_params(user, ¶m_kernel, ioctl_flags, ¶m, ¶m_flags); in ctl_ioctl()
1993 input_param_size = param->data_size; in ctl_ioctl()
1994 r = validate_params(cmd, param); in ctl_ioctl()
1998 param->data_size = offsetof(struct dm_ioctl, data); in ctl_ioctl()
1999 r = fn(file, param, input_param_size); in ctl_ioctl()
2001 if (unlikely(param->flags & DM_BUFFER_FULL_FLAG) && in ctl_ioctl()
2011 if (!r && copy_to_user(user, param, param->data_size)) in ctl_ioctl()
2015 free_params(param, input_param_size, param_flags); in ctl_ioctl()