@@ -142,7 +142,7 @@ int sg_big_buff = SG_DEF_RESERVED_SIZE;
* not enough memory) will be reserved for use by this file descriptor.
*/
static int def_reserved_size = -1; /* picks up init parameter */
-static int sg_allow_dio = SG_ALLOW_DIO_DEF;
+static int sg_allow_dio = SG_ALLOW_DIO_DEF; /* ignored by code */
static int scatter_elem_sz = SG_SCATTER_SZ;
@@ -2862,19 +2862,6 @@ exit_sg(void)
idr_destroy(&sg_index_idr);
}
-static inline bool
-sg_chk_dio_allowed(struct sg_device *sdp, struct sg_request *srp,
- int iov_count, int dir)
-{
- if (sg_allow_dio && (srp->rq_flags & SG_FLAG_DIRECT_IO)) {
- if (dir != SG_DXFER_UNKNOWN && !iov_count) {
- if (!sdp->device->host->unchecked_isa_dma)
- return true;
- }
- }
- return false;
-}
-
static inline void
sg_set_map_data(const struct sg_scatter_hold *schp, bool up_valid,
struct rq_map_data *mdp)
@@ -2893,6 +2880,7 @@ sg_start_req(struct sg_request *srp, struct sg_comm_wr_t *cwrp, int dxfer_dir)
int res = 0;
int dxfer_len = 0;
int r0w = READ;
+ u32 rq_flags = srp->rq_flags;
unsigned int iov_count = 0;
void __user *up;
struct request *rq;
@@ -2973,7 +2961,7 @@ sg_start_req(struct sg_request *srp, struct sg_comm_wr_t *cwrp, int dxfer_dir)
}
scsi_rp->cmd_len = cwrp->cmd_len;
srp->cmd_opcode = scsi_rp->cmd[0];
- us_xfer = !(srp->rq_flags & (SG_FLAG_NO_DXFER | SG_FLAG_MMAP_IO));
+ us_xfer = !(rq_flags & (SG_FLAG_NO_DXFER | SG_FLAG_MMAP_IO));
assign_bit(SG_FRQ_NO_US_XFER, srp->frq_bm, !us_xfer);
reserved = (sfp->rsv_srp == srp);
rq->end_io_data = srp;
@@ -2984,7 +2972,8 @@ sg_start_req(struct sg_request *srp, struct sg_comm_wr_t *cwrp, int dxfer_dir)
SG_LOG(4, sfp, "%s: no data xfer [0x%pK]\n", __func__, srp);
set_bit(SG_FRQ_NO_US_XFER, srp->frq_bm);
goto fini; /* path of reqs with no din nor dout */
- } else if (sg_chk_dio_allowed(sdp, srp, iov_count, dxfer_dir) &&
+ } else if ((rq_flags & SG_FLAG_DIRECT_IO) && iov_count == 0 &&
+ !sdp->device->host->unchecked_isa_dma &&
blk_rq_aligned(q, (unsigned long)up, dxfer_len)) {
srp->rq_info |= SG_INFO_DIRECT_IO;
md = NULL;
@@ -2995,7 +2984,7 @@ sg_start_req(struct sg_request *srp, struct sg_comm_wr_t *cwrp, int dxfer_dir)
}
if (likely(md)) { /* normal, "indirect" IO */
- if (unlikely(srp->rq_flags & SG_FLAG_MMAP_IO)) {
+ if (unlikely(rq_flags & SG_FLAG_MMAP_IO)) {
/* mmap IO must use and fit in reserve request */
if (!reserved || dxfer_len > req_schp->buflen)
res = reserved ? -ENOMEM : -EBUSY;
@@ -3886,6 +3875,7 @@ sg_proc_single_open_adio(struct inode *inode, struct file *filp)
return single_open(filp, sg_proc_seq_show_int, &sg_allow_dio);
}
+/* Kept for backward compatibility. sg_allow_dio is now ignored. */
static ssize_t
sg_proc_write_adio(struct file *filp, const char __user *buffer,
size_t count, loff_t *off)
@@ -4506,6 +4496,6 @@ MODULE_ALIAS_CHARDEV_MAJOR(SCSI_GENERIC_MAJOR);
MODULE_PARM_DESC(scatter_elem_sz, "scatter gather element size (default: max(SG_SCATTER_SZ, PAGE_SIZE))");
MODULE_PARM_DESC(def_reserved_size, "size of buffer reserved for each fd");
-MODULE_PARM_DESC(allow_dio, "allow direct I/O (default: 0 (disallow))");
+MODULE_PARM_DESC(allow_dio, "allow direct I/O (default: 0 (disallow)); now ignored");
module_init(init_sg);
module_exit(exit_sg);