[dm-devel] [PATCH 03/11] multipath-tools: Makefile.inc: allow user settings for LDFLAGS

2020-05-11 Thread mwilck
From: Martin Wilck This allows e.g. setting LDFLAGS="-m32 -Wl,-b,elf32-i386" to compile for a 32bit target on a 64bit system. Note that, like CFLAGS, the variable needs to be set in the environment, not on the "make" command line. Signed-off-by: Martin Wilck --- Makefile.inc | 2 +- 1 file ch

[dm-devel] [PATCH 09/11] multipath tools tests/Makefile: Fix OBJDEPS for hwtable-test

2020-05-11 Thread mwilck
From: Martin Wilck OBJDEPS needs to list object files that _call_ functions we want to wrap, but it should _not_ list the object files where these functions are defined; otherwise the linker might resolve these symbols before they can be wrapped. (Observed on i586 with gcc 9.3.1, ld 2.34.0, wher

[dm-devel] [PATCH 02/11] multipath-tools: Makefile.inc: separate out OPTFLAGS

2020-05-11 Thread mwilck
From: Martin Wilck OPTFLAGS is what distribution builds would typically override. That should not include the warning flags we use. Moreover, in the definition of CFLAGS, put $(CFLAGS) first to make it easier for the user to spot her input in the build logs. Signed-off-by: Martin Wilck --- Ma

[dm-devel] [PATCH 08/11] multipath-tools tests/Makefile: add -lmpathcmd to LIBDEPS

2020-05-11 Thread mwilck
From: Martin Wilck Make sure the linker finds libmpathcmd. Signed-off-by: Martin Wilck --- tests/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Makefile b/tests/Makefile index 77ff3249..028c9ea7 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -10,7 +10,7

[dm-devel] [PATCH 07/11] libmultipath: set_uint: fix parsing for 32bit

2020-05-11 Thread mwilck
From: Martin Wilck On architectures where sizeof(long) == sizeof(int), the code wouldn't work as intended. Use strtoul instead. As strtoul happily parses negative numbers as input, require the number to begin with a digit. Signed-off-by: Martin Wilck --- libmultipath/dict.c | 11 +++ 1

[dm-devel] [PATCH 04/11] multipath-tools: Makefile.inc: set -Wno-error=clobbered

2020-05-11 Thread mwilck
From: Martin Wilck We need to ignore -Wclobbered because gcc has trouble dealing with glibc's implementation of pthread_cleanup_push(). For some variants of gcc, -Wno-clobbered alone isn't enough if -Werror is also set. Compilation with -Wno-error=clobbered works, though. Signed-off-by: Martin

[dm-devel] [PATCH 06/11] libmultipath: eliminate more signed/unsigned comparisons

2020-05-11 Thread mwilck
From: Martin Wilck Fix some more compiler warnings about signed/unsigned comparison. I've observed these only on 32bit builds, therefore they went unnoticed before. Signed-off-by: Martin Wilck --- libmpathpersist/mpath_pr_ioctl.c | 2 +- libmultipath/print.c | 12 ++-

[dm-devel] [PATCH 11/11] multipath-tools tests/directio: fix -Wmaybe-uninitalized warning

2020-05-11 Thread mwilck
From: Martin Wilck Initialize aio_grp to satisfy gcc. Signed-off-by: Martin Wilck --- tests/directio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/directio.c b/tests/directio.c index 3cd7a520..66aaf0eb 100644 --- a/tests/directio.c +++ b/tests/directio.c @@ -316,7

[dm-devel] [PATCH 01/11] multipath-tools: Makefile: more dependency fixes for parallel build

2020-05-11 Thread mwilck
From: Martin Wilck Extend the late fixes from Christian. Cc: Christian Hesse Signed-off-by: Martin Wilck --- Makefile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index ba1d73ba..fec3b73b 100644 --- a/Makefile +++ b/Makefile @@ -28,8 +28,9 @@ al

[dm-devel] [PATCH 05/11] libmultipath: discovery.c: use %z qualifier for size_t

2020-05-11 Thread mwilck
From: Martin Wilck Otherwise compilation for 32bit targets spits out warnings. Signed-off-by: Martin Wilck --- libmultipath/discovery.c | 16 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c index ee3290cd..ffec5

[dm-devel] [PATCH 10/11] multipath-tools tests/test-lib.c: drop __wrap_is_claimed_by_foreign

2020-05-11 Thread mwilck
From: Martin Wilck is_claimed_by_foreign() is an inline function and can't be wrapped. Signed-off-by: Martin Wilck --- tests/test-lib.c | 6 -- 1 file changed, 6 deletions(-) diff --git a/tests/test-lib.c b/tests/test-lib.c index 59275163..00bae58e 100644 --- a/tests/test-lib.c +++ b/test

[dm-devel] [PATCH 00/11] Minor fixes for multipath-tools

2020-05-11 Thread mwilck
From: Martin Wilck Hi Christophe, hi Ben, This series fixes a couple of issues I recently found with the 32bit build of multipath-tools, and after integrating our CI into the automated builds on our build server. Regards Martin Martin Wilck (11): multipath-tools: Makefile: more dependency fi

Re: [dm-devel] [PATCH v4 0/2] Historical Service Time Path Selector

2020-05-11 Thread Gabriel Krisman Bertazi
Mike Snitzer writes: > OK, that concall's issue had nothing to do with needing higher > resolution time (was about IOPs realized with requested-based vs > bio-based). > > Reality is, DM won't need anything higher resolution than jiffies until > block core's interfaces require something other than

Re: [dm-devel] [PATCH v4 0/2] Historical Service Time Path Selector

2020-05-11 Thread Mike Snitzer
On Mon, May 11 2020 at 1:31pm -0400, Mike Snitzer wrote: > On Mon, May 11 2020 at 1:11pm -0400, > Gabriel Krisman Bertazi wrote: > > > Mike Snitzer writes: > > > > > On Mon, May 11 2020 at 12:39pm -0400, > > > Gabriel Krisman Bertazi wrote: > > > > > >> Hi, > > >> > > >> This fourth versi

Re: [dm-devel] [RFC PATCH v3 00/12] Integrity Policy Enforcement LSM (IPE)

2020-05-11 Thread Deven Bowers
On 5/10/2020 2:28 AM, Mickaël Salaün wrote: [...snip] Additionally, rules are evaluated top-to-bottom. As a result, any revocation rules, or denies should be placed early in the file to ensure that these rules are evaluated before a rule with "action=ALLOW" is hit. IPE policy is designed t

Re: [dm-devel] [PATCH v4 0/2] Historical Service Time Path Selector

2020-05-11 Thread Mike Snitzer
On Mon, May 11 2020 at 1:11pm -0400, Gabriel Krisman Bertazi wrote: > Mike Snitzer writes: > > > On Mon, May 11 2020 at 12:39pm -0400, > > Gabriel Krisman Bertazi wrote: > > > >> Hi, > >> > >> This fourth version of HST applies the suggestion from Mikulas Patocka > >> to do the ktime_get_ns

Re: [dm-devel] [PATCH v4 0/2] Historical Service Time Path Selector

2020-05-11 Thread Gabriel Krisman Bertazi
Mike Snitzer writes: > On Mon, May 11 2020 at 12:39pm -0400, > Gabriel Krisman Bertazi wrote: > >> Hi, >> >> This fourth version of HST applies the suggestion from Mikulas Patocka >> to do the ktime_get_ns inside the mpath map_bio instead of generic >> device-mapper code. This means that struct

Re: [dm-devel] [PATCH v4 0/2] Historical Service Time Path Selector

2020-05-11 Thread Mike Snitzer
On Mon, May 11 2020 at 12:39pm -0400, Gabriel Krisman Bertazi wrote: > Hi, > > This fourth version of HST applies the suggestion from Mikulas Patocka > to do the ktime_get_ns inside the mpath map_bio instead of generic > device-mapper code. This means that struct dm_mpath_io gained another > 64b

[dm-devel] [PATCH v4 2/2] md: mpath: Add Historical Service Time Path Selector

2020-05-11 Thread Gabriel Krisman Bertazi
From: Khazhismel Kumykov This new selector keeps an exponential moving average of the service time for each path (losely defined as delta between start_io and end_io), and uses this along with the number of inflight requests to estimate future service time for a path. Since we don't have a probe

[dm-devel] [PATCH v4 0/2] Historical Service Time Path Selector

2020-05-11 Thread Gabriel Krisman Bertazi
Hi, This fourth version of HST applies the suggestion from Mikulas Patocka to do the ktime_get_ns inside the mpath map_bio instead of generic device-mapper code. This means that struct dm_mpath_io gained another 64bit field. For the request-based case, we continue to use the block layer start tim

[dm-devel] [PATCH v4 1/2] md: mpath: Pass IO start time to path selector

2020-05-11 Thread Gabriel Krisman Bertazi
HST is going to need this information to perform path prediction. For request-based mpath, we use the struct request io_start_time, while for bio based, use the DM layer start_time. Signed-off-by: Gabriel Krisman Bertazi --- drivers/md/dm-mpath.c | 12 +--- drivers/md/dm-path-sel

Re: [dm-devel] [PATCHv5 00/14] dm-zoned: metadata version 2

2020-05-11 Thread Damien Le Moal
On 2020/05/11 20:46, Damien Le Moal wrote: > On 2020/05/11 20:25, Hannes Reinecke wrote: >> On 5/11/20 12:55 PM, Damien Le Moal wrote: >>> On 2020/05/11 11:46, Damien Le Moal wrote: Mike, I am still seeing the warning: [ 1827.839756] device-mapper: table: 253:1: adding targ

Re: [dm-devel] [PATCHv5 00/14] dm-zoned: metadata version 2

2020-05-11 Thread Damien Le Moal
On 2020/05/11 20:25, Hannes Reinecke wrote: > On 5/11/20 12:55 PM, Damien Le Moal wrote: >> On 2020/05/11 11:46, Damien Le Moal wrote: >>> Mike, >>> >>> I am still seeing the warning: >>> >>> [ 1827.839756] device-mapper: table: 253:1: adding target device sdj caused >>> an >>> alignment inconsist

Re: [dm-devel] [PATCHv5 00/14] dm-zoned: metadata version 2

2020-05-11 Thread Hannes Reinecke
On 5/11/20 12:55 PM, Damien Le Moal wrote: On 2020/05/11 11:46, Damien Le Moal wrote: Mike, I am still seeing the warning: [ 1827.839756] device-mapper: table: 253:1: adding target device sdj caused an alignment inconsistency: physical_block_size=4096, logical_block_size=4096, alignment_offset

Re: [dm-devel] [PATCHv5 00/14] dm-zoned: metadata version 2

2020-05-11 Thread Damien Le Moal
On 2020/05/11 20:19, Hannes Reinecke wrote: > On 5/11/20 12:55 PM, Damien Le Moal wrote: >> On 2020/05/11 11:46, Damien Le Moal wrote: >>> Mike, >>> >>> I am still seeing the warning: >>> >>> [ 1827.839756] device-mapper: table: 253:1: adding target device sdj caused >>> an >>> alignment inconsist

Re: [dm-devel] [PATCHv5 00/14] dm-zoned: metadata version 2

2020-05-11 Thread Hannes Reinecke
On 5/11/20 12:55 PM, Damien Le Moal wrote: On 2020/05/11 11:46, Damien Le Moal wrote: Mike, I am still seeing the warning: [ 1827.839756] device-mapper: table: 253:1: adding target device sdj caused an alignment inconsistency: physical_block_size=4096, logical_block_size=4096, alignment_offset

Re: [dm-devel] [PATCHv5 00/14] dm-zoned: metadata version 2

2020-05-11 Thread Damien Le Moal
On 2020/05/11 11:46, Damien Le Moal wrote: > Mike, > > I am still seeing the warning: > > [ 1827.839756] device-mapper: table: 253:1: adding target device sdj caused an > alignment inconsistency: physical_block_size=4096, logical_block_size=4096, > alignment_offset=0, start=0 > [ 1827.856738] dev

Re: [dm-devel] [PATCH 15/15] dm-zoned: metadata version 2

2020-05-11 Thread Damien Le Moal
On 2020/05/11 18:19, Hannes Reinecke wrote: > On 5/11/20 10:51 AM, Damien Le Moal wrote: >> On 2020/05/11 17:46, Hannes Reinecke wrote: >>> On 5/11/20 10:36 AM, Damien Le Moal wrote: On 2020/05/11 17:24, Hannes Reinecke wrote: > Implement handling for metadata version 2. The new metadata a

Re: [dm-devel] [PATCH 15/15] dm-zoned: metadata version 2

2020-05-11 Thread Hannes Reinecke
On 5/11/20 10:51 AM, Damien Le Moal wrote: On 2020/05/11 17:46, Hannes Reinecke wrote: On 5/11/20 10:36 AM, Damien Le Moal wrote: On 2020/05/11 17:24, Hannes Reinecke wrote: Implement handling for metadata version 2. The new metadata adds a label and UUID for the device mapper device, and addi

Re: [dm-devel] [PATCH 15/15] dm-zoned: metadata version 2

2020-05-11 Thread Damien Le Moal
On 2020/05/11 17:46, Hannes Reinecke wrote: > On 5/11/20 10:36 AM, Damien Le Moal wrote: >> On 2020/05/11 17:24, Hannes Reinecke wrote: >>> Implement handling for metadata version 2. The new metadata adds >>> a label and UUID for the device mapper device, and additional UUID >>> for the underlying

Re: [dm-devel] [PATCH 15/15] dm-zoned: metadata version 2

2020-05-11 Thread Hannes Reinecke
On 5/11/20 10:36 AM, Damien Le Moal wrote: On 2020/05/11 17:24, Hannes Reinecke wrote: Implement handling for metadata version 2. The new metadata adds a label and UUID for the device mapper device, and additional UUID for the underlying block devices. It also allows for an additional regular dr

Re: [dm-devel] [PATCH 15/15] dm-zoned: metadata version 2

2020-05-11 Thread Damien Le Moal
On 2020/05/11 17:24, Hannes Reinecke wrote: > Implement handling for metadata version 2. The new metadata adds > a label and UUID for the device mapper device, and additional UUID > for the underlying block devices. > It also allows for an additional regular drive to be used for > emulating random

[dm-devel] [PATCH 11/15] dm-zoned: use dmz_zone_to_dev() when handling metadata I/O

2020-05-11 Thread Hannes Reinecke
Use accessors to retrieve the device pointer in preparation for adding an additional block device. Signed-off-by: Hannes Reinecke Reviewed-by: Damien Le Moal Reviewed-by: Bob Liu --- drivers/md/dm-zoned-metadata.c | 12 +++- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a

[dm-devel] [PATCH 02/15] dm-zoned: add 'message' callback

2020-05-11 Thread Hannes Reinecke
Add callback for 'dmsetup message' to allow the reclaim process to be triggered manually. Eg. dmsetup message /dev/dm-X 0 message will start the reclaim process even if the default threshold of 50 percent of free random zones is not reached. Signed-off-by: Hannes Reinecke Reviewed-by: B

[dm-devel] [PATCH 12/15] dm-zoned: add metadata logging functions

2020-05-11 Thread Hannes Reinecke
Use the metadata label for logging and not the underlying device. Signed-off-by: Hannes Reinecke Reviewed-by: Damien Le Moal Reviewed-by: Bob Liu --- drivers/md/dm-zoned-metadata.c | 95 +- 1 file changed, 56 insertions(+), 39 deletions(-) diff --git a/

[dm-devel] [PATCH 03/15] dm-zoned: store zone id within the zone structure and kill dmz_id()

2020-05-11 Thread Hannes Reinecke
Instead of calculating the zone index by the offset within the zone array store the index within the structure itself. With that the helper dmz_id() is pointless and can be replaced with accessing the ->id value directly. Signed-off-by: Hannes Reinecke Reviewed-by: Bob Liu Reviewed-by: Damien Le

[dm-devel] [PATCH 06/15] dm-zoned: move fields from struct dmz_dev to dmz_metadata

2020-05-11 Thread Hannes Reinecke
Move fields from the device structure into the metadata structure and provide accessor functions. Signed-off-by: Hannes Reinecke Reviewed-by: Damien Le Moal Reviewed-by: Bob Liu --- drivers/md/dm-zoned-metadata.c | 88 -- drivers/md/dm-zoned-reclaim.c |

[dm-devel] [PATCH 14/15] dm-zoned: ignore metadata zone in dmz_alloc_zone()

2020-05-11 Thread Hannes Reinecke
When looking up zones in dmz_alloc_zone() we need to ignore metadata zones so as not to accidentally overwrite metadata. Signed-off-by: Hannes Reinecke Reviewed-by: Damien Le Moal Reviewed-by: Bob Liu --- drivers/md/dm-zoned-metadata.c | 6 ++ 1 file changed, 6 insertions(+) diff --git a/

[dm-devel] [PATCH 10/15] dm-zoned: replace 'target' pointer in the bio context

2020-05-11 Thread Hannes Reinecke
Replace the 'target' pointer in the bio context with the device pointer as this is what's actually used. Signed-off-by: Hannes Reinecke Reviewed-by: Bob Liu Reviewed-by: Damien Le Moal --- drivers/md/dm-zoned-target.c | 44 1 file changed, 24 insert

[dm-devel] [PATCH 01/15] dm-zoned: add 'status' callback

2020-05-11 Thread Hannes Reinecke
Add callback to supply information for 'dmsetup status' and 'dmsetup table'. The output for 'dmsetup status' is 0 zoned zones / random / sequential where is the number of unmapped (ie free) random zones, the total number of random zones, the number of unmapped sequential zones, and the tot

[dm-devel] [PATCHv6 00/14] dm-zoned: metadata version 2

2020-05-11 Thread Hannes Reinecke
Hi all, this patchset adds a new metadata version 2 for dm-zoned, which brings the following improvements: - UUIDs and labels: Adding three more fields to the metadata containing the dm-zoned device UUID and label, and the device UUID. This allows for an unique identification of the devices,

[dm-devel] [PATCH 08/15] dm-zoned: Introduce dmz_dev_is_dying() and dmz_check_dev()

2020-05-11 Thread Hannes Reinecke
Introduce accessors dmz_dev_is_dying() and dmz_check_dev() to avoid having to reference the devices directly. Signed-off-by: Hannes Reinecke Reviewed-by: Bob Liu Reviewed-by: Damien Le Moal --- drivers/md/dm-zoned-metadata.c | 14 -- drivers/md/dm-zoned-reclaim.c | 4 ++-- driver

[dm-devel] [PATCH 09/15] dm-zoned: remove 'dev' argument from reclaim

2020-05-11 Thread Hannes Reinecke
Use the dmz_zone_to_dev() mapping function to remove the 'dev' argument from reclaim. Signed-off-by: Hannes Reinecke Reviewed-by: Bob Liu Reviewed-by: Damien Le Moal --- drivers/md/dm-zoned-reclaim.c | 58 +++ drivers/md/dm-zoned-target.c | 2 +- drive

[dm-devel] [PATCH 13/15] dm-zoned: Reduce logging output on startup

2020-05-11 Thread Hannes Reinecke
dm-zoned is becoming quite chatty during startup; reduce the noise by moving some information to 'debug' level. Suggested-by: Mike Snitzer Signed-off-by: Hannes Reinecke Reviewed-by: Damien Le Moal --- drivers/md/dm-zoned-metadata.c | 24 1 file changed, 12 insertions(

[dm-devel] [PATCH 15/15] dm-zoned: metadata version 2

2020-05-11 Thread Hannes Reinecke
Implement handling for metadata version 2. The new metadata adds a label and UUID for the device mapper device, and additional UUID for the underlying block devices. It also allows for an additional regular drive to be used for emulating random access zones. The emulated zones will be placed logica

[dm-devel] [PATCH 07/15] dm-zoned: introduce dmz_metadata_label() to format device name

2020-05-11 Thread Hannes Reinecke
Introduce dmz_metadata_label() to format the device-mapper device name and use it instead of the device name of the underlying device. Signed-off-by: Hannes Reinecke Reviewed-by: Damien Le Moal Reviewed-by: Bob Liu --- drivers/md/dm-zoned-metadata.c | 11 ++- drivers/md/dm-zoned-reclaim.c

[dm-devel] [PATCH 05/15] dm-zoned: store device in struct dmz_sb

2020-05-11 Thread Hannes Reinecke
Store the device together with the superblock so that we don't have to recur to the metadata to find it. Signed-off-by: Hannes Reinecke Reviewed-by: Damien Le Moal Reviewed-by: Bob Liu --- drivers/md/dm-zoned-metadata.c | 90 +++--- 1 file changed, 59 insert

[dm-devel] [PATCH 04/15] dm-zoned: use array for superblock zones

2020-05-11 Thread Hannes Reinecke
Instead of storing just the first superblock zone and calculate the secondary relative to that we should be using an array for holding the superblock zones. Signed-off-by: Hannes Reinecke Reviewed-by: Damien Le Moal Reviewed-by: Bob Liu --- drivers/md/dm-zoned-metadata.c | 41 +

Re: [dm-devel] dm: track io errors per mapped device

2020-05-11 Thread kj
On Fri, May 8, 2020, at 17:09, Mike Snitzer wrote: > On Fri, May 08 2020 at 3:22pm -0400, > k...@orbekk.com wrote: > > > On Thu, May 7, 2020, at 21:12, Chaitanya Kulkarni wrote: > > > On 05/07/2020 04:06 PM, Kjetil Orbekk wrote: > > > > + if (tio->error) > > > > +

Re: [dm-devel] [PATCH] dm: track io errors per mapped device

2020-05-11 Thread kj
Hi Alasdair, Thank you for your time and comments. On Thu, May 7, 2020, at 20:18, Alasdair G Kergon wrote: > On Thu, May 07, 2020 at 07:05:33PM -0400, Kjetil Orbekk wrote: > > This will track ioerr_cnt on all dm targets and expose it as > > /dm/ioerr_cnt. > > How do you propose to use this? > Wh

Re: [dm-devel] [PATCH] dm: track io errors per mapped device

2020-05-11 Thread Chaitanya Kulkarni
On 05/07/2020 04:06 PM, Kjetil Orbekk wrote: > + if (tio->error) > + atomic_inc(&md->ioerr_cnt); Given that there are so many errors how would user know what kind of error is generated and how many times? -- dm-devel mailing list dm-devel@redhat.com https://www.

[dm-devel] [PATCH] dm integrity: Replace zero-length array with flexible-array

2020-05-11 Thread Gustavo A. R. Silva
The current codebase makes use of the zero-length array language extension to the C90 standard, but the preferred mechanism to declare variable-length types such as these ones is a flexible array member[1][2], introduced in C99: struct foo { int stuff; struct boo array[]; }; By ma

[dm-devel] [PATCH] dm: track io errors per mapped device

2020-05-11 Thread Kjetil Orbekk
From: Khazhismel Kumykov This will track ioerr_cnt on all dm targets and expose it as /dm/ioerr_cnt. Signed-off-by: Khazhismel Kumykov [k...@orbekk.com: added support for bio based devices in dm.c] Signed-off-by: Kjetil Orbekk --- drivers/md/dm-core.h | 2 ++ drivers/md/dm-rq.c| 4

Re: [dm-devel] [PATCH -next] dm mpath: Remove unused variable ret

2020-05-11 Thread Samuel Zou
Hi Mike, You are right. I did not notice that the macro DMEMIT uses the sz variable. Thanks. On 2020/5/7 22:29, Mike Snitzer wrote: On Thu, May 07 2020 at 8:26am -0400, Samuel Zou wrote: This patch fixes below warning reported by coccicheck: drivers/md/dm-historical-service-time.c:240:14-

Re: [dm-devel] [PATCH] dm: track io errors per mapped device

2020-05-11 Thread kj
On Thu, May 7, 2020, at 21:12, Chaitanya Kulkarni wrote: > On 05/07/2020 04:06 PM, Kjetil Orbekk wrote: > > + if (tio->error) > > + atomic_inc(&md->ioerr_cnt); > > Given that there are so many errors how would user know what > kind of error is generated and how many tim

Re: [dm-devel] [RFC PATCH v3 00/12] Integrity Policy Enforcement LSM (IPE)

2020-05-11 Thread Mickaël Salaün
On 15/04/2020 18:25, deven.de...@linux.microsoft.com wrote: > From: Deven Bowers > > Overview: > > > IPE is a Linux Security Module which allows for a configurable > policy to enforce integrity requirements on the whole system. It > attempts to solve the is