Shane,

All great suggestions.

I've gone ahead and implemented these and also applied your comments to our
other attributes as well.  Will include in our next push of fixes.


-matt

On Jul 2, 2015, at 3:08 AM, Seymour, Shane M wrote:

> -----Original Message-----
> From: linux-scsi-ow...@vger.kernel.org 
> [mailto:linux-scsi-ow...@vger.kernel.org] On Behalf Of Matthew R. Ochs
> Sent: Monday, April 27, 2015 2:50 PM
> To: linux-scsi@vger.kernel.org; james.bottom...@hansenpartnership.com; 
> n...@linux-iscsi.org; brk...@linux.vnet.ibm.com
> Cc: mi...@neuling.org; imun...@au1.ibm.com; Manoj N. Kumar
> Subject: [PATCH RFC 1/2] cxlflash: Base support for IBM CXL Flash Adapter
> 
>> +static ssize_t cxlflash_show_port_status(struct device *dev,
>> +                                     struct device_attribute *attr,
>> +                                     char *buf)
>> +{
>> +    struct Scsi_Host *shost = class_to_shost(dev);
>> +    struct cxlflash *cxlflash = (struct cxlflash *)shost->hostdata;
>> +    struct afu *afu = cxlflash->afu;
>> +
>> +    char *disp_status;
>> +    int rc;
>> +    u32 port;
>> +    u64 status;
>> +    volatile u64 *fc_regs;
>> +
>> +    rc = kstrtouint((attr->attr.name + 4), 10, &port);
>> +    if (rc || (port > NUM_FC_PORTS))
>> +            return 0;
>> +
>> +    fc_regs = &afu->afu_map->global.fc_regs[port][0];
>> +    status =
>> +        (readq_be(&fc_regs[FC_MTIP_STATUS / 8]) & FC_MTIP_STATUS_MASK);
>> +
>> +    if (status == FC_MTIP_STATUS_ONLINE)
>> +            disp_status = "online";
>> +    else if (status == FC_MTIP_STATUS_OFFLINE)
>> +            disp_status = "offline";
>> +    else
>> +            disp_status = "unknown";
>> +
>> +    return snprintf(buf, PAGE_SIZE, "%s\n", disp_status);
> 
> You need to use scnprintf() instead of snprintf() here
> 
>> +static ssize_t cxlflash_show_lun_mode(struct device *dev,
>> +                                  struct device_attribute *attr, char *buf)
>> +{
>> +    struct Scsi_Host *shost = class_to_shost(dev);
>> +    struct cxlflash *cxlflash = (struct cxlflash *)shost->hostdata;
>> +    struct afu *afu = cxlflash->afu;
>> +
>> +    return snprintf(buf, PAGE_SIZE, "%u\n", afu->internal_lun);
> 
> See above about snprintf()
> 
> +static DEVICE_ATTR(port0, S_IRUGO, cxlflash_show_port_status, NULL);
> +static DEVICE_ATTR(port1, S_IRUGO, cxlflash_show_port_status, NULL);
> +static DEVICE_ATTR(lun_mode, S_IRUGO | S_IWUSR, cxlflash_show_lun_mode,
> +                cxlflash_store_lun_mode);
> 
> Please use DEVICE_ATTR_RO and DEVICE_ATTR_RW as appropriate if you can, you 
> will need to change the show/store function names. The main reason I know for 
> doing this is (using DEVICE_ATTR_RO as an example) if someone sees a sysfs 
> attribute called port0 or port1 they should be able to search the kernel 
> source to find a function called port0_show or port1_show without having to 
> spend any extra time searching to find out what the driver is and then look 
> at the driver source to find that they need to look at 
> cxlflash_show_port_status. Using DEVICE_ATTR_RO for port0 and port1 would 
> probably change the code to looking something like this:
> 
> static ssize_t cxlflash_show_port_status(u32 port,
>       struct afu *afu, char *buf)
> {
>       char *disp_status;
>       u64 status;
>       volatile u64 *fc_regs;
> 
>       fc_regs = &afu->afu_map->global.fc_regs[port][0];
>       /* I split this line into two because I had to really look at where
>        * the brackets were and this made it more obvious to me
>        * what it was doing but that could just be me. */
>       status = readq_be(&fc_regs[FC_MTIP_STATUS / 8]);
>       status &= FC_MTIP_STATUS_MASK;
> 
>       if (status == FC_MTIP_STATUS_ONLINE)
>               disp_status = "online";
>       else if (status == FC_MTIP_STATUS_OFFLINE)
>               disp_status = "offline";
>       else
>               disp_status = "unknown";
> 
>       return scnprintf(buf, PAGE_SIZE, "%s\n", disp_status);
> }
> 
> Since you have fixed values you could use also sprintf here (although the 
> documentation currently says to only use scnprintf) and that would make 
> port0_show and port1_show to be:
> 
> static ssize_t port0_show(struct device *dev,
>       struct device_attribute *attr,
>       char *buf)
> {
>       struct Scsi_Host *shost = class_to_shost(dev);
>       struct cxlflash *cxlflash = (struct cxlflash *)shost->hostdata;
>       struct afu *afu = cxlflash->afu;
> 
>       return cxlflash_show_port_status(0, afu, buf);
> }
> 
> static ssize_t port1_show(struct device *dev,
>       struct device_attribute *attr,
>       char *buf)
> {
>       struct Scsi_Host *shost = class_to_shost(dev);
>       struct cxlflash *cxlflash = (struct cxlflash *)shost->hostdata;
>       struct afu *afu = cxlflash->afu;
> 
>       return cxlflash_show_port_status(1, afu, buf);
> }
> 
> I'm assuming that 0 and 1 are always valid for port number and don't need to 
> be checked against NUM_FC_PORTS. That's just a suggestion and I haven't 
> attempted to compile the above example and you'd need to test it to make sure 
> that they still work as expected.
> 
> Shane
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to