4 * Userspace interface for accessing the
5 * Access Control Lists / Control File Data Channel;
6 * handling of response code and states for ports and LUNs.
8 * Copyright IBM Corporation 2008, 2010
11 #define KMSG_COMPONENT "zfcp"
12 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
14 #include <linux/slab.h>
15 #include <linux/types.h>
16 #include <linux/miscdevice.h>
17 #include <asm/compat.h>
18 #include <asm/ccwdev.h>
23 #define ZFCP_CFDC_CMND_DOWNLOAD_NORMAL 0x00010001
24 #define ZFCP_CFDC_CMND_DOWNLOAD_FORCE 0x00010101
25 #define ZFCP_CFDC_CMND_FULL_ACCESS 0x00000201
26 #define ZFCP_CFDC_CMND_RESTRICTED_ACCESS 0x00000401
27 #define ZFCP_CFDC_CMND_UPLOAD 0x00010002
29 #define ZFCP_CFDC_DOWNLOAD 0x00000001
30 #define ZFCP_CFDC_UPLOAD 0x00000002
31 #define ZFCP_CFDC_WITH_CONTROL_FILE 0x00010000
33 #define ZFCP_CFDC_IOC_MAGIC 0xDD
34 #define ZFCP_CFDC_IOC \
35 _IOWR(ZFCP_CFDC_IOC_MAGIC, 0, struct zfcp_cfdc_data)
38 * struct zfcp_cfdc_data - data for ioctl cfdc interface
39 * @signature: request signature
40 * @devno: FCP adapter device number
41 * @command: command code
42 * @fsf_status: returns status of FSF command to userspace
43 * @fsf_status_qual: returned to userspace
44 * @payloads: access conflicts list
45 * @control_file: access control table
47 struct zfcp_cfdc_data
{
52 u8 fsf_status_qual
[FSF_STATUS_QUALIFIER_SIZE
];
57 static int zfcp_cfdc_copy_from_user(struct scatterlist
*sg
,
58 void __user
*user_buffer
)
61 unsigned int size
= ZFCP_CFDC_MAX_SIZE
;
64 length
= min((unsigned int)size
, sg
->length
);
65 if (copy_from_user(sg_virt(sg
++), user_buffer
, length
))
67 user_buffer
+= length
;
73 static int zfcp_cfdc_copy_to_user(void __user
*user_buffer
,
74 struct scatterlist
*sg
)
77 unsigned int size
= ZFCP_CFDC_MAX_SIZE
;
80 length
= min((unsigned int) size
, sg
->length
);
81 if (copy_to_user(user_buffer
, sg_virt(sg
++), length
))
83 user_buffer
+= length
;
89 static struct zfcp_adapter
*zfcp_cfdc_get_adapter(u32 devno
)
92 struct ccw_device
*cdev
;
93 struct zfcp_adapter
*adapter
;
95 snprintf(busid
, sizeof(busid
), "0.0.%04x", devno
);
96 cdev
= get_ccwdev_by_busid(&zfcp_ccw_driver
, busid
);
100 adapter
= zfcp_ccw_adapter_by_cdev(cdev
);
102 put_device(&cdev
->dev
);
106 static int zfcp_cfdc_set_fsf(struct zfcp_fsf_cfdc
*fsf_cfdc
, int command
)
109 case ZFCP_CFDC_CMND_DOWNLOAD_NORMAL
:
110 fsf_cfdc
->command
= FSF_QTCB_DOWNLOAD_CONTROL_FILE
;
111 fsf_cfdc
->option
= FSF_CFDC_OPTION_NORMAL_MODE
;
113 case ZFCP_CFDC_CMND_DOWNLOAD_FORCE
:
114 fsf_cfdc
->command
= FSF_QTCB_DOWNLOAD_CONTROL_FILE
;
115 fsf_cfdc
->option
= FSF_CFDC_OPTION_FORCE
;
117 case ZFCP_CFDC_CMND_FULL_ACCESS
:
118 fsf_cfdc
->command
= FSF_QTCB_DOWNLOAD_CONTROL_FILE
;
119 fsf_cfdc
->option
= FSF_CFDC_OPTION_FULL_ACCESS
;
121 case ZFCP_CFDC_CMND_RESTRICTED_ACCESS
:
122 fsf_cfdc
->command
= FSF_QTCB_DOWNLOAD_CONTROL_FILE
;
123 fsf_cfdc
->option
= FSF_CFDC_OPTION_RESTRICTED_ACCESS
;
125 case ZFCP_CFDC_CMND_UPLOAD
:
126 fsf_cfdc
->command
= FSF_QTCB_UPLOAD_CONTROL_FILE
;
127 fsf_cfdc
->option
= 0;
136 static int zfcp_cfdc_sg_setup(int command
, struct scatterlist
*sg
,
137 u8 __user
*control_file
)
140 retval
= zfcp_sg_setup_table(sg
, ZFCP_CFDC_PAGES
);
144 sg
[ZFCP_CFDC_PAGES
- 1].length
= ZFCP_CFDC_MAX_SIZE
% PAGE_SIZE
;
146 if (command
& ZFCP_CFDC_WITH_CONTROL_FILE
&&
147 command
& ZFCP_CFDC_DOWNLOAD
) {
148 retval
= zfcp_cfdc_copy_from_user(sg
, control_file
);
150 zfcp_sg_free_table(sg
, ZFCP_CFDC_PAGES
);
158 static void zfcp_cfdc_req_to_sense(struct zfcp_cfdc_data
*data
,
159 struct zfcp_fsf_req
*req
)
161 data
->fsf_status
= req
->qtcb
->header
.fsf_status
;
162 memcpy(&data
->fsf_status_qual
, &req
->qtcb
->header
.fsf_status_qual
,
163 sizeof(union fsf_status_qual
));
164 memcpy(&data
->payloads
, &req
->qtcb
->bottom
.support
.els
,
165 sizeof(req
->qtcb
->bottom
.support
.els
));
168 static long zfcp_cfdc_dev_ioctl(struct file
*file
, unsigned int command
,
171 struct zfcp_cfdc_data
*data
;
172 struct zfcp_cfdc_data __user
*data_user
;
173 struct zfcp_adapter
*adapter
;
174 struct zfcp_fsf_req
*req
;
175 struct zfcp_fsf_cfdc
*fsf_cfdc
;
178 if (command
!= ZFCP_CFDC_IOC
)
181 if (is_compat_task())
182 data_user
= compat_ptr(arg
);
184 data_user
= (void __user
*)arg
;
189 fsf_cfdc
= kmalloc(sizeof(struct zfcp_fsf_cfdc
), GFP_KERNEL
);
193 data
= memdup_user(data_user
, sizeof(*data_user
));
195 retval
= PTR_ERR(data
);
199 if (data
->signature
!= 0xCFDCACDF) {
204 retval
= zfcp_cfdc_set_fsf(fsf_cfdc
, data
->command
);
206 adapter
= zfcp_cfdc_get_adapter(data
->devno
);
212 retval
= zfcp_cfdc_sg_setup(data
->command
, fsf_cfdc
->sg
,
213 data_user
->control_file
);
216 req
= zfcp_fsf_control_file(adapter
, fsf_cfdc
);
218 retval
= PTR_ERR(req
);
222 if (req
->status
& ZFCP_STATUS_FSFREQ_ERROR
) {
227 zfcp_cfdc_req_to_sense(data
, req
);
228 retval
= copy_to_user(data_user
, data
, sizeof(*data_user
));
234 if (data
->command
& ZFCP_CFDC_UPLOAD
)
235 retval
= zfcp_cfdc_copy_to_user(&data_user
->control_file
,
239 zfcp_fsf_req_free(req
);
241 zfcp_sg_free_table(fsf_cfdc
->sg
, ZFCP_CFDC_PAGES
);
243 zfcp_ccw_adapter_put(adapter
);
251 static const struct file_operations zfcp_cfdc_fops
= {
252 .open
= nonseekable_open
,
253 .unlocked_ioctl
= zfcp_cfdc_dev_ioctl
,
255 .compat_ioctl
= zfcp_cfdc_dev_ioctl
,
260 struct miscdevice zfcp_cfdc_misc
= {
261 .minor
= MISC_DYNAMIC_MINOR
,
263 .fops
= &zfcp_cfdc_fops
,
267 * zfcp_cfdc_adapter_access_changed - Process change in adapter ACT
268 * @adapter: Adapter where the Access Control Table (ACT) changed
270 * After a change in the adapter ACT, check if access to any
271 * previously denied resources is now possible.
273 void zfcp_cfdc_adapter_access_changed(struct zfcp_adapter
*adapter
)
276 struct zfcp_port
*port
;
277 struct scsi_device
*sdev
;
278 struct zfcp_scsi_dev
*zfcp_sdev
;
281 if (adapter
->connection_features
& FSF_FEATURE_NPIV_MODE
)
284 read_lock_irqsave(&adapter
->port_list_lock
, flags
);
285 list_for_each_entry(port
, &adapter
->port_list
, list
) {
286 status
= atomic_read(&port
->status
);
287 if ((status
& ZFCP_STATUS_COMMON_ACCESS_DENIED
) ||
288 (status
& ZFCP_STATUS_COMMON_ACCESS_BOXED
))
289 zfcp_erp_port_reopen(port
,
290 ZFCP_STATUS_COMMON_ERP_FAILED
,
293 read_unlock_irqrestore(&adapter
->port_list_lock
, flags
);
295 shost_for_each_device(sdev
, port
->adapter
->scsi_host
) {
296 zfcp_sdev
= sdev_to_zfcp(sdev
);
297 status
= atomic_read(&zfcp_sdev
->status
);
298 if ((status
& ZFCP_STATUS_COMMON_ACCESS_DENIED
) ||
299 (status
& ZFCP_STATUS_COMMON_ACCESS_BOXED
))
300 zfcp_erp_lun_reopen(sdev
,
301 ZFCP_STATUS_COMMON_ERP_FAILED
,
306 static void zfcp_act_eval_err(struct zfcp_adapter
*adapter
, u32 table
)
308 u16 subtable
= table
>> 16;
309 u16 rule
= table
& 0xffff;
310 const char *act_type
[] = { "unknown", "OS", "WWPN", "DID", "LUN" };
312 if (subtable
&& subtable
< ARRAY_SIZE(act_type
))
313 dev_warn(&adapter
->ccw_device
->dev
,
314 "Access denied according to ACT rule type %s, "
315 "rule %d\n", act_type
[subtable
], rule
);
319 * zfcp_cfdc_port_denied - Process "access denied" for port
320 * @port: The port where the access has been denied
321 * @qual: The FSF status qualifier for the access denied FSF status
323 void zfcp_cfdc_port_denied(struct zfcp_port
*port
,
324 union fsf_status_qual
*qual
)
326 dev_warn(&port
->adapter
->ccw_device
->dev
,
327 "Access denied to port 0x%016Lx\n",
328 (unsigned long long)port
->wwpn
);
330 zfcp_act_eval_err(port
->adapter
, qual
->halfword
[0]);
331 zfcp_act_eval_err(port
->adapter
, qual
->halfword
[1]);
332 zfcp_erp_set_port_status(port
,
333 ZFCP_STATUS_COMMON_ERP_FAILED
|
334 ZFCP_STATUS_COMMON_ACCESS_DENIED
);
338 * zfcp_cfdc_lun_denied - Process "access denied" for LUN
339 * @sdev: The SCSI device / LUN where the access has been denied
340 * @qual: The FSF status qualifier for the access denied FSF status
342 void zfcp_cfdc_lun_denied(struct scsi_device
*sdev
,
343 union fsf_status_qual
*qual
)
345 struct zfcp_scsi_dev
*zfcp_sdev
= sdev_to_zfcp(sdev
);
347 dev_warn(&zfcp_sdev
->port
->adapter
->ccw_device
->dev
,
348 "Access denied to LUN 0x%016Lx on port 0x%016Lx\n",
349 zfcp_scsi_dev_lun(sdev
),
350 (unsigned long long)zfcp_sdev
->port
->wwpn
);
351 zfcp_act_eval_err(zfcp_sdev
->port
->adapter
, qual
->halfword
[0]);
352 zfcp_act_eval_err(zfcp_sdev
->port
->adapter
, qual
->halfword
[1]);
353 zfcp_erp_set_lun_status(sdev
,
354 ZFCP_STATUS_COMMON_ERP_FAILED
|
355 ZFCP_STATUS_COMMON_ACCESS_DENIED
);
357 atomic_clear_mask(ZFCP_STATUS_LUN_SHARED
, &zfcp_sdev
->status
);
358 atomic_clear_mask(ZFCP_STATUS_LUN_READONLY
, &zfcp_sdev
->status
);
362 * zfcp_cfdc_lun_shrng_vltn - Evaluate LUN sharing violation status
363 * @sdev: The LUN / SCSI device where sharing violation occurred
364 * @qual: The FSF status qualifier from the LUN sharing violation
366 void zfcp_cfdc_lun_shrng_vltn(struct scsi_device
*sdev
,
367 union fsf_status_qual
*qual
)
369 struct zfcp_scsi_dev
*zfcp_sdev
= sdev_to_zfcp(sdev
);
372 dev_warn(&zfcp_sdev
->port
->adapter
->ccw_device
->dev
,
373 "LUN 0x%Lx on port 0x%Lx is already in "
374 "use by CSS%d, MIF Image ID %x\n",
375 zfcp_scsi_dev_lun(sdev
),
376 (unsigned long long)zfcp_sdev
->port
->wwpn
,
377 qual
->fsf_queue_designator
.cssid
,
378 qual
->fsf_queue_designator
.hla
);
380 zfcp_act_eval_err(zfcp_sdev
->port
->adapter
, qual
->word
[2]);
382 zfcp_erp_set_lun_status(sdev
,
383 ZFCP_STATUS_COMMON_ERP_FAILED
|
384 ZFCP_STATUS_COMMON_ACCESS_DENIED
);
385 atomic_clear_mask(ZFCP_STATUS_LUN_SHARED
, &zfcp_sdev
->status
);
386 atomic_clear_mask(ZFCP_STATUS_LUN_READONLY
, &zfcp_sdev
->status
);
390 * zfcp_cfdc_open_lun_eval - Eval access ctrl. status for successful "open lun"
391 * @sdev: The SCSI device / LUN where to evaluate the status
392 * @bottom: The qtcb bottom with the status from the "open lun"
394 * Returns: 0 if LUN is usable, -EACCES if the access control table
395 * reports an unsupported configuration.
397 int zfcp_cfdc_open_lun_eval(struct scsi_device
*sdev
,
398 struct fsf_qtcb_bottom_support
*bottom
)
401 struct zfcp_scsi_dev
*zfcp_sdev
= sdev_to_zfcp(sdev
);
402 struct zfcp_adapter
*adapter
= zfcp_sdev
->port
->adapter
;
404 if ((adapter
->connection_features
& FSF_FEATURE_NPIV_MODE
) ||
405 !(adapter
->adapter_features
& FSF_FEATURE_LUN_SHARING
) ||
406 zfcp_ccw_priv_sch(adapter
))
409 shared
= !(bottom
->lun_access_info
& FSF_UNIT_ACCESS_EXCLUSIVE
);
410 rw
= (bottom
->lun_access_info
& FSF_UNIT_ACCESS_OUTBOUND_TRANSFER
);
413 atomic_set_mask(ZFCP_STATUS_LUN_SHARED
, &zfcp_sdev
->status
);
416 atomic_set_mask(ZFCP_STATUS_LUN_READONLY
, &zfcp_sdev
->status
);
417 dev_info(&adapter
->ccw_device
->dev
, "SCSI device at LUN "
418 "0x%016Lx on port 0x%016Lx opened read-only\n",
419 zfcp_scsi_dev_lun(sdev
),
420 (unsigned long long)zfcp_sdev
->port
->wwpn
);
423 if (!shared
&& !rw
) {
424 dev_err(&adapter
->ccw_device
->dev
, "Exclusive read-only access "
425 "not supported (LUN 0x%016Lx, port 0x%016Lx)\n",
426 zfcp_scsi_dev_lun(sdev
),
427 (unsigned long long)zfcp_sdev
->port
->wwpn
);
428 zfcp_erp_set_lun_status(sdev
, ZFCP_STATUS_COMMON_ERP_FAILED
);
429 zfcp_erp_lun_shutdown(sdev
, 0, "fsouh_6");
434 dev_err(&adapter
->ccw_device
->dev
,
435 "Shared read-write access not supported "
436 "(LUN 0x%016Lx, port 0x%016Lx)\n",
437 zfcp_scsi_dev_lun(sdev
),
438 (unsigned long long)zfcp_sdev
->port
->wwpn
);
439 zfcp_erp_set_lun_status(sdev
, ZFCP_STATUS_COMMON_ERP_FAILED
);
440 zfcp_erp_lun_shutdown(sdev
, 0, "fsosh_8");