@@ -105,55 +105,22 @@ struct bdev_info {
105
105
_##name_; \
106
106
})
107
107
108
- /**
109
- * struct pstore_device_info - back-end pstore/blk driver structure.
110
- *
111
- * @total_size: The total size in bytes pstore/blk can use. It must be greater
112
- * than 4096 and be multiple of 4096.
113
- * @flags: Refer to macro starting with PSTORE_FLAGS defined in
114
- * linux/pstore.h. It means what front-ends this device support.
115
- * Zero means all backends for compatible.
116
- * @read: The general read operation. Both of the function parameters
117
- * @size and @offset are relative value to bock device (not the
118
- * whole disk).
119
- * On success, the number of bytes should be returned, others
120
- * means error.
121
- * @write: The same as @read, but the following error number:
122
- * -EBUSY means try to write again later.
123
- * -ENOMSG means to try next zone.
124
- * @panic_write:The write operation only used for panic case. It's optional
125
- * if you do not care panic log. The parameters are relative
126
- * value to storage.
127
- * On success, the number of bytes should be returned, others
128
- * excluding -ENOMSG mean error. -ENOMSG means to try next zone.
129
- */
130
- struct pstore_device_info {
131
- unsigned long total_size ;
132
- unsigned int flags ;
133
- pstore_zone_read_op read ;
134
- pstore_zone_write_op write ;
135
- pstore_zone_write_op panic_write ;
136
- };
137
-
138
- static int psblk_register_do (struct pstore_device_info * dev )
108
+ static int __register_pstore_device (struct pstore_device_info * dev )
139
109
{
140
110
int ret ;
141
111
112
+ lockdep_assert_held (& pstore_blk_lock );
113
+
142
114
if (!dev || !dev -> total_size || !dev -> read || !dev -> write )
143
115
return - EINVAL ;
144
116
145
- mutex_lock (& pstore_blk_lock );
146
-
147
117
/* someone already registered before */
148
- if (pstore_zone_info ) {
149
- mutex_unlock (& pstore_blk_lock );
118
+ if (pstore_zone_info )
150
119
return - EBUSY ;
151
- }
120
+
152
121
pstore_zone_info = kzalloc (sizeof (struct pstore_zone_info ), GFP_KERNEL );
153
- if (!pstore_zone_info ) {
154
- mutex_unlock (& pstore_blk_lock );
122
+ if (!pstore_zone_info )
155
123
return - ENOMEM ;
156
- }
157
124
158
125
/* zero means not limit on which backends to attempt to store. */
159
126
if (!dev -> flags )
@@ -179,6 +146,7 @@ static int psblk_register_do(struct pstore_device_info *dev)
179
146
pstore_zone_info -> max_reason = max_reason ;
180
147
pstore_zone_info -> read = dev -> read ;
181
148
pstore_zone_info -> write = dev -> write ;
149
+ pstore_zone_info -> erase = dev -> erase ;
182
150
pstore_zone_info -> panic_write = dev -> panic_write ;
183
151
pstore_zone_info -> name = KBUILD_MODNAME ;
184
152
pstore_zone_info -> owner = THIS_MODULE ;
@@ -188,20 +156,51 @@ static int psblk_register_do(struct pstore_device_info *dev)
188
156
kfree (pstore_zone_info );
189
157
pstore_zone_info = NULL ;
190
158
}
159
+ return ret ;
160
+ }
161
+ /**
162
+ * register_pstore_device() - register non-block device to pstore/blk
163
+ *
164
+ * @dev: non-block device information
165
+ *
166
+ * Return:
167
+ * * 0 - OK
168
+ * * Others - something error.
169
+ */
170
+ int register_pstore_device (struct pstore_device_info * dev )
171
+ {
172
+ int ret ;
173
+
174
+ mutex_lock (& pstore_blk_lock );
175
+ ret = __register_pstore_device (dev );
191
176
mutex_unlock (& pstore_blk_lock );
177
+
192
178
return ret ;
193
179
}
180
+ EXPORT_SYMBOL_GPL (register_pstore_device );
194
181
195
- static void psblk_unregister_do (struct pstore_device_info * dev )
182
+ static void __unregister_pstore_device (struct pstore_device_info * dev )
196
183
{
197
- mutex_lock (& pstore_blk_lock );
184
+ lockdep_assert_held (& pstore_blk_lock );
198
185
if (pstore_zone_info && pstore_zone_info -> read == dev -> read ) {
199
186
unregister_pstore_zone (pstore_zone_info );
200
187
kfree (pstore_zone_info );
201
188
pstore_zone_info = NULL ;
202
189
}
190
+ }
191
+
192
+ /**
193
+ * unregister_pstore_device() - unregister non-block device from pstore/blk
194
+ *
195
+ * @dev: non-block device information
196
+ */
197
+ void unregister_pstore_device (struct pstore_device_info * dev )
198
+ {
199
+ mutex_lock (& pstore_blk_lock );
200
+ __unregister_pstore_device (dev );
203
201
mutex_unlock (& pstore_blk_lock );
204
202
}
203
+ EXPORT_SYMBOL_GPL (unregister_pstore_device );
205
204
206
205
/**
207
206
* psblk_get_bdev() - open block device
@@ -396,9 +395,10 @@ static int __register_pstore_blk(struct pstore_blk_info *info)
396
395
dev .flags = info -> flags ;
397
396
dev .read = psblk_generic_blk_read ;
398
397
dev .write = psblk_generic_blk_write ;
398
+ dev .erase = NULL ;
399
399
dev .panic_write = info -> panic_write ? psblk_blk_panic_write : NULL ;
400
400
401
- ret = psblk_register_do (& dev );
401
+ ret = __register_pstore_device (& dev );
402
402
if (ret )
403
403
goto err_put_bdev ;
404
404
@@ -442,7 +442,7 @@ static void __unregister_pstore_blk(unsigned int major)
442
442
443
443
lockdep_assert_held (& pstore_blk_lock );
444
444
if (psblk_bdev && MAJOR (psblk_bdev -> bd_dev ) == major ) {
445
- psblk_unregister_do (& dev );
445
+ __unregister_pstore_device (& dev );
446
446
psblk_put_bdev (psblk_bdev , holder );
447
447
blkdev_panic_write = NULL ;
448
448
psblk_bdev = NULL ;
@@ -481,6 +481,13 @@ static void __exit pstore_blk_exit(void)
481
481
mutex_lock (& pstore_blk_lock );
482
482
if (psblk_bdev )
483
483
__unregister_pstore_blk (MAJOR (psblk_bdev -> bd_dev ));
484
+ else {
485
+ struct pstore_device_info dev = { };
486
+
487
+ if (pstore_zone_info )
488
+ dev .read = pstore_zone_info -> read ;
489
+ __unregister_pstore_device (& dev );
490
+ }
484
491
mutex_unlock (& pstore_blk_lock );
485
492
}
486
493
module_exit (pstore_blk_exit );
0 commit comments