[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: RE: [PATCH v5] virtio-blk: add secure erase feature to specification
> From: Yadong Qi <yadong.qi@intel.com> > > There are user requests to use the Linux BLKSECDISCARD ioctl on virtio-blk > device. A secure discard is the same as a regular discard except that all copies of > the discarded blocks that were possibly created by garbage collection must also > be erased. This requires support from the device. And "secure erase" is more > commonly used in industry to name this feature. Hence in this proposal, extend > virtio-blk protocol to support secure erase command. > > Introduced new feature flag and command type: > VIRTIO_BLK_F_SECURE_ERASE > VIRTIO_BLK_T_SECURE_ERASE > > This feature is a passthrough feature on backend because it is hard to emulate a > secure erase. So virtio-blk will report this feature to guest OS if backend device > support such kind of feature. And when guest OS issues a secure erase command, > backend driver will passthrough the command to host device blocks. > > Introduced new fields in virtio_blk_config for secure erase commands: > struct virtio_blk_config { > ... > max_secure_erase_sectors; > max_secure_erase_seg; > secure_erase_sector_alignment; > }; > Fixes: https://github.com/oasis-tcs/virtio-spec/issues/125 > Signed-off-by: Yadong Qi <yadong.qi@intel.com> > --- > v1 -> v2: > - add separated queue limits for secure discard. > > v2 -> v3: > - reword "secure discard" to "secure erase". > - adjust offset of new fields > > v3 -> v4 > - unify the wording to "secure erase" > > v4 -> v5 > - fix typo > - adjust position of changelog > > --- > content.tex | 41 +++++++++++++++++++++++++++++++++-------- > 1 file changed, 33 insertions(+), 8 deletions(-) > > diff --git a/content.tex b/content.tex > index 5d112af..d380c51 100644 > --- a/content.tex > +++ b/content.tex > @@ -4435,6 +4435,11 @@ \subsection{Feature bits}\label{sec:Device Types / > Block Device / Feature bits} > > \item[VIRTIO_BLK_F_LIFETIME (15)] Device supports providing storage lifetime > information. > + > +\item[VIRTIO_BLK_F_SECURE_ERASE (16)] Device supports secure erase > command, > + maximum erase sectors count in \field{max_secure_erase_sectors} and > + maximum erase segment number in \field{max_secure_erase_seg}. > + > \end{description} > > \subsubsection{Legacy Interface: Feature bits}\label{sec:Device Types / Block > Device / Feature bits / Legacy Interface: Feature bits} @@ -4463,7 +4468,9 @@ > \subsection{Device configuration layout}\label{sec:Device Types / Block Device > / \field{discard_sector_alignment} are expressed in 512-byte units if the > VIRTIO_BLK_F_DISCARD feature bit is negotiated. The > \field{max_write_zeroes_sectors} is expressed in 512-byte units if the > VIRTIO_BLK_F_WRITE_ZEROES feature -bit is negotiated. > +bit is negotiated. The parameters in the configuration space of the > +device \field{max_secure_erase_sectors} > +\field{secure_erase_sector_alignment} are expressed in 512-byte units if the > VIRTIO_BLK_F_SECURE_ERASE feature bit is negotiated. > > \begin{lstlisting} > struct virtio_blk_config { > @@ -4496,6 +4503,9 @@ \subsection{Device configuration > layout}\label{sec:Device Types / Block Device / > le32 max_write_zeroes_seg; > u8 write_zeroes_may_unmap; > u8 unused1[3]; > + le32 max_secure_erase_sectors; > + le32 max_secure_erase_seg; > + le32 secure_erase_sector_alignment; > }; > \end{lstlisting} > > @@ -4552,6 +4562,13 @@ \subsection{Device Initialization}\label{sec:Device > Types / Block Device / Devic \item If the VIRTIO_BLK_F_MQ feature is > negotiated, \field{num_queues} field > can be read to determine the number of queues. > > +\item If the VIRTIO_BLK_F_SECURE_ERASE feature is negotiated, > + \field{max_secure_erase_sectors} and \field{max_secure_erase_seg} can be > read > + to determine the maximum secure erase sectors and maximum number of > + secure erase segments for the block driver to use. > + \field{secure_erase_sector_alignment} can be used by OS when splitting a > + request based on alignment. > + > \end{enumerate} > > \drivernormative{\subsubsection}{Device Initialization}{Device Types / Block > Device / Device Initialization} @@ -4619,7 +4636,8 @@ \subsection{Device > Operation}\label{sec:Device Types / Block Device / Device Ope The type of the > request is either a read (VIRTIO_BLK_T_IN), a write (VIRTIO_BLK_T_OUT), a > discard (VIRTIO_BLK_T_DISCARD), a write zeroes > (VIRTIO_BLK_T_WRITE_ZEROES), a flush (VIRTIO_BLK_T_FLUSH), a get device ID > -string command (VIRTIO_BLK_T_GET_ID), or a get device lifetime command > +string command (VIRTIO_BLK_T_GET_ID), a secure erase > +(VIRTIO_BLK_T_SECURE_ERASE), or a get device lifetime command > (VIRTIO_BLK_T_GET_LIFETIME). > > \begin{lstlisting} > @@ -4630,6 +4648,7 @@ \subsection{Device Operation}\label{sec:Device > Types / Block Device / Device Ope #define VIRTIO_BLK_T_GET_LIFETIME 10 > #define VIRTIO_BLK_T_DISCARD 11 > #define VIRTIO_BLK_T_WRITE_ZEROES 13 > +#define VIRTIO_BLK_T_SECURE_ERASE 14 > \end{lstlisting} > > The \field{sector} number indicates the offset (multiplied by 512) where @@ - > 4641,9 +4660,11 @@ \subsection{Device Operation}\label{sec:Device Types / > Block Device / Device Ope requests write the contents of \field{data} to the > block device (in multiples of 512 bytes). > > -The \field{data} used for discard or write zeroes commands consists of one or - > more segments. The maximum number of segments is \field{max_discard_seg} > for -discard commands and \field{max_write_zeroes_seg} for write zeroes > commands. > +The \field{data} used for discard, secure erase or write zeroes > +commands consists of one or more segments. The maximum number of > +segments is \field{max_discard_seg} for discard commands, > +\field{max_secure_erase_seg} for secure erase commands and > +\field{max_write_zeroes_seg} for write zeroes commands. > Each segment is of form: > > \begin{lstlisting} > @@ -4729,8 +4750,8 @@ \subsection{Device Operation}\label{sec:Device > Types / Block Device / Device Ope and VIRTIO_BLK_T_OUT requests. > > The length of \field{data} MUST be a multiple of the size of struct - > virtio_blk_discard_write_zeroes for VIRTIO_BLK_T_DISCARD and - > VIRTIO_BLK_T_WRITE_ZEROES requests. > +virtio_blk_discard_write_zeroes for VIRTIO_BLK_T_DISCARD, > +VIRTIO_BLK_T_SECURE_ERASE and VIRTIO_BLK_T_WRITE_ZEROES requests. > > The length of \field{data} MUST be 20 bytes for VIRTIO_BLK_T_GET_ID requests. > > @@ -4738,6 +4759,10 @@ \subsection{Device Operation}\label{sec:Device > Types / Block Device / Device Ope \field{max_discard_seg} struct > virtio_blk_discard_write_zeroes segments in \field{data}. > > +VIRTIO_BLK_T_SECURE_ERASE requests MUST NOT contain more than > +\field{max_secure_erase_seg} struct virtio_blk_discard_write_zeroes > +segments in \field{data}. > + > VIRTIO_BLK_T_WRITE_ZEROES requests MUST NOT contain more than > \field{max_write_zeroes_seg} struct virtio_blk_discard_write_zeroes segments > in \field{data}. > @@ -4764,7 +4789,7 @@ \subsection{Device Operation}\label{sec:Device > Types / Block Device / Device Ope write any data. > > The device MUST set the \field{status} byte to VIRTIO_BLK_S_UNSUPP for - > discard and write zeroes commands if any unknown flag is set. > +discard, secure erase and write zeroes commands if any unknown flag is set. > Furthermore, the device MUST set the \field{status} byte to > VIRTIO_BLK_S_UNSUPP for discard commands if the \field{unmap} flag is set. > > -- > 2.25.1
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]