55#define pr_fmt (fmt ) KBUILD_MODNAME ": " fmt
66#include <linux/libnvdimm.h>
77#include <linux/sched/mm.h>
8- #include <linux/vmalloc .h>
8+ #include <linux/slab .h>
99#include <linux/uaccess.h>
1010#include <linux/module.h>
1111#include <linux/blkdev.h>
1212#include <linux/fcntl.h>
1313#include <linux/async.h>
1414#include <linux/ndctl.h>
1515#include <linux/sched.h>
16- #include <linux/slab.h>
1716#include <linux/cpu.h>
1817#include <linux/fs.h>
1918#include <linux/io.h>
@@ -64,17 +63,15 @@ static struct module *to_bus_provider(struct device *dev)
6463
6564static void nvdimm_bus_probe_start (struct nvdimm_bus * nvdimm_bus )
6665{
67- nvdimm_bus_lock (& nvdimm_bus -> dev );
66+ guard ( nvdimm_bus ) (& nvdimm_bus -> dev );
6867 nvdimm_bus -> probe_active ++ ;
69- nvdimm_bus_unlock (& nvdimm_bus -> dev );
7068}
7169
7270static void nvdimm_bus_probe_end (struct nvdimm_bus * nvdimm_bus )
7371{
74- nvdimm_bus_lock (& nvdimm_bus -> dev );
72+ guard ( nvdimm_bus ) (& nvdimm_bus -> dev );
7573 if (-- nvdimm_bus -> probe_active == 0 )
7674 wake_up (& nvdimm_bus -> wait );
77- nvdimm_bus_unlock (& nvdimm_bus -> dev );
7875}
7976
8077static int nvdimm_bus_probe (struct device * dev )
@@ -1031,14 +1028,12 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm,
10311028 unsigned int cmd = _IOC_NR (ioctl_cmd );
10321029 struct device * dev = & nvdimm_bus -> dev ;
10331030 void __user * p = (void __user * ) arg ;
1034- char * out_env = NULL , * in_env = NULL ;
10351031 const char * cmd_name , * dimm_name ;
10361032 u32 in_len = 0 , out_len = 0 ;
10371033 unsigned int func = cmd ;
10381034 unsigned long cmd_mask ;
10391035 struct nd_cmd_pkg pkg ;
10401036 int rc , i , cmd_rc ;
1041- void * buf = NULL ;
10421037 u64 buf_len = 0 ;
10431038
10441039 if (nvdimm ) {
@@ -1097,7 +1092,7 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm,
10971092 }
10981093
10991094 /* process an input envelope */
1100- in_env = kzalloc (ND_CMD_MAX_ENVELOPE , GFP_KERNEL );
1095+ char * in_env __free ( kfree ) = kzalloc (ND_CMD_MAX_ENVELOPE , GFP_KERNEL );
11011096 if (!in_env )
11021097 return - ENOMEM ;
11031098 for (i = 0 ; i < desc -> in_num ; i ++ ) {
@@ -1107,17 +1102,14 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm,
11071102 if (in_size == UINT_MAX ) {
11081103 dev_err (dev , "%s:%s unknown input size cmd: %s field: %d\n" ,
11091104 __func__ , dimm_name , cmd_name , i );
1110- rc = - ENXIO ;
1111- goto out ;
1105+ return - ENXIO ;
11121106 }
11131107 if (in_len < ND_CMD_MAX_ENVELOPE )
11141108 copy = min_t (u32 , ND_CMD_MAX_ENVELOPE - in_len , in_size );
11151109 else
11161110 copy = 0 ;
1117- if (copy && copy_from_user (& in_env [in_len ], p + in_len , copy )) {
1118- rc = - EFAULT ;
1119- goto out ;
1120- }
1111+ if (copy && copy_from_user (& in_env [in_len ], p + in_len , copy ))
1112+ return - EFAULT ;
11211113 in_len += in_size ;
11221114 }
11231115
@@ -1129,11 +1121,9 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm,
11291121 }
11301122
11311123 /* process an output envelope */
1132- out_env = kzalloc (ND_CMD_MAX_ENVELOPE , GFP_KERNEL );
1133- if (!out_env ) {
1134- rc = - ENOMEM ;
1135- goto out ;
1136- }
1124+ char * out_env __free (kfree ) = kzalloc (ND_CMD_MAX_ENVELOPE , GFP_KERNEL );
1125+ if (!out_env )
1126+ return - ENOMEM ;
11371127
11381128 for (i = 0 ; i < desc -> out_num ; i ++ ) {
11391129 u32 out_size = nd_cmd_out_size (nvdimm , cmd , desc , i ,
@@ -1143,17 +1133,15 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm,
11431133 if (out_size == UINT_MAX ) {
11441134 dev_dbg (dev , "%s unknown output size cmd: %s field: %d\n" ,
11451135 dimm_name , cmd_name , i );
1146- rc = - EFAULT ;
1147- goto out ;
1136+ return - EFAULT ;
11481137 }
11491138 if (out_len < ND_CMD_MAX_ENVELOPE )
11501139 copy = min_t (u32 , ND_CMD_MAX_ENVELOPE - out_len , out_size );
11511140 else
11521141 copy = 0 ;
11531142 if (copy && copy_from_user (& out_env [out_len ],
11541143 p + in_len + out_len , copy )) {
1155- rc = - EFAULT ;
1156- goto out ;
1144+ return - EFAULT ;
11571145 }
11581146 out_len += out_size ;
11591147 }
@@ -1162,30 +1150,25 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm,
11621150 if (buf_len > ND_IOCTL_MAX_BUFLEN ) {
11631151 dev_dbg (dev , "%s cmd: %s buf_len: %llu > %d\n" , dimm_name ,
11641152 cmd_name , buf_len , ND_IOCTL_MAX_BUFLEN );
1165- rc = - EINVAL ;
1166- goto out ;
1153+ return - EINVAL ;
11671154 }
11681155
1169- buf = vmalloc (buf_len );
1170- if (!buf ) {
1171- rc = - ENOMEM ;
1172- goto out ;
1173- }
1156+ void * buf __free (kvfree ) = kvzalloc (buf_len , GFP_KERNEL );
1157+ if (!buf )
1158+ return - ENOMEM ;
11741159
1175- if (copy_from_user (buf , p , buf_len )) {
1176- rc = - EFAULT ;
1177- goto out ;
1178- }
1160+ if (copy_from_user (buf , p , buf_len ))
1161+ return - EFAULT ;
11791162
1180- device_lock (dev );
1181- nvdimm_bus_lock (dev );
1163+ guard ( device ) (dev );
1164+ guard ( nvdimm_bus ) (dev );
11821165 rc = nd_cmd_clear_to_send (nvdimm_bus , nvdimm , func , buf );
11831166 if (rc )
1184- goto out_unlock ;
1167+ return rc ;
11851168
11861169 rc = nd_desc -> ndctl (nd_desc , nvdimm , cmd , buf , buf_len , & cmd_rc );
11871170 if (rc < 0 )
1188- goto out_unlock ;
1171+ return rc ;
11891172
11901173 if (!nvdimm && cmd == ND_CMD_CLEAR_ERROR && cmd_rc >= 0 ) {
11911174 struct nd_cmd_clear_error * clear_err = buf ;
@@ -1195,16 +1178,9 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm,
11951178 }
11961179
11971180 if (copy_to_user (p , buf , buf_len ))
1198- rc = - EFAULT ;
1181+ return - EFAULT ;
11991182
1200- out_unlock :
1201- nvdimm_bus_unlock (dev );
1202- device_unlock (dev );
1203- out :
1204- kfree (in_env );
1205- kfree (out_env );
1206- vfree (buf );
1207- return rc ;
1183+ return 0 ;
12081184}
12091185
12101186enum nd_ioctl_mode {
0 commit comments