aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--block/sed-opal.c30
-rw-r--r--include/linux/sed-opal.h5
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
1990static 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
2003void free_opal_dev(struct opal_dev *dev)
2004{
2005 if (!dev)
2006 return;
2007 clean_opal_dev(dev);
2008 kfree(dev);
2009}
2010EXPORT_SYMBOL(free_opal_dev);
2011
1990struct opal_dev *init_opal_dev(void *data, sec_send_recv *send_recv) 2012struct 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
30void free_opal_dev(struct opal_dev *dev);
30bool opal_unlock_from_suspend(struct opal_dev *dev); 31bool opal_unlock_from_suspend(struct opal_dev *dev);
31struct opal_dev *init_opal_dev(void *data, sec_send_recv *send_recv); 32struct opal_dev *init_opal_dev(void *data, sec_send_recv *send_recv);
32int sed_ioctl(struct opal_dev *dev, unsigned int cmd, void __user *ioctl_ptr); 33int 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
55static inline void free_opal_dev(struct opal_dev *dev)
56{
57}
58
54static inline bool is_sed_ioctl(unsigned int cmd) 59static inline bool is_sed_ioctl(unsigned int cmd)
55{ 60{
56 return false; 61 return false;