All season long, No. 3 Ohio State looked forward to its home finale against No. 9 Michigan State as the hardest-fought game of the season.

As it turned out on Saturday, the Buckeyes got exactly what they asked for.

In front of an Ohio Stadium-record crowd of 108,975, the Spartans (10-1, 6-1) ended OSU’s nation-leading 23-game winning streak in a chippy, sluggish battle, 17-14. Junior kicker Michael Geiger put the Spartans in the driver’s seat of the Big Ten East Division with a 40-yard field goal as time expired.

“I’m disappointed,” OSU junior running back Ezekiel Elliott said. “I’m disappointed in the play calling, I’m disappointed in the situations we were put in, and I wish it all played out differently.”

OSU (10-1, 6-1) only managed 132 yards of offense, including just 46 passing yards from redshirt sophomore quarterback J.T. Barrett.

“I think we maybe had a couple of opportunities, but it just was obviously tough conditions to throw the ball,” OSU coach Urban Meyer said. “That was a very poor performance.”

Minutes before the start of the game, word got out that Michigan State redshirt senior and two-time second-team all-Big Ten quarterback Connor Cook would not be able to play due to a shoulder injury suffered in the Spartans’ previous game.

“It’s one of those things you’ve got to prepare for,” OSU defensive coordinator Luke Fickell said about the surprise change. “In a game like that, weather like that, you’ve got to be a little bit better.”

Filling in for Cook was redshirt junior Tyler O’Connor, making his first career start.

O’Connor said that the starting nod was not news to him, but coach Mark Dantonio kept a smokescreen out to keep OSU off guard.

“I found out last night,” O’Connor said.

O’Connor shared time with redshirt sophomore Damion Terry throughout the contest. O’Connor finished 7-of-12 for 89 yards, while Terry rushed for 25. O’Connor, a Lima, Ohio, native, also added 25 rushing yards of his own.

“It would have been tough to execute the throw game even with Connor Cook,” Meyer said. “But they did it well. They ran that quarterback a lot.”

Much of the first quarter was uneventful, with the first three drives of the game resulting in punts. On the fourth, however, the crowd at the ‘Shoe came to life through the rain and cold when redshirt freshman Sam Hubbard beat the tackle off the edge and laid a major hit on Terry  to force a fumble.

The ball was recovered by senior defensive tackle Adolphus Washington, giving OSU the ball at the Michigan State 32-yard line. From there, the Scarlet and Gray turned to Elliott on six straight plays to get the ball inside the 10-yard line. After a pass to redshirt senior tight end Nick Vannett moved the line to the 3-yard line, Barrett and Elliott were stuffed on consecutive plays to force a fourth down from the goal line.

Meyer kept the offense on the field on fourth down, however, and the decision proved to pay off, as Elliott took a shotgun handoff and dove past the goal line to put OSU up front 7-0 early in the second quarter.

The first four drives of the game — two for each team — featured just 63 yards of offense, but the short-field ground-and-pound attack for OSU on the scoring drive was good for 32 yards in 10 plays. The touchdown was Elliott’s 17th of his junior season.

Not backing down in a game with severe divisional implications, the Spartans answered back on their following drive, led by O’Connor, who threw for 62 yards on the nine-play, 75-yard march. Fifty of those were to senior receiver Aaron Burbridge, but it was a 12-yard pass to redshirt senior fullback and Ohio native Trevon Pendleton that knotted the game at 7-7.

The momentum shift continued in a major way on OSU’s following drive. A sack of Barrett forced junior Cameron Johnston to punt, which is where it went from bad to worse for the home team.

Playing through wet conditions, Johnston’s punt went off his toes and barely left the ground, traveling only five yards before deflecting off redshirt junior Bri’onte Dunn’s helmet, downing the ball at the 23-yard line.

The Spartans were unable to carry the momentum from there, however, as they moved backwards before going wide left on a 43-yard field goal try to keep the score tied, which it remained at halftime.

The Buckeyes and Spartans each struggled offensively in the first 30 minutes. Taking away each team’s scoring drive, they only compiled 43 and 47 yards, respectively.

“I think, being that we’re an offense that likes to run the ball, and being that we were getting like two yards per run play, it’s something that we’re not accustomed to,” Barrett said.

Barrett was 5-of-9 for just 29 yards in the first half, while O’Connor was 6-of-8 for 83 yards and a score. Elliott led the OSU offense with 10 carries for 30 yards.

“I can’t speak for the play-calling. I don’t know what was going on, what they were seeing, but obviously, it didn’t work out,” Elliott said.

With the rain turning to sleet and the wind whipping in the second half, moving the ball became even more difficult for the conference foes.

Like the first half, the first several drives in the second act led to no points for either side. But, also like the first, a Michigan State turnover provided the opening the Buckeyes needed.

After Barrett was stopped on third down, Johnston booted a line drive to the Michigan State 27-yard line. With the wet pigskin barreling toward MacGarrett Kings Jr., the senior was unable to corral it and the ball slipped through his hands down to the 6-yard line, where OSU recovered it.

One play later, a short pass to redshirt sophomore H-back Jalin Marshall put the Buckeyes back in front 14-7, their second score off a Michigan State miscue.

Keeping up the trend of mirroring the first half, the Spartans answered right back on their next drive.

Keeping to the ground on 12 of its 13 plays, Michigan State chewed up 6:30 of clock to drive 75 yards and tie the game at 14 apiece. The score came from two yards away, a run by redshirt sophomore running back Gerald Holmes.

“It was disheartening,” Meyer said of the response drives. “You feel like you’re 14-7 or 7-0, you go up and you’re up 14-7 and they take it the length of the field.”

OSU went to midfield on its next drive but had to punt, and the Spartans did the same the drive after, giving the Buckeyes the ball at their own 7-yard line. Nothing materialized in the long-field situation, however, and the subsequent Johnston punt was tipped, giving the Spartans the ball at midfield with about four minutes remaining.

That drive turned out to be the nail in OSU’s coffin, as Michigan State traveled 25 yards to set up Geiger’s game-ending field goal.

“It hurts, just because of how we lost,” Elliott said. “I don’t think Michigan State was better than us. They weren’t. But we didn’t execute.”

Elliott finished with 33 yards, including only two runs for three yards in the second half. The performance ended his streak of 100-plus-yard games at 16. After the game, the St. Louis native revealed that he had been hospitalized earlier in the week with a leg infection but was cleared to play on Thursday.

With the victory, the Spartans now control their own destiny in the Big Ten East, as a win over Penn State at home on Nov. 28 would put them in the Big Ten Championship Game.

OSU will look to recover and hope for a Nittany Lion victory on that day, when they are set to travel to Ann Arbor, Michigan, to take on No. 12 Michigan. Kickoff is set for noon.