3
3
#include <linux/falloc.h>
4
4
#include <linux/kvm_host.h>
5
5
#include <linux/pagemap.h>
6
- #include <linux/pseudo_fs.h>
7
-
8
- #include <uapi/linux/magic.h>
6
+ #include <linux/anon_inodes.h>
9
7
10
8
#include "kvm_mm.h"
11
9
12
- static struct vfsmount * kvm_gmem_mnt ;
13
-
14
10
struct kvm_gmem {
15
11
struct kvm * kvm ;
16
12
struct xarray bindings ;
@@ -364,23 +360,35 @@ static const struct inode_operations kvm_gmem_iops = {
364
360
.setattr = kvm_gmem_setattr ,
365
361
};
366
362
367
- static int __kvm_gmem_create (struct kvm * kvm , loff_t size , u64 flags ,
368
- struct vfsmount * mnt )
363
+ static int __kvm_gmem_create (struct kvm * kvm , loff_t size , u64 flags )
369
364
{
370
365
const char * anon_name = "[kvm-gmem]" ;
371
- const struct qstr qname = QSTR_INIT (anon_name , strlen (anon_name ));
372
366
struct kvm_gmem * gmem ;
373
367
struct inode * inode ;
374
368
struct file * file ;
375
369
int fd , err ;
376
370
377
- inode = alloc_anon_inode ( mnt -> mnt_sb );
378
- if (IS_ERR ( inode ) )
379
- return PTR_ERR ( inode ) ;
371
+ fd = get_unused_fd_flags ( 0 );
372
+ if (fd < 0 )
373
+ return fd ;
380
374
381
- err = security_inode_init_security_anon (inode , & qname , NULL );
382
- if (err )
383
- goto err_inode ;
375
+ gmem = kzalloc (sizeof (* gmem ), GFP_KERNEL );
376
+ if (!gmem ) {
377
+ err = - ENOMEM ;
378
+ goto err_fd ;
379
+ }
380
+
381
+ file = anon_inode_getfile (anon_name , & kvm_gmem_fops , gmem ,
382
+ O_RDWR );
383
+ if (IS_ERR (file )) {
384
+ err = PTR_ERR (file );
385
+ goto err_gmem ;
386
+ }
387
+
388
+ file -> f_flags |= O_LARGEFILE ;
389
+
390
+ inode = file -> f_inode ;
391
+ WARN_ON (file -> f_mapping != inode -> i_mapping );
384
392
385
393
inode -> i_private = (void * )(unsigned long )flags ;
386
394
inode -> i_op = & kvm_gmem_iops ;
@@ -393,44 +401,18 @@ static int __kvm_gmem_create(struct kvm *kvm, loff_t size, u64 flags,
393
401
/* Unmovable mappings are supposed to be marked unevictable as well. */
394
402
WARN_ON_ONCE (!mapping_unevictable (inode -> i_mapping ));
395
403
396
- fd = get_unused_fd_flags (0 );
397
- if (fd < 0 ) {
398
- err = fd ;
399
- goto err_inode ;
400
- }
401
-
402
- file = alloc_file_pseudo (inode , mnt , "kvm-gmem" , O_RDWR , & kvm_gmem_fops );
403
- if (IS_ERR (file )) {
404
- err = PTR_ERR (file );
405
- goto err_fd ;
406
- }
407
-
408
- file -> f_flags |= O_LARGEFILE ;
409
- file -> f_mapping = inode -> i_mapping ;
410
-
411
- gmem = kzalloc (sizeof (* gmem ), GFP_KERNEL );
412
- if (!gmem ) {
413
- err = - ENOMEM ;
414
- goto err_file ;
415
- }
416
-
417
404
kvm_get_kvm (kvm );
418
405
gmem -> kvm = kvm ;
419
406
xa_init (& gmem -> bindings );
420
-
421
- file -> private_data = gmem ;
422
-
423
407
list_add (& gmem -> entry , & inode -> i_mapping -> private_list );
424
408
425
409
fd_install (fd , file );
426
410
return fd ;
427
411
428
- err_file :
429
- fput ( file );
412
+ err_gmem :
413
+ kfree ( gmem );
430
414
err_fd :
431
415
put_unused_fd (fd );
432
- err_inode :
433
- iput (inode );
434
416
return err ;
435
417
}
436
418
@@ -455,7 +437,7 @@ int kvm_gmem_create(struct kvm *kvm, struct kvm_create_guest_memfd *args)
455
437
return - EINVAL ;
456
438
#endif
457
439
458
- return __kvm_gmem_create (kvm , size , flags , kvm_gmem_mnt );
440
+ return __kvm_gmem_create (kvm , size , flags );
459
441
}
460
442
461
443
int kvm_gmem_bind (struct kvm * kvm , struct kvm_memory_slot * slot ,
@@ -611,35 +593,3 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot,
611
593
return r ;
612
594
}
613
595
EXPORT_SYMBOL_GPL (kvm_gmem_get_pfn );
614
-
615
- static int kvm_gmem_init_fs_context (struct fs_context * fc )
616
- {
617
- if (!init_pseudo (fc , KVM_GUEST_MEMORY_MAGIC ))
618
- return - ENOMEM ;
619
-
620
- return 0 ;
621
- }
622
-
623
- static struct file_system_type kvm_gmem_fs = {
624
- .name = "kvm_guest_memory" ,
625
- .init_fs_context = kvm_gmem_init_fs_context ,
626
- .kill_sb = kill_anon_super ,
627
- };
628
-
629
- int kvm_gmem_init (void )
630
- {
631
- kvm_gmem_mnt = kern_mount (& kvm_gmem_fs );
632
- if (IS_ERR (kvm_gmem_mnt ))
633
- return PTR_ERR (kvm_gmem_mnt );
634
-
635
- /* For giggles. Userspace can never map this anyways. */
636
- kvm_gmem_mnt -> mnt_flags |= MNT_NOEXEC ;
637
-
638
- return 0 ;
639
- }
640
-
641
- void kvm_gmem_exit (void )
642
- {
643
- kern_unmount (kvm_gmem_mnt );
644
- kvm_gmem_mnt = NULL ;
645
- }
0 commit comments