summaryrefslogtreecommitdiffstats
path: root/block/sed-opal.c
diff options
context:
space:
mode:
Diffstat (limited to 'block/sed-opal.c')
-rw-r--r--block/sed-opal.c27
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
1992static 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
1992static int opal_save(struct opal_dev *dev, struct opal_lock_unlock *lk_unlk) 2016static 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;