Loading drivers/scsi/sd.c +23 −0 Original line number Diff line number Diff line Loading @@ -580,6 +580,29 @@ static void scsi_disk_put(struct scsi_disk *sdkp) mutex_unlock(&sd_ref_mutex); } struct gendisk *scsi_gendisk_get_from_dev(struct device *dev) { struct scsi_disk *sdkp; mutex_lock(&sd_ref_mutex); sdkp = dev_get_drvdata(dev); if (sdkp) sdkp = __scsi_disk_get(sdkp->disk); mutex_unlock(&sd_ref_mutex); return !sdkp ? NULL : sdkp->disk; } void scsi_gendisk_put(struct device *dev) { struct scsi_disk *sdkp = dev_get_drvdata(dev); struct scsi_device *sdev = sdkp->device; mutex_lock(&sd_ref_mutex); put_device(&sdkp->dev); scsi_device_put(sdev); mutex_unlock(&sd_ref_mutex); } static void sd_prot_op(struct scsi_cmnd *scmd, unsigned int dif) { unsigned int prot_op = SCSI_PROT_NORMAL; Loading drivers/scsi/ufs/ufs_test.c +32 −13 Original line number Diff line number Diff line Loading @@ -19,10 +19,10 @@ #include <linux/delay.h> #include <linux/module.h> #include <linux/test-iosched.h> #include <scsi/scsi.h> #include <scsi/scsi_device.h> #include <scsi/scsi_cmnd.h> #include <scsi/scsi_host.h> #include <../sd.h> #include "ufshcd.h" #include "ufs.h" Loading Loading @@ -425,29 +425,47 @@ static struct gendisk *ufs_test_get_rq_disk(void) { struct request_queue *req_q = test_iosched_get_req_queue(); struct scsi_device *sd; struct device *dev; struct scsi_disk *sdkp; struct gendisk *gd; if (!req_q) { pr_info("%s: Could not fetch request_queue", __func__); gd = NULL; goto exit; } sd = (struct scsi_device *)req_q->queuedata; if (!sd) { pr_info("%s: req_q is missing required queuedata", __func__); goto exit; } return scsi_gendisk_get_from_dev(&sd->sdev_gendev); exit: return NULL; } static int ufs_test_put_gendisk(struct test_data *td) { struct request_queue *req_q = test_iosched_get_req_queue(); struct scsi_device *sd; int ret = 0; dev = &sd->sdev_gendev; sdkp = scsi_disk_get_from_dev(dev); if (!sdkp) { pr_info("%s: Could not fatch scsi disk", __func__); gd = NULL; if (!req_q) { pr_info("%s: Could not fetch request_queue", __func__); ret = -EINVAL; goto exit; } gd = sdkp->disk; sd = (struct scsi_device *)req_q->queuedata; if (!sd) { pr_info("%s: req_q is missing required queuedata", __func__); ret = -EINVAL; goto exit; } scsi_gendisk_put(&sd->sdev_gendev); exit: return gd; return ret; } static int ufs_test_check_result(struct test_data *td) Loading Loading @@ -1057,7 +1075,7 @@ static int long_rand_test_calc_iops(struct test_data *td) pr_info("%s: IOPS: %lu IOP/sec\n", __func__, iops); return 0; return ufs_test_put_gendisk(td); } static int long_seq_test_calc_throughput(struct test_data *td) Loading Loading @@ -1206,6 +1224,7 @@ static ssize_t ufs_test_write(struct file *file, const char __user *buf, utd->test_info.testcase = test_case; utd->test_info.get_rq_disk_fn = ufs_test_get_rq_disk; utd->test_info.check_test_result_fn = ufs_test_check_result; utd->test_info.post_test_fn = ufs_test_put_gendisk; utd->test_stage = DEFAULT; switch (test_case) { Loading include/scsi/scsi.h +3 −0 Original line number Diff line number Diff line Loading @@ -578,4 +578,7 @@ static inline __u32 scsi_to_u32(__u8 *ptr) struct scsi_disk *scsi_disk_get_from_dev(struct device *dev); struct gendisk *scsi_gendisk_get_from_dev(struct device *dev); void scsi_gendisk_put(struct device *dev); #endif /* _SCSI_SCSI_H */ Loading
drivers/scsi/sd.c +23 −0 Original line number Diff line number Diff line Loading @@ -580,6 +580,29 @@ static void scsi_disk_put(struct scsi_disk *sdkp) mutex_unlock(&sd_ref_mutex); } struct gendisk *scsi_gendisk_get_from_dev(struct device *dev) { struct scsi_disk *sdkp; mutex_lock(&sd_ref_mutex); sdkp = dev_get_drvdata(dev); if (sdkp) sdkp = __scsi_disk_get(sdkp->disk); mutex_unlock(&sd_ref_mutex); return !sdkp ? NULL : sdkp->disk; } void scsi_gendisk_put(struct device *dev) { struct scsi_disk *sdkp = dev_get_drvdata(dev); struct scsi_device *sdev = sdkp->device; mutex_lock(&sd_ref_mutex); put_device(&sdkp->dev); scsi_device_put(sdev); mutex_unlock(&sd_ref_mutex); } static void sd_prot_op(struct scsi_cmnd *scmd, unsigned int dif) { unsigned int prot_op = SCSI_PROT_NORMAL; Loading
drivers/scsi/ufs/ufs_test.c +32 −13 Original line number Diff line number Diff line Loading @@ -19,10 +19,10 @@ #include <linux/delay.h> #include <linux/module.h> #include <linux/test-iosched.h> #include <scsi/scsi.h> #include <scsi/scsi_device.h> #include <scsi/scsi_cmnd.h> #include <scsi/scsi_host.h> #include <../sd.h> #include "ufshcd.h" #include "ufs.h" Loading Loading @@ -425,29 +425,47 @@ static struct gendisk *ufs_test_get_rq_disk(void) { struct request_queue *req_q = test_iosched_get_req_queue(); struct scsi_device *sd; struct device *dev; struct scsi_disk *sdkp; struct gendisk *gd; if (!req_q) { pr_info("%s: Could not fetch request_queue", __func__); gd = NULL; goto exit; } sd = (struct scsi_device *)req_q->queuedata; if (!sd) { pr_info("%s: req_q is missing required queuedata", __func__); goto exit; } return scsi_gendisk_get_from_dev(&sd->sdev_gendev); exit: return NULL; } static int ufs_test_put_gendisk(struct test_data *td) { struct request_queue *req_q = test_iosched_get_req_queue(); struct scsi_device *sd; int ret = 0; dev = &sd->sdev_gendev; sdkp = scsi_disk_get_from_dev(dev); if (!sdkp) { pr_info("%s: Could not fatch scsi disk", __func__); gd = NULL; if (!req_q) { pr_info("%s: Could not fetch request_queue", __func__); ret = -EINVAL; goto exit; } gd = sdkp->disk; sd = (struct scsi_device *)req_q->queuedata; if (!sd) { pr_info("%s: req_q is missing required queuedata", __func__); ret = -EINVAL; goto exit; } scsi_gendisk_put(&sd->sdev_gendev); exit: return gd; return ret; } static int ufs_test_check_result(struct test_data *td) Loading Loading @@ -1057,7 +1075,7 @@ static int long_rand_test_calc_iops(struct test_data *td) pr_info("%s: IOPS: %lu IOP/sec\n", __func__, iops); return 0; return ufs_test_put_gendisk(td); } static int long_seq_test_calc_throughput(struct test_data *td) Loading Loading @@ -1206,6 +1224,7 @@ static ssize_t ufs_test_write(struct file *file, const char __user *buf, utd->test_info.testcase = test_case; utd->test_info.get_rq_disk_fn = ufs_test_get_rq_disk; utd->test_info.check_test_result_fn = ufs_test_check_result; utd->test_info.post_test_fn = ufs_test_put_gendisk; utd->test_stage = DEFAULT; switch (test_case) { Loading
include/scsi/scsi.h +3 −0 Original line number Diff line number Diff line Loading @@ -578,4 +578,7 @@ static inline __u32 scsi_to_u32(__u8 *ptr) struct scsi_disk *scsi_disk_get_from_dev(struct device *dev); struct gendisk *scsi_gendisk_get_from_dev(struct device *dev); void scsi_gendisk_put(struct device *dev); #endif /* _SCSI_SCSI_H */