diff options
| -rw-r--r-- | block/sed-opal.c | 30 | ||||
| -rw-r--r-- | include/linux/sed-opal.h | 5 |
2 files changed, 35 insertions, 0 deletions
diff --git a/block/sed-opal.c b/block/sed-opal.c index 893557554cc5..020bf3e28e38 100644 --- a/block/sed-opal.c +++ b/block/sed-opal.c | |||
| @@ -1987,6 +1987,28 @@ static int check_opal_support(struct opal_dev *dev) | |||
| 1987 | return ret; | 1987 | return ret; |
| 1988 | } | 1988 | } |
| 1989 | 1989 | ||
| 1990 | static void clean_opal_dev(struct opal_dev *dev) | ||
| 1991 | { | ||
| 1992 | |||
| 1993 | struct opal_suspend_data *suspend, *next; | ||
| 1994 | |||
| 1995 | mutex_lock(&dev->dev_lock); | ||
| 1996 | list_for_each_entry_safe(suspend, next, &dev->unlk_lst, node) { | ||
| 1997 | list_del(&suspend->node); | ||
| 1998 | kfree(suspend); | ||
| 1999 | } | ||
| 2000 | mutex_unlock(&dev->dev_lock); | ||
| 2001 | } | ||
| 2002 | |||
| 2003 | void free_opal_dev(struct opal_dev *dev) | ||
| 2004 | { | ||
| 2005 | if (!dev) | ||
| 2006 | return; | ||
| 2007 | clean_opal_dev(dev); | ||
| 2008 | kfree(dev); | ||
| 2009 | } | ||
| 2010 | EXPORT_SYMBOL(free_opal_dev); | ||
| 2011 | |||
| 1990 | struct opal_dev *init_opal_dev(void *data, sec_send_recv *send_recv) | 2012 | struct opal_dev *init_opal_dev(void *data, sec_send_recv *send_recv) |
| 1991 | { | 2013 | { |
| 1992 | struct opal_dev *dev; | 2014 | struct opal_dev *dev; |
| @@ -2141,6 +2163,14 @@ static int opal_reverttper(struct opal_dev *dev, struct opal_key *opal) | |||
| 2141 | setup_opal_dev(dev, revert_steps); | 2163 | setup_opal_dev(dev, revert_steps); |
| 2142 | ret = next(dev); | 2164 | ret = next(dev); |
| 2143 | mutex_unlock(&dev->dev_lock); | 2165 | mutex_unlock(&dev->dev_lock); |
| 2166 | |||
| 2167 | /* | ||
| 2168 | * If we successfully reverted lets clean | ||
| 2169 | * any saved locking ranges. | ||
| 2170 | */ | ||
| 2171 | if (!ret) | ||
| 2172 | clean_opal_dev(dev); | ||
| 2173 | |||
| 2144 | return ret; | 2174 | return ret; |
| 2145 | } | 2175 | } |
| 2146 | 2176 | ||
diff --git a/include/linux/sed-opal.h b/include/linux/sed-opal.h index deee23d012e7..04b124fca51e 100644 --- a/include/linux/sed-opal.h +++ b/include/linux/sed-opal.h | |||
| @@ -27,6 +27,7 @@ typedef int (sec_send_recv)(void *data, u16 spsp, u8 secp, void *buffer, | |||
| 27 | size_t len, bool send); | 27 | size_t len, bool send); |
| 28 | 28 | ||
| 29 | #ifdef CONFIG_BLK_SED_OPAL | 29 | #ifdef CONFIG_BLK_SED_OPAL |
| 30 | void free_opal_dev(struct opal_dev *dev); | ||
| 30 | bool opal_unlock_from_suspend(struct opal_dev *dev); | 31 | bool opal_unlock_from_suspend(struct opal_dev *dev); |
| 31 | struct opal_dev *init_opal_dev(void *data, sec_send_recv *send_recv); | 32 | struct opal_dev *init_opal_dev(void *data, sec_send_recv *send_recv); |
| 32 | int sed_ioctl(struct opal_dev *dev, unsigned int cmd, void __user *ioctl_ptr); | 33 | int sed_ioctl(struct opal_dev *dev, unsigned int cmd, void __user *ioctl_ptr); |
| @@ -51,6 +52,10 @@ static inline bool is_sed_ioctl(unsigned int cmd) | |||
| 51 | return false; | 52 | return false; |
| 52 | } | 53 | } |
| 53 | #else | 54 | #else |
| 55 | static inline void free_opal_dev(struct opal_dev *dev) | ||
| 56 | { | ||
| 57 | } | ||
| 58 | |||
| 54 | static inline bool is_sed_ioctl(unsigned int cmd) | 59 | static inline bool is_sed_ioctl(unsigned int cmd) |
| 55 | { | 60 | { |
| 56 | return false; | 61 | return false; |
