diff options
Diffstat (limited to 'drivers/block/nbd.c')
| -rw-r--r-- | drivers/block/nbd.c | 15 | 
1 files changed, 15 insertions, 0 deletions
| diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 1188f32a5e5e..a853c65ac65d 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -52,6 +52,7 @@  static DEFINE_IDR(nbd_index_idr);  static DEFINE_MUTEX(nbd_index_mutex);  static struct workqueue_struct *nbd_del_wq; +static struct cred *nbd_cred;  static int nbd_total_devices = 0;  struct nbd_sock { @@ -554,6 +555,7 @@ static int __sock_xmit(struct nbd_device *nbd, struct socket *sock, int send,  	int result;  	struct msghdr msg = {} ;  	unsigned int noreclaim_flag; +	const struct cred *old_cred;  	if (unlikely(!sock)) {  		dev_err_ratelimited(disk_to_dev(nbd->disk), @@ -562,6 +564,8 @@ static int __sock_xmit(struct nbd_device *nbd, struct socket *sock, int send,  		return -EINVAL;  	} +	old_cred = override_creds(nbd_cred); +  	msg.msg_iter = *iter;  	noreclaim_flag = memalloc_noreclaim_save(); @@ -586,6 +590,8 @@ static int __sock_xmit(struct nbd_device *nbd, struct socket *sock, int send,  	memalloc_noreclaim_restore(noreclaim_flag); +	revert_creds(old_cred); +  	return result;  } @@ -2677,7 +2683,15 @@ static int __init nbd_init(void)  		return -ENOMEM;  	} +	nbd_cred = prepare_kernel_cred(&init_task); +	if (!nbd_cred) { +		destroy_workqueue(nbd_del_wq); +		unregister_blkdev(NBD_MAJOR, "nbd"); +		return -ENOMEM; +	} +  	if (genl_register_family(&nbd_genl_family)) { +		put_cred(nbd_cred);  		destroy_workqueue(nbd_del_wq);  		unregister_blkdev(NBD_MAJOR, "nbd");  		return -EINVAL; @@ -2732,6 +2746,7 @@ static void __exit nbd_cleanup(void)  	/* Also wait for nbd_dev_remove_work() completes */  	destroy_workqueue(nbd_del_wq); +	put_cred(nbd_cred);  	idr_destroy(&nbd_index_idr);  	unregister_blkdev(NBD_MAJOR, "nbd");  } | 
