Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
Anderson Briglia wrote: > Bug fixed. Is there anything else to improve? > > Great. All known issues should be fixed now. I'm currently reorganising my -mm branch, so things might go missing from there for a while. But it will be back eventually. Btw, any progress on testing this with SD? Rgds -- -- Pierre Ossman Linux kernel, MMC maintainerhttp://www.kernel.org PulseAudio, core developer http://pulseaudio.org rdesktop, core developer http://www.rdesktop.org - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
Anderson Briglia wrote: Bug fixed. Is there anything else to improve? Great. All known issues should be fixed now. I'm currently reorganising my -mm branch, so things might go missing from there for a while. But it will be back eventually. Btw, any progress on testing this with SD? Rgds -- -- Pierre Ossman Linux kernel, MMC maintainerhttp://www.kernel.org PulseAudio, core developer http://pulseaudio.org rdesktop, core developer http://www.rdesktop.org - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
Hi Pierre, ext Pierre Ossman wrote: > Anderson Briglia wrote: >> Hi Pierre, >> >> How about now? Is better? >> >> > > Locking problem is still there. You need to unclaim the host even when > claim fails. Bug fixed. Is there anything else to improve? Regards, Anderson Briglia Implement MMC password force erase, remove password, change password, unlock card and assign password operations. It uses the sysfs mechanism to send commands to the MMC subsystem. Signed-off-by: Carlos Eduardo Aguiar <[EMAIL PROTECTED]> Signed-off-by: Anderson Lizardo <[EMAIL PROTECTED]> Signed-off-by: Anderson Briglia <[EMAIL PROTECTED]> Index: linux-linus-2.6/drivers/mmc/mmc_sysfs.c === --- linux-linus-2.6.orig/drivers/mmc/mmc_sysfs.c2007-02-05 17:32:05.0 -0400 +++ linux-linus-2.6/drivers/mmc/mmc_sysfs.c 2007-02-05 17:32:19.0 -0400 @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -65,6 +66,102 @@ static struct device_attribute mmc_dev_a static struct device_attribute mmc_dev_attr_scr = MMC_ATTR_RO(scr); +#ifdef CONFIG_MMC_PASSWORDS + +static ssize_t +mmc_lockable_show(struct device *dev, struct device_attribute *att, char *buf) +{ + struct mmc_card *card = dev_to_mmc_card(dev); + + if (!mmc_card_lockable(card)) + return sprintf(buf, "unsupported\n"); + else + return sprintf(buf, "%slocked\n", mmc_card_locked(card) ? + "" : "un"); +} + +/* + * implement MMC password functions: force erase, remove password, change + * password, unlock card and assign password. + */ +static ssize_t +mmc_lockable_store(struct device *dev, struct device_attribute *att, + const char *data, size_t len) +{ + struct mmc_card *card = dev_to_mmc_card(dev); + int ret; + + if(!mmc_card_lockable(card)) + return -EINVAL; + + ret = mmc_card_claim_host(card); + if (ret != MMC_ERR_NONE) { + mmc_card_release_host(card); + return -EINVAL; + } + + ret = -EINVAL; + if (mmc_card_locked(card) && !strncmp(data, "erase", 5)) { + /* forced erase only works while card is locked */ + mmc_lock_unlock(card, NULL, MMC_LOCK_MODE_ERASE); + ret = len; + } else if (!mmc_card_locked(card) && !strncmp(data, "remove", 6)) { + /* remove password only works while card is unlocked */ + struct key *mmc_key = request_key(_key_type, "mmc:key", "remove"); + + if (!IS_ERR(mmc_key)) { + ret = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_CLR_PWD); + if (!ret) + ret = len; + } else + dev_dbg(>dev, "request_key returned error %ld\n", PTR_ERR(mmc_key)); + } else if (!mmc_card_locked(card) && ((!strncmp(data, "assign", 6)) || + (!strncmp(data, "change", 6 { + /* assign or change */ + struct key *mmc_key; + + if(!(strncmp(data, "assign", 6))) + mmc_key = request_key(_key_type, "mmc:key", "assign"); + else + mmc_key = request_key(_key_type, "mmc:key", "change"); + + if (!IS_ERR(mmc_key)) { + ret = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_SET_PWD); + if (!ret) + ret = len; + } else + dev_dbg(>dev, "request_key returned error %ld\n", PTR_ERR(mmc_key)); + } else if (mmc_card_locked(card) && !strncmp(data, "unlock", 6)) { + /* unlock */ + struct key *mmc_key = request_key(_key_type, "mmc:key", "unlock"); + if (!IS_ERR(mmc_key)) { + ret = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_UNLOCK); + if (ret) { + dev_dbg(>dev, "Wrong password\n"); + ret = -EINVAL; + } + else { + mmc_card_release_host(card); + device_release_driver(dev); + ret = device_attach(dev); + if(!ret) + return -EINVAL; + else + return len; + } + } else + dev_dbg(>dev, "request_key returned error %ld\n", PTR_ERR(mmc_key)); + } + + mmc_card_release_host(card); + return ret; +} + +static struct device_attribute mmc_dev_attr_lockable = + __ATTR(lockable, S_IWUSR | S_IRUGO, +mmc_lockable_show, mmc_lockable_store); + +#endif static void
Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
Hi Pierre, ext Pierre Ossman wrote: Anderson Briglia wrote: Hi Pierre, How about now? Is better? Locking problem is still there. You need to unclaim the host even when claim fails. Bug fixed. Is there anything else to improve? Regards, Anderson Briglia Implement MMC password force erase, remove password, change password, unlock card and assign password operations. It uses the sysfs mechanism to send commands to the MMC subsystem. Signed-off-by: Carlos Eduardo Aguiar [EMAIL PROTECTED] Signed-off-by: Anderson Lizardo [EMAIL PROTECTED] Signed-off-by: Anderson Briglia [EMAIL PROTECTED] Index: linux-linus-2.6/drivers/mmc/mmc_sysfs.c === --- linux-linus-2.6.orig/drivers/mmc/mmc_sysfs.c2007-02-05 17:32:05.0 -0400 +++ linux-linus-2.6/drivers/mmc/mmc_sysfs.c 2007-02-05 17:32:19.0 -0400 @@ -17,6 +17,7 @@ #include linux/idr.h #include linux/workqueue.h #include linux/key.h +#include linux/err.h #include linux/mmc/card.h #include linux/mmc/host.h @@ -65,6 +66,102 @@ static struct device_attribute mmc_dev_a static struct device_attribute mmc_dev_attr_scr = MMC_ATTR_RO(scr); +#ifdef CONFIG_MMC_PASSWORDS + +static ssize_t +mmc_lockable_show(struct device *dev, struct device_attribute *att, char *buf) +{ + struct mmc_card *card = dev_to_mmc_card(dev); + + if (!mmc_card_lockable(card)) + return sprintf(buf, unsupported\n); + else + return sprintf(buf, %slocked\n, mmc_card_locked(card) ? +: un); +} + +/* + * implement MMC password functions: force erase, remove password, change + * password, unlock card and assign password. + */ +static ssize_t +mmc_lockable_store(struct device *dev, struct device_attribute *att, + const char *data, size_t len) +{ + struct mmc_card *card = dev_to_mmc_card(dev); + int ret; + + if(!mmc_card_lockable(card)) + return -EINVAL; + + ret = mmc_card_claim_host(card); + if (ret != MMC_ERR_NONE) { + mmc_card_release_host(card); + return -EINVAL; + } + + ret = -EINVAL; + if (mmc_card_locked(card) !strncmp(data, erase, 5)) { + /* forced erase only works while card is locked */ + mmc_lock_unlock(card, NULL, MMC_LOCK_MODE_ERASE); + ret = len; + } else if (!mmc_card_locked(card) !strncmp(data, remove, 6)) { + /* remove password only works while card is unlocked */ + struct key *mmc_key = request_key(mmc_key_type, mmc:key, remove); + + if (!IS_ERR(mmc_key)) { + ret = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_CLR_PWD); + if (!ret) + ret = len; + } else + dev_dbg(card-dev, request_key returned error %ld\n, PTR_ERR(mmc_key)); + } else if (!mmc_card_locked(card) ((!strncmp(data, assign, 6)) || + (!strncmp(data, change, 6 { + /* assign or change */ + struct key *mmc_key; + + if(!(strncmp(data, assign, 6))) + mmc_key = request_key(mmc_key_type, mmc:key, assign); + else + mmc_key = request_key(mmc_key_type, mmc:key, change); + + if (!IS_ERR(mmc_key)) { + ret = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_SET_PWD); + if (!ret) + ret = len; + } else + dev_dbg(card-dev, request_key returned error %ld\n, PTR_ERR(mmc_key)); + } else if (mmc_card_locked(card) !strncmp(data, unlock, 6)) { + /* unlock */ + struct key *mmc_key = request_key(mmc_key_type, mmc:key, unlock); + if (!IS_ERR(mmc_key)) { + ret = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_UNLOCK); + if (ret) { + dev_dbg(card-dev, Wrong password\n); + ret = -EINVAL; + } + else { + mmc_card_release_host(card); + device_release_driver(dev); + ret = device_attach(dev); + if(!ret) + return -EINVAL; + else + return len; + } + } else + dev_dbg(card-dev, request_key returned error %ld\n, PTR_ERR(mmc_key)); + } + + mmc_card_release_host(card); + return ret; +} + +static struct device_attribute mmc_dev_attr_lockable = + __ATTR(lockable, S_IWUSR | S_IRUGO, +mmc_lockable_show,
Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
Anderson Briglia wrote: > Hi Pierre, > > How about now? Is better? > > Locking problem is still there. You need to unclaim the host even when claim fails. Rgds -- -- Pierre Ossman Linux kernel, MMC maintainerhttp://www.kernel.org PulseAudio, core developer http://pulseaudio.org rdesktop, core developer http://www.rdesktop.org - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
Anderson Briglia wrote: Hi Pierre, How about now? Is better? Locking problem is still there. You need to unclaim the host even when claim fails. Rgds -- -- Pierre Ossman Linux kernel, MMC maintainerhttp://www.kernel.org PulseAudio, core developer http://pulseaudio.org rdesktop, core developer http://www.rdesktop.org - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
Hi Pierre, How about now? Is better? Regards, Anderson Briglia ext Pierre Ossman wrote: > Anderson Briglia wrote: >> Hi Pierre, >> >> Sorry about the delay. >> I changed a bit the code to align with your latest suggestions. >> >> > > Nice, but the locking is broken again. > >> I believe now the number of goto's is ok. >> >> > > Actually, the ones you have left are completely useless. So you can just > remove the last bunch aswell. > > Rgds > Implement MMC password force erase, remove password, change password, unlock card and assign password operations. It uses the sysfs mechanism to send commands to the MMC subsystem. Signed-off-by: Carlos Eduardo Aguiar <[EMAIL PROTECTED]> Signed-off-by: Anderson Lizardo <[EMAIL PROTECTED]> Signed-off-by: Anderson Briglia <[EMAIL PROTECTED]> Index: linux-linus-2.6/drivers/mmc/mmc_sysfs.c === --- linux-linus-2.6.orig/drivers/mmc/mmc_sysfs.c2007-01-30 16:28:38.0 -0400 +++ linux-linus-2.6/drivers/mmc/mmc_sysfs.c 2007-01-30 16:28:42.0 -0400 @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -65,6 +66,100 @@ static struct device_attribute mmc_dev_a static struct device_attribute mmc_dev_attr_scr = MMC_ATTR_RO(scr); +#ifdef CONFIG_MMC_PASSWORDS + +static ssize_t +mmc_lockable_show(struct device *dev, struct device_attribute *att, char *buf) +{ + struct mmc_card *card = dev_to_mmc_card(dev); + + if (!mmc_card_lockable(card)) + return sprintf(buf, "unsupported\n"); + else + return sprintf(buf, "%slocked\n", mmc_card_locked(card) ? + "" : "un"); +} + +/* + * implement MMC password functions: force erase, remove password, change + * password, unlock card and assign password. + */ +static ssize_t +mmc_lockable_store(struct device *dev, struct device_attribute *att, + const char *data, size_t len) +{ + struct mmc_card *card = dev_to_mmc_card(dev); + int ret; + + if(!mmc_card_lockable(card)) + return -EINVAL; + + ret = mmc_card_claim_host(card); + if (ret != MMC_ERR_NONE) + return -EINVAL; + + ret = -EINVAL; + if (mmc_card_locked(card) && !strncmp(data, "erase", 5)) { + /* forced erase only works while card is locked */ + mmc_lock_unlock(card, NULL, MMC_LOCK_MODE_ERASE); + ret = len; + } else if (!mmc_card_locked(card) && !strncmp(data, "remove", 6)) { + /* remove password only works while card is unlocked */ + struct key *mmc_key = request_key(_key_type, "mmc:key", "remove"); + + if (!IS_ERR(mmc_key)) { + ret = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_CLR_PWD); + if (!ret) + ret = len; + } else + dev_dbg(>dev, "request_key returned error %ld\n", PTR_ERR(mmc_key)); + } else if (!mmc_card_locked(card) && ((!strncmp(data, "assign", 6)) || + (!strncmp(data, "change", 6 { + /* assign or change */ + struct key *mmc_key; + + if(!(strncmp(data, "assign", 6))) + mmc_key = request_key(_key_type, "mmc:key", "assign"); + else + mmc_key = request_key(_key_type, "mmc:key", "change"); + + if (!IS_ERR(mmc_key)) { + ret = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_SET_PWD); + if (!ret) + ret = len; + } else + dev_dbg(>dev, "request_key returned error %ld\n", PTR_ERR(mmc_key)); + } else if (mmc_card_locked(card) && !strncmp(data, "unlock", 6)) { + /* unlock */ + struct key *mmc_key = request_key(_key_type, "mmc:key", "unlock"); + if (!IS_ERR(mmc_key)) { + ret = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_UNLOCK); + if (ret) { + dev_dbg(>dev, "Wrong password\n"); + ret = -EINVAL; + } + else { + mmc_card_release_host(card); + device_release_driver(dev); + ret = device_attach(dev); + if(!ret) + return -EINVAL; + else + return len; + } + } else + dev_dbg(>dev, "request_key returned error %ld\n", PTR_ERR(mmc_key)); + } + + mmc_card_release_host(card); + return ret; +} + +static struct device_attribute mmc_dev_attr_lockable = +
Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
Anderson Briglia wrote: > Hi Pierre, > > Sorry about the delay. > I changed a bit the code to align with your latest suggestions. > > Nice, but the locking is broken again. > I believe now the number of goto's is ok. > > Actually, the ones you have left are completely useless. So you can just remove the last bunch aswell. Rgds -- -- Pierre Ossman Linux kernel, MMC maintainerhttp://www.kernel.org PulseAudio, core developer http://pulseaudio.org rdesktop, core developer http://www.rdesktop.org - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
Anderson Briglia wrote: Hi Pierre, Sorry about the delay. I changed a bit the code to align with your latest suggestions. Nice, but the locking is broken again. I believe now the number of goto's is ok. Actually, the ones you have left are completely useless. So you can just remove the last bunch aswell. Rgds -- -- Pierre Ossman Linux kernel, MMC maintainerhttp://www.kernel.org PulseAudio, core developer http://pulseaudio.org rdesktop, core developer http://www.rdesktop.org - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
Hi Pierre, How about now? Is better? Regards, Anderson Briglia ext Pierre Ossman wrote: Anderson Briglia wrote: Hi Pierre, Sorry about the delay. I changed a bit the code to align with your latest suggestions. Nice, but the locking is broken again. I believe now the number of goto's is ok. Actually, the ones you have left are completely useless. So you can just remove the last bunch aswell. Rgds Implement MMC password force erase, remove password, change password, unlock card and assign password operations. It uses the sysfs mechanism to send commands to the MMC subsystem. Signed-off-by: Carlos Eduardo Aguiar [EMAIL PROTECTED] Signed-off-by: Anderson Lizardo [EMAIL PROTECTED] Signed-off-by: Anderson Briglia [EMAIL PROTECTED] Index: linux-linus-2.6/drivers/mmc/mmc_sysfs.c === --- linux-linus-2.6.orig/drivers/mmc/mmc_sysfs.c2007-01-30 16:28:38.0 -0400 +++ linux-linus-2.6/drivers/mmc/mmc_sysfs.c 2007-01-30 16:28:42.0 -0400 @@ -17,6 +17,7 @@ #include linux/idr.h #include linux/workqueue.h #include linux/key.h +#include linux/err.h #include linux/mmc/card.h #include linux/mmc/host.h @@ -65,6 +66,100 @@ static struct device_attribute mmc_dev_a static struct device_attribute mmc_dev_attr_scr = MMC_ATTR_RO(scr); +#ifdef CONFIG_MMC_PASSWORDS + +static ssize_t +mmc_lockable_show(struct device *dev, struct device_attribute *att, char *buf) +{ + struct mmc_card *card = dev_to_mmc_card(dev); + + if (!mmc_card_lockable(card)) + return sprintf(buf, unsupported\n); + else + return sprintf(buf, %slocked\n, mmc_card_locked(card) ? +: un); +} + +/* + * implement MMC password functions: force erase, remove password, change + * password, unlock card and assign password. + */ +static ssize_t +mmc_lockable_store(struct device *dev, struct device_attribute *att, + const char *data, size_t len) +{ + struct mmc_card *card = dev_to_mmc_card(dev); + int ret; + + if(!mmc_card_lockable(card)) + return -EINVAL; + + ret = mmc_card_claim_host(card); + if (ret != MMC_ERR_NONE) + return -EINVAL; + + ret = -EINVAL; + if (mmc_card_locked(card) !strncmp(data, erase, 5)) { + /* forced erase only works while card is locked */ + mmc_lock_unlock(card, NULL, MMC_LOCK_MODE_ERASE); + ret = len; + } else if (!mmc_card_locked(card) !strncmp(data, remove, 6)) { + /* remove password only works while card is unlocked */ + struct key *mmc_key = request_key(mmc_key_type, mmc:key, remove); + + if (!IS_ERR(mmc_key)) { + ret = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_CLR_PWD); + if (!ret) + ret = len; + } else + dev_dbg(card-dev, request_key returned error %ld\n, PTR_ERR(mmc_key)); + } else if (!mmc_card_locked(card) ((!strncmp(data, assign, 6)) || + (!strncmp(data, change, 6 { + /* assign or change */ + struct key *mmc_key; + + if(!(strncmp(data, assign, 6))) + mmc_key = request_key(mmc_key_type, mmc:key, assign); + else + mmc_key = request_key(mmc_key_type, mmc:key, change); + + if (!IS_ERR(mmc_key)) { + ret = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_SET_PWD); + if (!ret) + ret = len; + } else + dev_dbg(card-dev, request_key returned error %ld\n, PTR_ERR(mmc_key)); + } else if (mmc_card_locked(card) !strncmp(data, unlock, 6)) { + /* unlock */ + struct key *mmc_key = request_key(mmc_key_type, mmc:key, unlock); + if (!IS_ERR(mmc_key)) { + ret = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_UNLOCK); + if (ret) { + dev_dbg(card-dev, Wrong password\n); + ret = -EINVAL; + } + else { + mmc_card_release_host(card); + device_release_driver(dev); + ret = device_attach(dev); + if(!ret) + return -EINVAL; + else + return len; + } + } else + dev_dbg(card-dev, request_key returned error %ld\n, PTR_ERR(mmc_key)); + } + + mmc_card_release_host(card); + return ret; +} + +static struct device_attribute
Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
Hi Pierre, Sorry about the delay. I changed a bit the code to align with your latest suggestions. ext Pierre Ossman wrote: > I've queued it up for -mm, but there a few more comments I want resolved > before this can move to Linus... > > You need to clean up mmc_lockable_store(). It had a few broken variable > declarations that even prevented it from compiling, and after I fixed > that I still get: > > drivers/mmc/mmc_sysfs.c: In function ‘mmc_lockable_store’: > drivers/mmc/mmc_sysfs.c:160: warning: ignoring return value of > ‘device_attach’, declared with attribute warn_unused_result > drivers/mmc/mmc_sysfs.c:93: warning: ‘mmc_key’ may be used uninitialized > in this function I'm not getting those errors anymore. > > There's also no handling for an invalid string written to the sysfs node. I believe now it is ok. If you send an invalid string to sysfs it will return -EINVAL. > > And third, you're a bit excessive on the goto:s. E.g. out_unlocked is > used in a single place, so it is completely unnecessary. Please do a > general cleanup of the control flow. I believe now the number of goto's is ok. Regards, Anderson Briglia Implement MMC password force erase, remove password, change password, unlock card and assign password operations. It uses the sysfs mechanism to send commands to the MMC subsystem. Signed-off-by: Carlos Eduardo Aguiar <[EMAIL PROTECTED]> Signed-off-by: Anderson Lizardo <[EMAIL PROTECTED]> Signed-off-by: Anderson Briglia <[EMAIL PROTECTED]> Index: linux-linus-2.6/drivers/mmc/mmc_sysfs.c === --- linux-linus-2.6.orig/drivers/mmc/mmc_sysfs.c2007-01-29 14:26:21.0 -0400 +++ linux-linus-2.6/drivers/mmc/mmc_sysfs.c 2007-01-29 14:28:19.0 -0400 @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -65,6 +66,102 @@ static struct device_attribute mmc_dev_a static struct device_attribute mmc_dev_attr_scr = MMC_ATTR_RO(scr); +#ifdef CONFIG_MMC_PASSWORDS + +static ssize_t +mmc_lockable_show(struct device *dev, struct device_attribute *att, char *buf) +{ + struct mmc_card *card = dev_to_mmc_card(dev); + + if (!mmc_card_lockable(card)) + return sprintf(buf, "unsupported\n"); + else + return sprintf(buf, "%slocked\n", mmc_card_locked(card) ? + "" : "un"); +} + +/* + * implement MMC password functions: force erase, remove password, change + * password, unlock card and assign password. + */ +static ssize_t +mmc_lockable_store(struct device *dev, struct device_attribute *att, + const char *data, size_t len) +{ + struct mmc_card *card = dev_to_mmc_card(dev); + int ret; + + ret = mmc_card_claim_host(card); + if ((ret != MMC_ERR_NONE) || (!mmc_card_lockable(card))) + return -EINVAL; + + ret = -EINVAL; + if (mmc_card_locked(card) && !strncmp(data, "erase", 5)) { + /* forced erase only works while card is locked */ + mmc_lock_unlock(card, NULL, MMC_LOCK_MODE_ERASE); + ret = len; + goto out; + } else if (!mmc_card_locked(card) && !strncmp(data, "remove", 6)) { + /* remove password only works while card is unlocked */ + struct key *mmc_key = request_key(_key_type, "mmc:key", "remove"); + + if (!IS_ERR(mmc_key)) { + ret = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_CLR_PWD); + if (!ret) { + ret = len; + } goto out; + } else + dev_dbg(>dev, "request_key returned error %ld\n", PTR_ERR(mmc_key)); + } else if (!mmc_card_locked(card) && ((!strncmp(data, "assign", 6)) || + (!strncmp(data, "change", 6 { + /* assign or change */ + struct key *mmc_key; + + if(!(strncmp(data, "assign", 6))) + mmc_key = request_key(_key_type, "mmc:key", "assign"); + else + mmc_key = request_key(_key_type, "mmc:key", "change"); + + if (!IS_ERR(mmc_key)) { + ret = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_SET_PWD); + if (!ret) { + ret = len; + goto out; + } + } else + dev_dbg(>dev, "request_key returned error %ld\n", PTR_ERR(mmc_key)); + } else if (mmc_card_locked(card) && !strncmp(data, "unlock", 6)) { + /* unlock */ + struct key *mmc_key = request_key(_key_type, "mmc:key", "unlock"); + if (!IS_ERR(mmc_key)) { + ret = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_UNLOCK); + if (ret) { +
Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
Hi Pierre, Sorry about the delay. I changed a bit the code to align with your latest suggestions. ext Pierre Ossman wrote: I've queued it up for -mm, but there a few more comments I want resolved before this can move to Linus... You need to clean up mmc_lockable_store(). It had a few broken variable declarations that even prevented it from compiling, and after I fixed that I still get: drivers/mmc/mmc_sysfs.c: In function ‘mmc_lockable_store’: drivers/mmc/mmc_sysfs.c:160: warning: ignoring return value of ‘device_attach’, declared with attribute warn_unused_result drivers/mmc/mmc_sysfs.c:93: warning: ‘mmc_key’ may be used uninitialized in this function I'm not getting those errors anymore. There's also no handling for an invalid string written to the sysfs node. I believe now it is ok. If you send an invalid string to sysfs it will return -EINVAL. And third, you're a bit excessive on the goto:s. E.g. out_unlocked is used in a single place, so it is completely unnecessary. Please do a general cleanup of the control flow. I believe now the number of goto's is ok. Regards, Anderson Briglia Implement MMC password force erase, remove password, change password, unlock card and assign password operations. It uses the sysfs mechanism to send commands to the MMC subsystem. Signed-off-by: Carlos Eduardo Aguiar [EMAIL PROTECTED] Signed-off-by: Anderson Lizardo [EMAIL PROTECTED] Signed-off-by: Anderson Briglia [EMAIL PROTECTED] Index: linux-linus-2.6/drivers/mmc/mmc_sysfs.c === --- linux-linus-2.6.orig/drivers/mmc/mmc_sysfs.c2007-01-29 14:26:21.0 -0400 +++ linux-linus-2.6/drivers/mmc/mmc_sysfs.c 2007-01-29 14:28:19.0 -0400 @@ -17,6 +17,7 @@ #include linux/idr.h #include linux/workqueue.h #include linux/key.h +#include linux/err.h #include linux/mmc/card.h #include linux/mmc/host.h @@ -65,6 +66,102 @@ static struct device_attribute mmc_dev_a static struct device_attribute mmc_dev_attr_scr = MMC_ATTR_RO(scr); +#ifdef CONFIG_MMC_PASSWORDS + +static ssize_t +mmc_lockable_show(struct device *dev, struct device_attribute *att, char *buf) +{ + struct mmc_card *card = dev_to_mmc_card(dev); + + if (!mmc_card_lockable(card)) + return sprintf(buf, unsupported\n); + else + return sprintf(buf, %slocked\n, mmc_card_locked(card) ? +: un); +} + +/* + * implement MMC password functions: force erase, remove password, change + * password, unlock card and assign password. + */ +static ssize_t +mmc_lockable_store(struct device *dev, struct device_attribute *att, + const char *data, size_t len) +{ + struct mmc_card *card = dev_to_mmc_card(dev); + int ret; + + ret = mmc_card_claim_host(card); + if ((ret != MMC_ERR_NONE) || (!mmc_card_lockable(card))) + return -EINVAL; + + ret = -EINVAL; + if (mmc_card_locked(card) !strncmp(data, erase, 5)) { + /* forced erase only works while card is locked */ + mmc_lock_unlock(card, NULL, MMC_LOCK_MODE_ERASE); + ret = len; + goto out; + } else if (!mmc_card_locked(card) !strncmp(data, remove, 6)) { + /* remove password only works while card is unlocked */ + struct key *mmc_key = request_key(mmc_key_type, mmc:key, remove); + + if (!IS_ERR(mmc_key)) { + ret = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_CLR_PWD); + if (!ret) { + ret = len; + } goto out; + } else + dev_dbg(card-dev, request_key returned error %ld\n, PTR_ERR(mmc_key)); + } else if (!mmc_card_locked(card) ((!strncmp(data, assign, 6)) || + (!strncmp(data, change, 6 { + /* assign or change */ + struct key *mmc_key; + + if(!(strncmp(data, assign, 6))) + mmc_key = request_key(mmc_key_type, mmc:key, assign); + else + mmc_key = request_key(mmc_key_type, mmc:key, change); + + if (!IS_ERR(mmc_key)) { + ret = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_SET_PWD); + if (!ret) { + ret = len; + goto out; + } + } else + dev_dbg(card-dev, request_key returned error %ld\n, PTR_ERR(mmc_key)); + } else if (mmc_card_locked(card) !strncmp(data, unlock, 6)) { + /* unlock */ + struct key *mmc_key = request_key(mmc_key_type, mmc:key, unlock); + if (!IS_ERR(mmc_key)) { + ret = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_UNLOCK); + if (ret)
Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
Anderson Briglia wrote: >> There's also no handling for an invalid string written to the sysfs node. >> > > Is this really needed? I thought the function just ignored other values sent > to itself that were not handled. > > Well, returning an error on invalid data is the right thing to do. And the warning about mmc_key is caused by this lack of error handling. Rgds -- -- Pierre Ossman Linux kernel, MMC maintainerhttp://www.kernel.org PulseAudio, core developer http://pulseaudio.org rdesktop, core developer http://www.rdesktop.org - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
ext Pierre Ossman wrote: > I've queued it up for -mm, but there a few more comments I want resolved > before this can move to Linus... Ok, thanks for the revisions. > > You need to clean up mmc_lockable_store(). It had a few broken variable > declarations that even prevented it from compiling, and after I fixed > that I still get: > > drivers/mmc/mmc_sysfs.c: In function ‘mmc_lockable_store’: > drivers/mmc/mmc_sysfs.c:160: warning: ignoring return value of > ‘device_attach’, declared with attribute warn_unused_result > drivers/mmc/mmc_sysfs.c:93: warning: ‘mmc_key’ may be used uninitialized > in this function I did a modification at this patch and did not get those warnings anymore. > > There's also no handling for an invalid string written to the sysfs node. Is this really needed? I thought the function just ignored other values sent to itself that were not handled. > > And third, you're a bit excessive on the goto:s. E.g. out_unlocked is > used in a single place, so it is completely unnecessary. Please do a > general cleanup of the control flow. Ok. Regards, Anderson Briglia - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
ext Pierre Ossman wrote: I've queued it up for -mm, but there a few more comments I want resolved before this can move to Linus... Ok, thanks for the revisions. You need to clean up mmc_lockable_store(). It had a few broken variable declarations that even prevented it from compiling, and after I fixed that I still get: drivers/mmc/mmc_sysfs.c: In function ‘mmc_lockable_store’: drivers/mmc/mmc_sysfs.c:160: warning: ignoring return value of ‘device_attach’, declared with attribute warn_unused_result drivers/mmc/mmc_sysfs.c:93: warning: ‘mmc_key’ may be used uninitialized in this function I did a modification at this patch and did not get those warnings anymore. There's also no handling for an invalid string written to the sysfs node. Is this really needed? I thought the function just ignored other values sent to itself that were not handled. And third, you're a bit excessive on the goto:s. E.g. out_unlocked is used in a single place, so it is completely unnecessary. Please do a general cleanup of the control flow. Ok. Regards, Anderson Briglia - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
Anderson Briglia wrote: There's also no handling for an invalid string written to the sysfs node. Is this really needed? I thought the function just ignored other values sent to itself that were not handled. Well, returning an error on invalid data is the righttm thing to do. And the warning about mmc_key is caused by this lack of error handling. Rgds -- -- Pierre Ossman Linux kernel, MMC maintainerhttp://www.kernel.org PulseAudio, core developer http://pulseaudio.org rdesktop, core developer http://www.rdesktop.org - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
I've queued it up for -mm, but there a few more comments I want resolved before this can move to Linus... You need to clean up mmc_lockable_store(). It had a few broken variable declarations that even prevented it from compiling, and after I fixed that I still get: drivers/mmc/mmc_sysfs.c: In function ‘mmc_lockable_store’: drivers/mmc/mmc_sysfs.c:160: warning: ignoring return value of ‘device_attach’, declared with attribute warn_unused_result drivers/mmc/mmc_sysfs.c:93: warning: ‘mmc_key’ may be used uninitialized in this function There's also no handling for an invalid string written to the sysfs node. And third, you're a bit excessive on the goto:s. E.g. out_unlocked is used in a single place, so it is completely unnecessary. Please do a general cleanup of the control flow. Rgds -- -- Pierre Ossman Linux kernel, MMC maintainerhttp://www.kernel.org PulseAudio, core developer http://pulseaudio.org rdesktop, core developer http://www.rdesktop.org - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
Anderson Briglia wrote: > Hi all, > > I believe this code is following the latest Russel's comments. > Afraid not. mmc_card_claim_host() is incredibly unintuitive in that it requires an unlock on error (the lock always succeeds, the card select might fail). I'll fix that up and commit the patch set. Rgds -- -- Pierre Ossman Linux kernel, MMC maintainerhttp://www.kernel.org PulseAudio, core developer http://pulseaudio.org rdesktop, core developer http://www.rdesktop.org - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
Anderson Briglia wrote: Hi all, I believe this code is following the latest Russel's comments. Afraid not. mmc_card_claim_host() is incredibly unintuitive in that it requires an unlock on error (the lock always succeeds, the card select might fail). I'll fix that up and commit the patch set. Rgds -- -- Pierre Ossman Linux kernel, MMC maintainerhttp://www.kernel.org PulseAudio, core developer http://pulseaudio.org rdesktop, core developer http://www.rdesktop.org - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
I've queued it up for -mm, but there a few more comments I want resolved before this can move to Linus... You need to clean up mmc_lockable_store(). It had a few broken variable declarations that even prevented it from compiling, and after I fixed that I still get: drivers/mmc/mmc_sysfs.c: In function ‘mmc_lockable_store’: drivers/mmc/mmc_sysfs.c:160: warning: ignoring return value of ‘device_attach’, declared with attribute warn_unused_result drivers/mmc/mmc_sysfs.c:93: warning: ‘mmc_key’ may be used uninitialized in this function There's also no handling for an invalid string written to the sysfs node. And third, you're a bit excessive on the goto:s. E.g. out_unlocked is used in a single place, so it is completely unnecessary. Please do a general cleanup of the control flow. Rgds -- -- Pierre Ossman Linux kernel, MMC maintainerhttp://www.kernel.org PulseAudio, core developer http://pulseaudio.org rdesktop, core developer http://www.rdesktop.org - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
Hi all, I believe this code is following the latest Russel's comments. Regards, Anderson Briglia ---> cut here < Implement MMC password force erase, remove password, change password, unlock card and assign password operations. It uses the sysfs mechanism to send commands to the MMC subsystem. Signed-off-by: Carlos Eduardo Aguiar <[EMAIL PROTECTED]> Signed-off-by: Anderson Lizardo <[EMAIL PROTECTED]> Signed-off-by: Anderson Briglia <[EMAIL PROTECTED]> Index: linux-linus-2.6/drivers/mmc/mmc_sysfs.c === --- linux-linus-2.6.orig/drivers/mmc/mmc_sysfs.c2007-01-03 07:57:40.0 -0400 +++ linux-linus-2.6/drivers/mmc/mmc_sysfs.c 2007-01-03 07:58:14.0 -0400 @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -65,6 +66,107 @@ static struct device_attribute mmc_dev_a static struct device_attribute mmc_dev_attr_scr = MMC_ATTR_RO(scr); +#ifdef CONFIG_MMC_PASSWORDS + +static ssize_t +mmc_lockable_show(struct device *dev, struct device_attribute *att, char *buf) +{ + struct mmc_card *card = dev_to_mmc_card(dev); + + if (!mmc_card_lockable(card)) + return sprintf(buf, "unsupported\n"); + else + return sprintf(buf, "%slocked\n", mmc_card_locked(card) ? + "" : "un"); +} + +/* + * implement MMC password functions: force erase, remove password, change + * password, unlock card and assign password. + */ +static ssize_t +mmc_lockable_store(struct device *dev, struct device_attribute *att, + const char *data, size_t len) +{ + struct mmc_card *card = dev_to_mmc_card(dev); + int err; + + err = mmc_card_claim_host(card); + if (err != MMC_ERR_NONE) + return -EINVAL; + + err = mmc_card_lockable(card); + if (!err) + goto error; + + if (mmc_card_locked(card) && !strncmp(data, "erase", 5)) { + /* forced erase only works while card is locked */ + mmc_lock_unlock(card, NULL, MMC_LOCK_MODE_ERASE); + goto out; + } else if (!mmc_card_locked(card) && !strncmp(data, "remove", 6)) { + /* remove password only works while card is unlocked */ + struct key *mmc_key = request_key(_key_type, "mmc:key", "remove"); + + if (!IS_ERR(mmc_key)) { + int err = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_CLR_PWD); + if (!err) + goto out; + } else + goto request_key_error; + } else if (!mmc_card_locked(card) && ((!strncmp(data, "assign", 6)) || + (!strncmp(data, "change", 6 { + + /* assign or change */ + struct key *mmc_key; + + if(!strncmp(data, "assign", 6)) + mmc_key = request_key(_key_type, "mmc:key", "assign"); + else + mmc_key = request_key(_key_type, "mmc:key", "change"); + + if (!IS_ERR(mmc_key)) { + int err = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_SET_PWD); + if (!err) + goto out; + } else + goto request_key_error; + } else if (mmc_card_locked(card) && !strncmp(data, "unlock", 6)) { + /* unlock */ + struct key *mmc_key = request_key(_key_type, "mmc:key", "unlock"); + if (!IS_ERR(mmc_key)) { + int err = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_UNLOCK); + if (err) { + dev_dbg(>dev, "Wrong password\n"); + goto error; + } + else { + mmc_card_release_host(card); + goto out_unlocked; + } + } else + goto request_key_error; + } + +request_key_error: + dev_dbg(>dev, "request_key returned error %ld\n", PTR_ERR(mmc_key)); +error: + mmc_card_release_host(card); + return -EINVAL; +out: + mmc_card_release_host(card); + return len; + +out_unlocked: + device_release_driver(dev); + device_attach(dev); + return len; +} + +static struct device_attribute mmc_dev_attr_lockable = + __ATTR(lockable, S_IWUSR | S_IRUGO, +mmc_lockable_show, mmc_lockable_store); + +#endif static void mmc_release_card(struct device *dev) { @@ -234,6 +336,11 @@ int mmc_register_card(struct mmc_card *c if (ret)
Re: [PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
Hi all, I believe this code is following the latest Russel's comments. Regards, Anderson Briglia --- cut here Implement MMC password force erase, remove password, change password, unlock card and assign password operations. It uses the sysfs mechanism to send commands to the MMC subsystem. Signed-off-by: Carlos Eduardo Aguiar [EMAIL PROTECTED] Signed-off-by: Anderson Lizardo [EMAIL PROTECTED] Signed-off-by: Anderson Briglia [EMAIL PROTECTED] Index: linux-linus-2.6/drivers/mmc/mmc_sysfs.c === --- linux-linus-2.6.orig/drivers/mmc/mmc_sysfs.c2007-01-03 07:57:40.0 -0400 +++ linux-linus-2.6/drivers/mmc/mmc_sysfs.c 2007-01-03 07:58:14.0 -0400 @@ -17,6 +17,7 @@ #include linux/idr.h #include linux/workqueue.h #include linux/key.h +#include linux/err.h #include linux/mmc/card.h #include linux/mmc/host.h @@ -65,6 +66,107 @@ static struct device_attribute mmc_dev_a static struct device_attribute mmc_dev_attr_scr = MMC_ATTR_RO(scr); +#ifdef CONFIG_MMC_PASSWORDS + +static ssize_t +mmc_lockable_show(struct device *dev, struct device_attribute *att, char *buf) +{ + struct mmc_card *card = dev_to_mmc_card(dev); + + if (!mmc_card_lockable(card)) + return sprintf(buf, unsupported\n); + else + return sprintf(buf, %slocked\n, mmc_card_locked(card) ? +: un); +} + +/* + * implement MMC password functions: force erase, remove password, change + * password, unlock card and assign password. + */ +static ssize_t +mmc_lockable_store(struct device *dev, struct device_attribute *att, + const char *data, size_t len) +{ + struct mmc_card *card = dev_to_mmc_card(dev); + int err; + + err = mmc_card_claim_host(card); + if (err != MMC_ERR_NONE) + return -EINVAL; + + err = mmc_card_lockable(card); + if (!err) + goto error; + + if (mmc_card_locked(card) !strncmp(data, erase, 5)) { + /* forced erase only works while card is locked */ + mmc_lock_unlock(card, NULL, MMC_LOCK_MODE_ERASE); + goto out; + } else if (!mmc_card_locked(card) !strncmp(data, remove, 6)) { + /* remove password only works while card is unlocked */ + struct key *mmc_key = request_key(mmc_key_type, mmc:key, remove); + + if (!IS_ERR(mmc_key)) { + int err = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_CLR_PWD); + if (!err) + goto out; + } else + goto request_key_error; + } else if (!mmc_card_locked(card) ((!strncmp(data, assign, 6)) || + (!strncmp(data, change, 6 { + + /* assign or change */ + struct key *mmc_key; + + if(!strncmp(data, assign, 6)) + mmc_key = request_key(mmc_key_type, mmc:key, assign); + else + mmc_key = request_key(mmc_key_type, mmc:key, change); + + if (!IS_ERR(mmc_key)) { + int err = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_SET_PWD); + if (!err) + goto out; + } else + goto request_key_error; + } else if (mmc_card_locked(card) !strncmp(data, unlock, 6)) { + /* unlock */ + struct key *mmc_key = request_key(mmc_key_type, mmc:key, unlock); + if (!IS_ERR(mmc_key)) { + int err = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_UNLOCK); + if (err) { + dev_dbg(card-dev, Wrong password\n); + goto error; + } + else { + mmc_card_release_host(card); + goto out_unlocked; + } + } else + goto request_key_error; + } + +request_key_error: + dev_dbg(card-dev, request_key returned error %ld\n, PTR_ERR(mmc_key)); +error: + mmc_card_release_host(card); + return -EINVAL; +out: + mmc_card_release_host(card); + return len; + +out_unlocked: + device_release_driver(dev); + device_attach(dev); + return len; +} + +static struct device_attribute mmc_dev_attr_lockable = + __ATTR(lockable, S_IWUSR | S_IRUGO, +mmc_lockable_show, mmc_lockable_store); + +#endif static void mmc_release_card(struct device *dev) { @@ -234,6 +336,11 @@ int
[PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
Implement MMC password force erase, remove password, change password, unlock card and assign password operations. It uses the sysfs mechanism to send commands to the MMC subsystem. Signed-off-by: Carlos Eduardo Aguiar indt.org.br> Signed-off-by: Anderson Lizardo indt.org.br> Signed-off-by: Anderson Briglia indt.org.br> Index: linux-linus-2.6/drivers/mmc/mmc_sysfs.c === --- linux-linus-2.6.orig/drivers/mmc/mmc_sysfs.c2006-12-15 14:35:14.0 -0400 +++ linux-linus-2.6/drivers/mmc/mmc_sysfs.c 2006-12-15 14:35:27.0 -0400 @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -65,6 +66,100 @@ static struct device_attribute mmc_dev_a static struct device_attribute mmc_dev_attr_scr = MMC_ATTR_RO(scr); +#ifdef CONFIG_MMC_PASSWORDS + +static ssize_t +mmc_lockable_show(struct device *dev, struct device_attribute *att, char *buf) +{ + struct mmc_card *card = dev_to_mmc_card(dev); + + if (!mmc_card_lockable(card)) + return sprintf(buf, "unsupported\n"); + else + return sprintf(buf, "%slocked\n", mmc_card_locked(card) ? + "" : "un"); +} + +/* + * implement MMC password functions: force erase, remove password, change + * password, unlock card and assign password. + */ +static ssize_t +mmc_lockable_store(struct device *dev, struct device_attribute *att, + const char *data, size_t len) +{ + struct mmc_card *card = dev_to_mmc_card(dev); + int err = 0; + + err = mmc_card_claim_host(card); + if (err != MMC_ERR_NONE) + return -EINVAL; + + if (!mmc_card_lockable(card)) + return -EINVAL; + + if (mmc_card_locked(card) && !strncmp(data, "erase", 5)) { + /* forced erase only works while card is locked */ + mmc_lock_unlock(card, NULL, MMC_LOCK_MODE_ERASE); + goto out; + } else if (!mmc_card_locked(card) && !strncmp(data, "remove", 6)) { + /* remove password only works while card is unlocked */ + struct key *mmc_key = request_key(_key_type, "mmc:key", "remove"); + + if (!IS_ERR(mmc_key)) { + int err = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_CLR_PWD); + if (!err) + goto out; + } else + dev_dbg(>dev, "request_key returned error %ld\n", PTR_ERR(mmc_key)); + } else if (!mmc_card_locked(card) && ((!strncmp(data, "assign", 6)) || + (!strncmp(data, "change", 6 { + + /* assign or change */ + struct key *mmc_key; + + if(!strncmp(data, "assign", 6)) + mmc_key = request_key(_key_type, "mmc:key", "assign"); + else + mmc_key = request_key(_key_type, "mmc:key", "change"); + + if (!IS_ERR(mmc_key)) { + int err = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_SET_PWD); + if (!err) + goto out; + } else + dev_dbg(>dev, "request_key returned error %ld\n", PTR_ERR(mmc_key)); + } else if (mmc_card_locked(card) && !strncmp(data, "unlock", 6)) { + /* unlock */ + struct key *mmc_key = request_key(_key_type, "mmc:key", "unlock"); + if (!IS_ERR(mmc_key)) { + int err = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_UNLOCK); + if (err) { + dev_dbg(>dev, "Wrong password\n"); + } + else { + mmc_card_release_host(card); + device_release_driver(dev); + device_attach(dev); + return len; + } + } else + dev_dbg(>dev, "request_key returned error %ld\n", PTR_ERR(mmc_key)); + } + + mmc_card_release_host(card); + return -EINVAL; +out: + mmc_card_release_host(card); + return len; +} + +static struct device_attribute mmc_dev_attr_lockable = + __ATTR(lockable, S_IWUSR | S_IRUGO, +mmc_lockable_show, mmc_lockable_store); + +#endif + static void mmc_release_card(struct device *dev) { @@ -234,6 +329,11 @@ int mmc_register_card(struct mmc_card *c if (ret) device_del(>dev); } +#ifdef CONFIG_MMC_PASSWORDS + ret =
[PATCH 4/4] Add MMC Password Protection (lock/unlock) support V9: mmc_sysfs.diff
Implement MMC password force erase, remove password, change password, unlock card and assign password operations. It uses the sysfs mechanism to send commands to the MMC subsystem. Signed-off-by: Carlos Eduardo Aguiar carlos.aguiar at indt.org.br Signed-off-by: Anderson Lizardo anderson.lizardo at indt.org.br Signed-off-by: Anderson Briglia anderson.briglia at indt.org.br Index: linux-linus-2.6/drivers/mmc/mmc_sysfs.c === --- linux-linus-2.6.orig/drivers/mmc/mmc_sysfs.c2006-12-15 14:35:14.0 -0400 +++ linux-linus-2.6/drivers/mmc/mmc_sysfs.c 2006-12-15 14:35:27.0 -0400 @@ -17,6 +17,7 @@ #include linux/idr.h #include linux/workqueue.h #include linux/key.h +#include linux/err.h #include linux/mmc/card.h #include linux/mmc/host.h @@ -65,6 +66,100 @@ static struct device_attribute mmc_dev_a static struct device_attribute mmc_dev_attr_scr = MMC_ATTR_RO(scr); +#ifdef CONFIG_MMC_PASSWORDS + +static ssize_t +mmc_lockable_show(struct device *dev, struct device_attribute *att, char *buf) +{ + struct mmc_card *card = dev_to_mmc_card(dev); + + if (!mmc_card_lockable(card)) + return sprintf(buf, unsupported\n); + else + return sprintf(buf, %slocked\n, mmc_card_locked(card) ? +: un); +} + +/* + * implement MMC password functions: force erase, remove password, change + * password, unlock card and assign password. + */ +static ssize_t +mmc_lockable_store(struct device *dev, struct device_attribute *att, + const char *data, size_t len) +{ + struct mmc_card *card = dev_to_mmc_card(dev); + int err = 0; + + err = mmc_card_claim_host(card); + if (err != MMC_ERR_NONE) + return -EINVAL; + + if (!mmc_card_lockable(card)) + return -EINVAL; + + if (mmc_card_locked(card) !strncmp(data, erase, 5)) { + /* forced erase only works while card is locked */ + mmc_lock_unlock(card, NULL, MMC_LOCK_MODE_ERASE); + goto out; + } else if (!mmc_card_locked(card) !strncmp(data, remove, 6)) { + /* remove password only works while card is unlocked */ + struct key *mmc_key = request_key(mmc_key_type, mmc:key, remove); + + if (!IS_ERR(mmc_key)) { + int err = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_CLR_PWD); + if (!err) + goto out; + } else + dev_dbg(card-dev, request_key returned error %ld\n, PTR_ERR(mmc_key)); + } else if (!mmc_card_locked(card) ((!strncmp(data, assign, 6)) || + (!strncmp(data, change, 6 { + + /* assign or change */ + struct key *mmc_key; + + if(!strncmp(data, assign, 6)) + mmc_key = request_key(mmc_key_type, mmc:key, assign); + else + mmc_key = request_key(mmc_key_type, mmc:key, change); + + if (!IS_ERR(mmc_key)) { + int err = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_SET_PWD); + if (!err) + goto out; + } else + dev_dbg(card-dev, request_key returned error %ld\n, PTR_ERR(mmc_key)); + } else if (mmc_card_locked(card) !strncmp(data, unlock, 6)) { + /* unlock */ + struct key *mmc_key = request_key(mmc_key_type, mmc:key, unlock); + if (!IS_ERR(mmc_key)) { + int err = mmc_lock_unlock(card, mmc_key, MMC_LOCK_MODE_UNLOCK); + if (err) { + dev_dbg(card-dev, Wrong password\n); + } + else { + mmc_card_release_host(card); + device_release_driver(dev); + device_attach(dev); + return len; + } + } else + dev_dbg(card-dev, request_key returned error %ld\n, PTR_ERR(mmc_key)); + } + + mmc_card_release_host(card); + return -EINVAL; +out: + mmc_card_release_host(card); + return len; +} + +static struct device_attribute mmc_dev_attr_lockable = + __ATTR(lockable, S_IWUSR | S_IRUGO, +mmc_lockable_show, mmc_lockable_store); + +#endif + static void mmc_release_card(struct device *dev) { @@ -234,6 +329,11 @@ int mmc_register_card(struct mmc_card *c if (ret)