diff options
Diffstat (limited to 'arch/s390/hypfs/hypfs_vm.c')
-rw-r--r-- | arch/s390/hypfs/hypfs_vm.c | 62 |
1 files changed, 20 insertions, 42 deletions
diff --git a/arch/s390/hypfs/hypfs_vm.c b/arch/s390/hypfs/hypfs_vm.c index 26cf177f6a3a..e54796002f61 100644 --- a/arch/s390/hypfs/hypfs_vm.c +++ b/arch/s390/hypfs/hypfs_vm.c | |||
@@ -20,8 +20,6 @@ static char local_guest[] = " "; | |||
20 | static char all_guests[] = "* "; | 20 | static char all_guests[] = "* "; |
21 | static char *guest_query; | 21 | static char *guest_query; |
22 | 22 | ||
23 | static struct dentry *dbfs_d2fc_file; | ||
24 | |||
25 | struct diag2fc_data { | 23 | struct diag2fc_data { |
26 | __u32 version; | 24 | __u32 version; |
27 | __u32 flags; | 25 | __u32 flags; |
@@ -104,7 +102,7 @@ static void *diag2fc_store(char *query, unsigned int *count, int offset) | |||
104 | return data; | 102 | return data; |
105 | } | 103 | } |
106 | 104 | ||
107 | static void diag2fc_free(void *data) | 105 | static void diag2fc_free(const void *data) |
108 | { | 106 | { |
109 | vfree(data); | 107 | vfree(data); |
110 | } | 108 | } |
@@ -239,43 +237,29 @@ struct dbfs_d2fc { | |||
239 | char buf[]; /* d2fc buffer */ | 237 | char buf[]; /* d2fc buffer */ |
240 | } __attribute__ ((packed)); | 238 | } __attribute__ ((packed)); |
241 | 239 | ||
242 | static int dbfs_d2fc_open(struct inode *inode, struct file *file) | 240 | static int dbfs_diag2fc_create(void **data, void **data_free_ptr, size_t *size) |
243 | { | 241 | { |
244 | struct dbfs_d2fc *data; | 242 | struct dbfs_d2fc *d2fc; |
245 | unsigned int count; | 243 | unsigned int count; |
246 | 244 | ||
247 | data = diag2fc_store(guest_query, &count, sizeof(data->hdr)); | 245 | d2fc = diag2fc_store(guest_query, &count, sizeof(d2fc->hdr)); |
248 | if (IS_ERR(data)) | 246 | if (IS_ERR(d2fc)) |
249 | return PTR_ERR(data); | 247 | return PTR_ERR(d2fc); |
250 | get_clock_ext(data->hdr.tod_ext); | 248 | get_clock_ext(d2fc->hdr.tod_ext); |
251 | data->hdr.len = count * sizeof(struct diag2fc_data); | 249 | d2fc->hdr.len = count * sizeof(struct diag2fc_data); |
252 | data->hdr.version = DBFS_D2FC_HDR_VERSION; | 250 | d2fc->hdr.version = DBFS_D2FC_HDR_VERSION; |
253 | data->hdr.count = count; | 251 | d2fc->hdr.count = count; |
254 | memset(&data->hdr.reserved, 0, sizeof(data->hdr.reserved)); | 252 | memset(&d2fc->hdr.reserved, 0, sizeof(d2fc->hdr.reserved)); |
255 | file->private_data = data; | 253 | *data = d2fc; |
256 | return nonseekable_open(inode, file); | 254 | *data_free_ptr = d2fc; |
257 | } | 255 | *size = d2fc->hdr.len + sizeof(struct dbfs_d2fc_hdr); |
258 | |||
259 | static int dbfs_d2fc_release(struct inode *inode, struct file *file) | ||
260 | { | ||
261 | diag2fc_free(file->private_data); | ||
262 | return 0; | 256 | return 0; |
263 | } | 257 | } |
264 | 258 | ||
265 | static ssize_t dbfs_d2fc_read(struct file *file, char __user *buf, | 259 | static struct hypfs_dbfs_file dbfs_file_2fc = { |
266 | size_t size, loff_t *ppos) | 260 | .name = "diag_2fc", |
267 | { | 261 | .data_create = dbfs_diag2fc_create, |
268 | struct dbfs_d2fc *data = file->private_data; | 262 | .data_free = diag2fc_free, |
269 | |||
270 | return simple_read_from_buffer(buf, size, ppos, data, data->hdr.len + | ||
271 | sizeof(struct dbfs_d2fc_hdr)); | ||
272 | } | ||
273 | |||
274 | static const struct file_operations dbfs_d2fc_ops = { | ||
275 | .open = dbfs_d2fc_open, | ||
276 | .read = dbfs_d2fc_read, | ||
277 | .release = dbfs_d2fc_release, | ||
278 | .llseek = no_llseek, | ||
279 | }; | 263 | }; |
280 | 264 | ||
281 | int hypfs_vm_init(void) | 265 | int hypfs_vm_init(void) |
@@ -288,18 +272,12 @@ int hypfs_vm_init(void) | |||
288 | guest_query = local_guest; | 272 | guest_query = local_guest; |
289 | else | 273 | else |
290 | return -EACCES; | 274 | return -EACCES; |
291 | 275 | return hypfs_dbfs_create_file(&dbfs_file_2fc); | |
292 | dbfs_d2fc_file = debugfs_create_file("diag_2fc", 0400, hypfs_dbfs_dir, | ||
293 | NULL, &dbfs_d2fc_ops); | ||
294 | if (IS_ERR(dbfs_d2fc_file)) | ||
295 | return PTR_ERR(dbfs_d2fc_file); | ||
296 | |||
297 | return 0; | ||
298 | } | 276 | } |
299 | 277 | ||
300 | void hypfs_vm_exit(void) | 278 | void hypfs_vm_exit(void) |
301 | { | 279 | { |
302 | if (!MACHINE_IS_VM) | 280 | if (!MACHINE_IS_VM) |
303 | return; | 281 | return; |
304 | debugfs_remove(dbfs_d2fc_file); | 282 | hypfs_dbfs_remove_file(&dbfs_file_2fc); |
305 | } | 283 | } |