2008/8/9 Matthew Wilcox <matthew@xxxxxx>: > On Fri, Aug 08, 2008 at 11:56:35PM +0200, Adel Gadllah wrote: >> @@ -84,8 +83,8 @@ static ssize_t rcf_cmds_show(struct >> blk_scsi_cmd_filter *filter, char *page, >> >> for (i = 0; i < BLK_SCSI_MAX_CMDS; i++) { >> if (test_bit(i, okbits)) { >> - sprintf(npage, "%02x", i); >> - npage += 2; >> + sprintf(npage, "0x%02x", i); >> + npage += 4; >> if (i < BLK_SCSI_MAX_CMDS - 1) >> sprintf(npage++, " "); >> } > > Why not: > > npage += sprintf(npage, "0x%02x", i); > ? no reason .. that how the original patch was... changed it. >> + while ((p = strsep((char **)&page, " ")) != NULL) { >> + set = 1; >> + >> + if (p[0] == '-') { >> + set = 0; >> + p++; >> + } >> + >> + if (p[0] == '+') >> + p++; >> + >> + cmd = simple_strtol(p, &status, 16); >> + >> /* either of these cases means invalid input, so do nothing. */ >> - if (status || cmd >= BLK_SCSI_MAX_CMDS) >> + if ((status == p) || cmd >= BLK_SCSI_MAX_CMDS) >> return -EINVAL; > > Doesn't this accept -+0x20 for example? Why not: -+ seems abit odd.... > set = 1; > if (p[0] == '+') { > p++; > } else if (p[0] == '-') { > set = 0; > p++; > } > cmd = simple_strtol(p, &status, 16); done >> - __set_bit(cmd, okbits); >> + if (set) >> + __set_bit(cmd, okbits); >> + else >> + __clear_bit(cmd, okbits); >> } >> >> - if (rw == READ) >> - target_okbits = filter->read_ok; >> - else >> - target_okbits = filter->write_ok; >> - >> memmove(target_okbits, okbits, sizeof(okbits)); > > target_okbits can't overlap with okbits, so you can use memcpy instead > of memmove here. left over from the old patch, changed. v5 attached with this changed (build tested only) ------------------------ This patch changes the interface of the cmd filter to use a +/- notation like: echo -- +0x02 +0x03 -0x08 If neither + or - is given it defaults to + (allow command). Note: The interface was added in 2.6.17-rc1 and is unused and undocumented so far so it's safe to change it. Cc: matthew@xxxxxx Cc: fujita.tomonori@xxxxxxxxxxxxx Cc: jens.axboe@xxxxxxxxxx Cc: James.Bottomley@xxxxxxxxxxxxxxxxxxxxx Cc: dan.j.williams@xxxxxxxxx Cc: pjones@xxxxxxxxxx Cc: viro@xxxxxxxxxxxxxxxxxx Cc: dougg@xxxxxxxxxx Signed-off-by: Adel Gadllah <adel.gadllah@xxxxxxxxx> block/cmd-filter.c | 54 ++++++++++++++++++++++++++++----------------------- 1 files changed, 30 insertions(+), 24 deletions(-) diff --git a/block/cmd-filter.c b/block/cmd-filter.c index eec4404..e51648c 100644 --- a/block/cmd-filter.c +++ b/block/cmd-filter.c @@ -20,7 +20,6 @@ #include <linux/list.h> #include <linux/genhd.h> #include <linux/spinlock.h> -#include <linux/parser.h> #include <linux/capability.h> #include <linux/bitops.h> @@ -84,8 +83,7 @@ static ssize_t rcf_cmds_show(struct blk_scsi_cmd_filter *filter, char *page, for (i = 0; i < BLK_SCSI_MAX_CMDS; i++) { if (test_bit(i, okbits)) { - sprintf(npage, "%02x", i); - npage += 2; + npage += sprintf(npage, "0x%02x", i); if (i < BLK_SCSI_MAX_CMDS - 1) sprintf(npage++, " "); } @@ -111,33 +109,41 @@ static ssize_t rcf_writecmds_show(struct blk_scsi_cmd_filter *filter, static ssize_t rcf_cmds_store(struct blk_scsi_cmd_filter *filter, const char *page, size_t count, int rw) { - ssize_t ret = 0; unsigned long okbits[BLK_SCSI_CMD_PER_LONG], *target_okbits; - int cmd, status, len; - substring_t ss; - - memset(&okbits, 0, sizeof(okbits)); - - for (len = strlen(page); len > 0; len -= 3) { - if (len < 2) - break; - ss.from = (char *) page + ret; - ss.to = (char *) page + ret + 2; - ret += 3; - status = match_hex(&ss, &cmd); + int cmd, set; + char *p, *status; + + if (rw == READ) { + memcpy(&okbits, filter->read_ok, sizeof(okbits)); + target_okbits = filter->read_ok; + } else { + memcpy(&okbits, filter->write_ok, sizeof(okbits)); + target_okbits = filter->write_ok; + } + + while ((p = strsep((char **)&page, " ")) != NULL) { + set = 1; + + if (p[0] == '+') { + p++; + } else if (p[0] == '-') { + set = 0; + p++; + } + + cmd = simple_strtol(p, &status, 16); + /* either of these cases means invalid input, so do nothing. */ - if (status || cmd >= BLK_SCSI_MAX_CMDS) + if ((status == p) || cmd >= BLK_SCSI_MAX_CMDS) return -EINVAL; - __set_bit(cmd, okbits); + if (set) + __set_bit(cmd, okbits); + else + __clear_bit(cmd, okbits); } - if (rw == READ) - target_okbits = filter->read_ok; - else - target_okbits = filter->write_ok; - - memmove(target_okbits, okbits, sizeof(okbits)); + memcpy(target_okbits, okbits, sizeof(okbits)); return count; } ---- attached in case gmail breaks it again
Attachment:
cmd-filter-new-iface.patch
Description: Binary data