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/compat.h>
15 #include <linux/slab.h>
16 #include <linux/types.h>
17 #include <linux/miscdevice.h>
18 #include <asm/compat.h>
19 #include <asm/ccwdev.h>
24 #define ZFCP_CFDC_CMND_DOWNLOAD_NORMAL 0x00010001
25 #define ZFCP_CFDC_CMND_DOWNLOAD_FORCE 0x00010101
26 #define ZFCP_CFDC_CMND_FULL_ACCESS 0x00000201
27 #define ZFCP_CFDC_CMND_RESTRICTED_ACCESS 0x00000401
28 #define ZFCP_CFDC_CMND_UPLOAD 0x00010002
30 #define ZFCP_CFDC_DOWNLOAD 0x00000001
31 #define ZFCP_CFDC_UPLOAD 0x00000002
32 #define ZFCP_CFDC_WITH_CONTROL_FILE 0x00010000
34 #define ZFCP_CFDC_IOC_MAGIC 0xDD
35 #define ZFCP_CFDC_IOC \
36 _IOWR(ZFCP_CFDC_IOC_MAGIC, 0, struct zfcp_cfdc_data)
39 * struct zfcp_cfdc_data - data for ioctl cfdc interface
40 * @signature: request signature
41 * @devno: FCP adapter device number
42 * @command: command code
43 * @fsf_status: returns status of FSF command to userspace
44 * @fsf_status_qual: returned to userspace
45 * @payloads: access conflicts list
46 * @control_file: access control table
48 struct zfcp_cfdc_data
{
53 u8 fsf_status_qual
[FSF_STATUS_QUALIFIER_SIZE
];
58 static int zfcp_cfdc_copy_from_user(struct scatterlist
*sg
,
59 void __user
*user_buffer
)
62 unsigned int size
= ZFCP_CFDC_MAX_SIZE
;
65 length
= min((unsigned int)size
, sg
->length
);
66 if (copy_from_user(sg_virt(sg
++), user_buffer
, length
))
68 user_buffer
+= length
;
74 static int zfcp_cfdc_copy_to_user(void __user
*user_buffer
,
75 struct scatterlist
*sg
)
78 unsigned int size
= ZFCP_CFDC_MAX_SIZE
;
81 length
= min((unsigned int) size
, sg
->length
);
82 if (copy_to_user(user_buffer
, sg_virt(sg
++), length
))
84 user_buffer
+= length
;
90 static struct zfcp_adapter
*zfcp_cfdc_get_adapter(u32 devno
)
93 struct ccw_device
*cdev
;
94 struct zfcp_adapter
*adapter
;
96 snprintf(busid
, sizeof(busid
), "0.0.%04x", devno
);
97 cdev
= get_ccwdev_by_busid(&zfcp_ccw_driver
, busid
);
101 adapter
= zfcp_ccw_adapter_by_cdev(cdev
);
103 put_device(&cdev
->dev
);
107 static int zfcp_cfdc_set_fsf(struct zfcp_fsf_cfdc
*fsf_cfdc
, int command
)
110 case ZFCP_CFDC_CMND_DOWNLOAD_NORMAL
:
111 fsf_cfdc
->command
= FSF_QTCB_DOWNLOAD_CONTROL_FILE
;
112 fsf_cfdc
->option
= FSF_CFDC_OPTION_NORMAL_MODE
;
114 case ZFCP_CFDC_CMND_DOWNLOAD_FORCE
:
115 fsf_cfdc
->command
= FSF_QTCB_DOWNLOAD_CONTROL_FILE
;
116 fsf_cfdc
->option
= FSF_CFDC_OPTION_FORCE
;
118 case ZFCP_CFDC_CMND_FULL_ACCESS
:
119 fsf_cfdc
->command
= FSF_QTCB_DOWNLOAD_CONTROL_FILE
;
120 fsf_cfdc
->option
= FSF_CFDC_OPTION_FULL_ACCESS
;
122 case ZFCP_CFDC_CMND_RESTRICTED_ACCESS
:
123 fsf_cfdc
->command
= FSF_QTCB_DOWNLOAD_CONTROL_FILE
;
124 fsf_cfdc
->option
= FSF_CFDC_OPTION_RESTRICTED_ACCESS
;
126 case ZFCP_CFDC_CMND_UPLOAD
:
127 fsf_cfdc
->command
= FSF_QTCB_UPLOAD_CONTROL_FILE
;
128 fsf_cfdc
->option
= 0;
137 static int zfcp_cfdc_sg_setup(int command
, struct scatterlist
*sg
,
138 u8 __user
*control_file
)
141 retval
= zfcp_sg_setup_table(sg
, ZFCP_CFDC_PAGES
);
145 sg
[ZFCP_CFDC_PAGES
- 1].length
= ZFCP_CFDC_MAX_SIZE
% PAGE_SIZE
;
147 if (command
& ZFCP_CFDC_WITH_CONTROL_FILE
&&
148 command
& ZFCP_CFDC_DOWNLOAD
) {
149 retval
= zfcp_cfdc_copy_from_user(sg
, control_file
);
151 zfcp_sg_free_table(sg
, ZFCP_CFDC_PAGES
);
159 static void zfcp_cfdc_req_to_sense(struct zfcp_cfdc_data
*data
,
160 struct zfcp_fsf_req
*req
)
162 data
->fsf_status
= req
->qtcb
->header
.fsf_status
;
163 memcpy(&data
->fsf_status_qual
, &req
->qtcb
->header
.fsf_status_qual
,
164 sizeof(union fsf_status_qual
));
165 memcpy(&data
->payloads
, &req
->qtcb
->bottom
.support
.els
,
166 sizeof(req
->qtcb
->bottom
.support
.els
));
169 static long zfcp_cfdc_dev_ioctl(struct file
*file
, unsigned int command
,
172 struct zfcp_cfdc_data
*data
;
173 struct zfcp_cfdc_data __user
*data_user
;
174 struct zfcp_adapter
*adapter
;
175 struct zfcp_fsf_req
*req
;
176 struct zfcp_fsf_cfdc
*fsf_cfdc
;
179 if (command
!= ZFCP_CFDC_IOC
)
182 if (is_compat_task())
183 data_user
= compat_ptr(arg
);
185 data_user
= (void __user
*)arg
;
190 fsf_cfdc
= kmalloc(sizeof(struct zfcp_fsf_cfdc
), GFP_KERNEL
);
194 data
= memdup_user(data_user
, sizeof(*data_user
));
196 retval
= PTR_ERR(data
);
200 if (data
->signature
!= 0xCFDCACDF) {
205 retval
= zfcp_cfdc_set_fsf(fsf_cfdc
, data
->command
);
207 adapter
= zfcp_cfdc_get_adapter(data
->devno
);
213 retval
= zfcp_cfdc_sg_setup(data
->command
, fsf_cfdc
->sg
,
214 data_user
->control_file
);
217 req
= zfcp_fsf_control_file(adapter
, fsf_cfdc
);
219 retval
= PTR_ERR(req
);
223 if (req
->status
& ZFCP_STATUS_FSFREQ_ERROR
) {
228 zfcp_cfdc_req_to_sense(data
, req
);
229 retval
= copy_to_user(data_user
, data
, sizeof(*data_user
));
235 if (data
->command
& ZFCP_CFDC_UPLOAD
)
236 retval
= zfcp_cfdc_copy_to_user(&data_user
->control_file
,
240 zfcp_fsf_req_free(req
);
242 zfcp_sg_free_table(fsf_cfdc
->sg
, ZFCP_CFDC_PAGES
);
244 zfcp_ccw_adapter_put(adapter
);
252 static const struct file_operations zfcp_cfdc_fops
= {
253 .open
= nonseekable_open
,
254 .unlocked_ioctl
= zfcp_cfdc_dev_ioctl
,
256 .compat_ioctl
= zfcp_cfdc_dev_ioctl
,
261 struct miscdevice zfcp_cfdc_misc
= {
262 .minor
= MISC_DYNAMIC_MINOR
,
264 .fops
= &zfcp_cfdc_fops
,
268 * zfcp_cfdc_adapter_access_changed - Process change in adapter ACT
269 * @adapter: Adapter where the Access Control Table (ACT) changed
271 * After a change in the adapter ACT, check if access to any
272 * previously denied resources is now possible.
274 void zfcp_cfdc_adapter_access_changed(struct zfcp_adapter
*adapter
)
277 struct zfcp_port
*port
;
278 struct scsi_device
*sdev
;
279 struct zfcp_scsi_dev
*zfcp_sdev
;
282 if (adapter
->connection_features
& FSF_FEATURE_NPIV_MODE
)
285 read_lock_irqsave(&adapter
->port_list_lock
, flags
);
286 list_for_each_entry(port
, &adapter
->port_list
, list
) {
287 status
= atomic_read(&port
->status
);
288 if ((status
& ZFCP_STATUS_COMMON_ACCESS_DENIED
) ||
289 (status
& ZFCP_STATUS_COMMON_ACCESS_BOXED
))
290 zfcp_erp_port_reopen(port
,
291 ZFCP_STATUS_COMMON_ERP_FAILED
,
294 read_unlock_irqrestore(&adapter
->port_list_lock
, flags
);
296 shost_for_each_device(sdev
, port
->adapter
->scsi_host
) {
297 zfcp_sdev
= sdev_to_zfcp(sdev
);
298 status
= atomic_read(&zfcp_sdev
->status
);
299 if ((status
& ZFCP_STATUS_COMMON_ACCESS_DENIED
) ||
300 (status
& ZFCP_STATUS_COMMON_ACCESS_BOXED
))
301 zfcp_erp_lun_reopen(sdev
,
302 ZFCP_STATUS_COMMON_ERP_FAILED
,
307 static void zfcp_act_eval_err(struct zfcp_adapter
*adapter
, u32 table
)
309 u16 subtable
= table
>> 16;
310 u16 rule
= table
& 0xffff;
311 const char *act_type
[] = { "unknown", "OS", "WWPN", "DID", "LUN" };
313 if (subtable
&& subtable
< ARRAY_SIZE(act_type
))
314 dev_warn(&adapter
->ccw_device
->dev
,
315 "Access denied according to ACT rule type %s, "
316 "rule %d\n", act_type
[subtable
], rule
);
320 * zfcp_cfdc_port_denied - Process "access denied" for port
321 * @port: The port where the access has been denied
322 * @qual: The FSF status qualifier for the access denied FSF status
324 void zfcp_cfdc_port_denied(struct zfcp_port
*port
,
325 union fsf_status_qual
*qual
)
327 dev_warn(&port
->adapter
->ccw_device
->dev
,
328 "Access denied to port 0x%016Lx\n",
329 (unsigned long long)port
->wwpn
);
331 zfcp_act_eval_err(port
->adapter
, qual
->halfword
[0]);
332 zfcp_act_eval_err(port
->adapter
, qual
->halfword
[1]);
333 zfcp_erp_set_port_status(port
,
334 ZFCP_STATUS_COMMON_ERP_FAILED
|
335 ZFCP_STATUS_COMMON_ACCESS_DENIED
);
339 * zfcp_cfdc_lun_denied - Process "access denied" for LUN
340 * @sdev: The SCSI device / LUN where the access has been denied
341 * @qual: The FSF status qualifier for the access denied FSF status
343 void zfcp_cfdc_lun_denied(struct scsi_device
*sdev
,
344 union fsf_status_qual
*qual
)
346 struct zfcp_scsi_dev
*zfcp_sdev
= sdev_to_zfcp(sdev
);
348 dev_warn(&zfcp_sdev
->port
->adapter
->ccw_device
->dev
,
349 "Access denied to LUN 0x%016Lx on port 0x%016Lx\n",
350 zfcp_scsi_dev_lun(sdev
),
351 (unsigned long long)zfcp_sdev
->port
->wwpn
);
352 zfcp_act_eval_err(zfcp_sdev
->port
->adapter
, qual
->halfword
[0]);
353 zfcp_act_eval_err(zfcp_sdev
->port
->adapter
, qual
->halfword
[1]);
354 zfcp_erp_set_lun_status(sdev
,
355 ZFCP_STATUS_COMMON_ERP_FAILED
|
356 ZFCP_STATUS_COMMON_ACCESS_DENIED
);
358 atomic_clear_mask(ZFCP_STATUS_LUN_SHARED
, &zfcp_sdev
->status
);
359 atomic_clear_mask(ZFCP_STATUS_LUN_READONLY
, &zfcp_sdev
->status
);
363 * zfcp_cfdc_lun_shrng_vltn - Evaluate LUN sharing violation status
364 * @sdev: The LUN / SCSI device where sharing violation occurred
365 * @qual: The FSF status qualifier from the LUN sharing violation
367 void zfcp_cfdc_lun_shrng_vltn(struct scsi_device
*sdev
,
368 union fsf_status_qual
*qual
)
370 struct zfcp_scsi_dev
*zfcp_sdev
= sdev_to_zfcp(sdev
);
373 dev_warn(&zfcp_sdev
->port
->adapter
->ccw_device
->dev
,
374 "LUN 0x%Lx on port 0x%Lx is already in "
375 "use by CSS%d, MIF Image ID %x\n",
376 zfcp_scsi_dev_lun(sdev
),
377 (unsigned long long)zfcp_sdev
->port
->wwpn
,
378 qual
->fsf_queue_designator
.cssid
,
379 qual
->fsf_queue_designator
.hla
);
381 zfcp_act_eval_err(zfcp_sdev
->port
->adapter
, qual
->word
[2]);
383 zfcp_erp_set_lun_status(sdev
,
384 ZFCP_STATUS_COMMON_ERP_FAILED
|
385 ZFCP_STATUS_COMMON_ACCESS_DENIED
);
386 atomic_clear_mask(ZFCP_STATUS_LUN_SHARED
, &zfcp_sdev
->status
);
387 atomic_clear_mask(ZFCP_STATUS_LUN_READONLY
, &zfcp_sdev
->status
);
391 * zfcp_cfdc_open_lun_eval - Eval access ctrl. status for successful "open lun"
392 * @sdev: The SCSI device / LUN where to evaluate the status
393 * @bottom: The qtcb bottom with the status from the "open lun"
395 * Returns: 0 if LUN is usable, -EACCES if the access control table
396 * reports an unsupported configuration.
398 int zfcp_cfdc_open_lun_eval(struct scsi_device
*sdev
,
399 struct fsf_qtcb_bottom_support
*bottom
)
402 struct zfcp_scsi_dev
*zfcp_sdev
= sdev_to_zfcp(sdev
);
403 struct zfcp_adapter
*adapter
= zfcp_sdev
->port
->adapter
;
405 if ((adapter
->connection_features
& FSF_FEATURE_NPIV_MODE
) ||
406 !(adapter
->adapter_features
& FSF_FEATURE_LUN_SHARING
) ||
407 zfcp_ccw_priv_sch(adapter
))
410 shared
= !(bottom
->lun_access_info
& FSF_UNIT_ACCESS_EXCLUSIVE
);
411 rw
= (bottom
->lun_access_info
& FSF_UNIT_ACCESS_OUTBOUND_TRANSFER
);
414 atomic_set_mask(ZFCP_STATUS_LUN_SHARED
, &zfcp_sdev
->status
);
417 atomic_set_mask(ZFCP_STATUS_LUN_READONLY
, &zfcp_sdev
->status
);
418 dev_info(&adapter
->ccw_device
->dev
, "SCSI device at LUN "
419 "0x%016Lx on port 0x%016Lx opened read-only\n",
420 zfcp_scsi_dev_lun(sdev
),
421 (unsigned long long)zfcp_sdev
->port
->wwpn
);
424 if (!shared
&& !rw
) {
425 dev_err(&adapter
->ccw_device
->dev
, "Exclusive read-only access "
426 "not supported (LUN 0x%016Lx, port 0x%016Lx)\n",
427 zfcp_scsi_dev_lun(sdev
),
428 (unsigned long long)zfcp_sdev
->port
->wwpn
);
429 zfcp_erp_set_lun_status(sdev
, ZFCP_STATUS_COMMON_ERP_FAILED
);
430 zfcp_erp_lun_shutdown(sdev
, 0, "fsouh_6");
435 dev_err(&adapter
->ccw_device
->dev
,
436 "Shared read-write access not supported "
437 "(LUN 0x%016Lx, port 0x%016Lx)\n",
438 zfcp_scsi_dev_lun(sdev
),
439 (unsigned long long)zfcp_sdev
->port
->wwpn
);
440 zfcp_erp_set_lun_status(sdev
, ZFCP_STATUS_COMMON_ERP_FAILED
);
441 zfcp_erp_lun_shutdown(sdev
, 0, "fsosh_8");