Skip to contentSkip to conversation

sg kill local jiffies problems

PATCH New Douglas Gilbert 1 participant 2 messages Sep 5, 2004 – Sep 6, 2004

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

It has been reported that the change to sg.c in lk 2.6.9-rc1-bk5 to use library jiffy functions breaks sg (albeit under vmware). Evidentally sg devices are no longer recognised after that change.

Reverting that changeset removes the problem. Strange, it is not obvious why.

At some stage I must have detected negative time spans (yeh yeh it never happens) and my versions returned 0 in this case; otherwise the implementations look very similar.

Doug Gilbert

#1 lore raw

PATCH 1/1 sg jiffy library calls [was: sg kill local jiffies problems]

Quoted 10 lines · Douglas Gilbert

It has been reported that the change to sg.c in lk 2.6.9-rc1-bk5 to use library jiffy functions breaks sg (albeit under vmware). Evidentally sg devices are no longer recognised after that change.

Reverting that changeset removes the problem. Strange, it is not obvious why.

At some stage I must have detected negative time spans (yeh yeh it never happens) and my versions returned 0 in this case; otherwise the implementations look very similar.

The following patch fixes the problem. It is
against lk 2.6.9-rc1-bk7 (i.e. after "standard"
jiffy_to_millisecs macros replaced sg versions).

Change:
- make sure a (large) user supplied timeout value does not result in a negative timeout passed to the midlevel

Doug Gilbert

drivers/scsi/sg.c269rc1bk7jif renamed from drivers/scsi/sg.c +3 -1
@@ -576,6 +576,7 @@
 	sg_io_hdr_t *hp;
 	unsigned char cmnd[sizeof (dummy_cmdp->sr_cmnd)];
 	int timeout;
+	unsigned long ul_timeout;
 
 	if (count < SZ_SG_IO_HDR)
 		return -EINVAL;
@@ -610,7 +611,8 @@
 			return -EBUSY;	/* reserve buffer already being used */
 		}
 	}
-	timeout = msecs_to_jiffies(srp->header.timeout);
+	ul_timeout = msecs_to_jiffies(srp->header.timeout);
+	timeout = (ul_timeout < INT_MAX) ? ul_timeout : INT_MAX;
 	if ((!hp->cmdp) || (hp->cmd_len < 6) || (hp->cmd_len > sizeof (cmnd))) {
 		sg_remove_request(sfp, srp);
 		return -EMSGSIZE;