Commit bd10a5f3 authored by Denis Efremov's avatar Denis Efremov

floppy: add defines for sizes of cmd & reply buffers of floppy_raw_cmd

Use FD_RAW_CMD_SIZE, FD_RAW_REPLY_SIZE defines instead of magic numbers
for cmd & reply buffers of struct floppy_raw_cmd. Remove local to
floppy.c MAX_REPLIES define, as it is now FD_RAW_REPLY_SIZE.
FD_RAW_CMD_FULLSIZE added as we allow command to also fill reply_count
and reply fields.

Link: https://lore.kernel.org/r/20200501134416.72248-4-efremov@linux.comReviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarDenis Efremov <efremov@linux.com>
parent 9c4c5a24
...@@ -337,8 +337,7 @@ static bool initialized; ...@@ -337,8 +337,7 @@ static bool initialized;
/* /*
* globals used by 'result()' * globals used by 'result()'
*/ */
#define MAX_REPLIES 16 static unsigned char reply_buffer[FD_RAW_REPLY_SIZE];
static unsigned char reply_buffer[MAX_REPLIES];
static int inr; /* size of reply buffer, when called from interrupt */ static int inr; /* size of reply buffer, when called from interrupt */
#define ST0 0 #define ST0 0
#define ST1 1 #define ST1 1
...@@ -1162,7 +1161,7 @@ static int result(int fdc) ...@@ -1162,7 +1161,7 @@ static int result(int fdc)
int i; int i;
int status = 0; int status = 0;
for (i = 0; i < MAX_REPLIES; i++) { for (i = 0; i < FD_RAW_REPLY_SIZE; i++) {
status = wait_til_ready(fdc); status = wait_til_ready(fdc);
if (status < 0) if (status < 0)
break; break;
...@@ -3079,7 +3078,7 @@ static void raw_cmd_done(int flag) ...@@ -3079,7 +3078,7 @@ static void raw_cmd_done(int flag)
raw_cmd->flags |= FD_RAW_HARDFAILURE; raw_cmd->flags |= FD_RAW_HARDFAILURE;
} else { } else {
raw_cmd->reply_count = inr; raw_cmd->reply_count = inr;
if (raw_cmd->reply_count > MAX_REPLIES) if (raw_cmd->reply_count > FD_RAW_REPLY_SIZE)
raw_cmd->reply_count = 0; raw_cmd->reply_count = 0;
for (i = 0; i < raw_cmd->reply_count; i++) for (i = 0; i < raw_cmd->reply_count; i++)
raw_cmd->reply[i] = reply_buffer[i]; raw_cmd->reply[i] = reply_buffer[i];
...@@ -3190,18 +3189,10 @@ static int raw_cmd_copyin(int cmd, void __user *param, ...@@ -3190,18 +3189,10 @@ static int raw_cmd_copyin(int cmd, void __user *param,
if (ret) if (ret)
return -EFAULT; return -EFAULT;
param += sizeof(struct floppy_raw_cmd); param += sizeof(struct floppy_raw_cmd);
if (ptr->cmd_count > 33) if (ptr->cmd_count > FD_RAW_CMD_FULLSIZE)
/* the command may now also take up the space
* initially intended for the reply & the
* reply count. Needed for long 82078 commands
* such as RESTORE, which takes ... 17 command
* bytes. Murphy's law #137: When you reserve
* 16 bytes for a structure, you'll one day
* discover that you really need 17...
*/
return -EINVAL; return -EINVAL;
for (i = 0; i < 16; i++) for (i = 0; i < FD_RAW_REPLY_SIZE; i++)
ptr->reply[i] = 0; ptr->reply[i] = 0;
ptr->resultcode = 0; ptr->resultcode = 0;
......
...@@ -360,10 +360,20 @@ struct floppy_raw_cmd { ...@@ -360,10 +360,20 @@ struct floppy_raw_cmd {
int buffer_length; /* length of allocated buffer */ int buffer_length; /* length of allocated buffer */
unsigned char rate; unsigned char rate;
#define FD_RAW_CMD_SIZE 16
#define FD_RAW_REPLY_SIZE 16
#define FD_RAW_CMD_FULLSIZE (FD_RAW_CMD_SIZE + 1 + FD_RAW_REPLY_SIZE)
/* The command may take up the space initially intended for the reply
* and the reply count. Needed for long 82078 commands such as RESTORE,
* which takes 17 command bytes.
*/
unsigned char cmd_count; unsigned char cmd_count;
unsigned char cmd[16]; unsigned char cmd[FD_RAW_CMD_SIZE];
unsigned char reply_count; unsigned char reply_count;
unsigned char reply[16]; unsigned char reply[FD_RAW_REPLY_SIZE];
int track; int track;
int resultcode; int resultcode;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment