diff options
Diffstat (limited to 'block/sed-opal.c')
-rw-r--r-- | block/sed-opal.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/block/sed-opal.c b/block/sed-opal.c index c54019c11e91..f94f359dd688 100644 --- a/block/sed-opal.c +++ b/block/sed-opal.c | |||
@@ -1989,6 +1989,30 @@ static int opal_enable_disable_shadow_mbr(struct opal_dev *dev, | |||
1989 | return ret; | 1989 | return ret; |
1990 | } | 1990 | } |
1991 | 1991 | ||
1992 | static int opal_set_mbr_done(struct opal_dev *dev, | ||
1993 | struct opal_mbr_done *mbr_done) | ||
1994 | { | ||
1995 | u8 mbr_done_tf = mbr_done->done_flag == OPAL_MBR_DONE ? | ||
1996 | OPAL_TRUE : OPAL_FALSE; | ||
1997 | |||
1998 | const struct opal_step mbr_steps[] = { | ||
1999 | { start_admin1LSP_opal_session, &mbr_done->key }, | ||
2000 | { set_mbr_done, &mbr_done_tf }, | ||
2001 | { end_opal_session, } | ||
2002 | }; | ||
2003 | int ret; | ||
2004 | |||
2005 | if (mbr_done->done_flag != OPAL_MBR_DONE && | ||
2006 | mbr_done->done_flag != OPAL_MBR_NOT_DONE) | ||
2007 | return -EINVAL; | ||
2008 | |||
2009 | mutex_lock(&dev->dev_lock); | ||
2010 | setup_opal_dev(dev); | ||
2011 | ret = execute_steps(dev, mbr_steps, ARRAY_SIZE(mbr_steps)); | ||
2012 | mutex_unlock(&dev->dev_lock); | ||
2013 | return ret; | ||
2014 | } | ||
2015 | |||
1992 | static int opal_save(struct opal_dev *dev, struct opal_lock_unlock *lk_unlk) | 2016 | static int opal_save(struct opal_dev *dev, struct opal_lock_unlock *lk_unlk) |
1993 | { | 2017 | { |
1994 | struct opal_suspend_data *suspend; | 2018 | struct opal_suspend_data *suspend; |
@@ -2310,6 +2334,9 @@ int sed_ioctl(struct opal_dev *dev, unsigned int cmd, void __user *arg) | |||
2310 | case IOC_OPAL_ENABLE_DISABLE_MBR: | 2334 | case IOC_OPAL_ENABLE_DISABLE_MBR: |
2311 | ret = opal_enable_disable_shadow_mbr(dev, p); | 2335 | ret = opal_enable_disable_shadow_mbr(dev, p); |
2312 | break; | 2336 | break; |
2337 | case IOC_OPAL_MBR_DONE: | ||
2338 | ret = opal_set_mbr_done(dev, p); | ||
2339 | break; | ||
2313 | case IOC_OPAL_ERASE_LR: | 2340 | case IOC_OPAL_ERASE_LR: |
2314 | ret = opal_erase_locking_range(dev, p); | 2341 | ret = opal_erase_locking_range(dev, p); |
2315 | break; | 2342 | break; |