dm cache: resolve small nits and improve Documentation
authorMike Snitzer <snitzer@redhat.com>
Tue, 12 Nov 2013 17:17:43 +0000 (12:17 -0500)
committerMike Snitzer <snitzer@redhat.com>
Tue, 12 Nov 2013 18:11:09 +0000 (13:11 -0500)
Document passthrough mode, cache shrinking, and cache invalidation.
Also, use strcasecmp() and hlist_unhashed().

Reported-by: Alasdair G Kergon <agk@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Documentation/device-mapper/cache.txt
drivers/md/dm-cache-policy-mq.c
drivers/md/dm-cache-target.c

index fc9d2dfb9415ec2d83a865599848c026267b6219..274752f8bdf963b0f1757f2df446f6c5a503c6a5 100644 (file)
@@ -86,16 +86,27 @@ If passthrough is selected, useful when the cache contents are not known
 to be coherent with the origin device, then all reads are served from
 the origin device (all reads miss the cache) and all writes are
 forwarded to the origin device; additionally, write hits cause cache
-block invalidates.  Passthrough mode allows a cache device to be
-activated without having to worry about coherency.  Coherency that
-exists is maintained, although the cache will gradually cool as writes
-take place.  If the coherency of the cache can later be verified, or
-established, the cache device can can be transitioned to writethrough or
-writeback mode while still warm.  Otherwise, the cache contents can be
-discarded prior to transitioning to the desired operating mode.
+block invalidates.  To enable passthrough mode the cache must be clean.
+Passthrough mode allows a cache device to be activated without having to
+worry about coherency.  Coherency that exists is maintained, although
+the cache will gradually cool as writes take place.  If the coherency of
+the cache can later be verified, or established through use of the
+"invalidate_cblocks" message, the cache device can be transitioned to
+writethrough or writeback mode while still warm.  Otherwise, the cache
+contents can be discarded prior to transitioning to the desired
+operating mode.
 
 A simple cleaner policy is provided, which will clean (write back) all
-dirty blocks in a cache.  Useful for decommissioning a cache.
+dirty blocks in a cache.  Useful for decommissioning a cache or when
+shrinking a cache.  Shrinking the cache's fast device requires all cache
+blocks, in the area of the cache being removed, to be clean.  If the
+area being removed from the cache still contains dirty blocks the resize
+will fail.  Care must be taken to never reduce the volume used for the
+cache's fast device until the cache is clean.  This is of particular
+importance if writeback mode is used.  Writethrough and passthrough
+modes already maintain a clean cache.  Future support to partially clean
+the cache, above a specified threshold, will allow for keeping the cache
+warm and in writeback mode during resize.
 
 Migration throttling
 --------------------
@@ -174,7 +185,7 @@ Constructor
  block size      : cache unit size in sectors
 
  #feature args   : number of feature arguments passed
- feature args    : writethrough (The default is writeback.)
+ feature args    : writethrough or passthrough (The default is writeback.)
 
  policy          : the replacement policy to use
  #policy args    : an even number of arguments corresponding to
@@ -190,6 +201,13 @@ Optional feature arguments are:
                   back cache block contents later for performance reasons,
                   so they may differ from the corresponding origin blocks.
 
+   passthrough  : a degraded mode useful for various cache coherency
+                  situations (e.g., rolling back snapshots of
+                  underlying storage).  Reads and writes always go to
+                  the origin.  If a write goes to a cached origin
+                  block, then the cache block is invalidated.
+                  To enable passthrough mode the cache must be clean.
+
 A policy called 'default' is always registered.  This is an alias for
 the policy we currently think is giving best all round performance.
 
@@ -247,7 +265,11 @@ E.g.
 
 Invalidation is removing an entry from the cache without writing it
 back.  Cache blocks can be invalidated via the invalidate_cblocks
-message, which takes an arbitrary number of cblock ranges.
+message, which takes an arbitrary number of cblock ranges.  Each cblock
+must be expressed as a decimal value, in the future a variant message
+that takes cblock ranges expressed in hexidecimal may be needed to
+better support efficient invalidation of larger caches.  The cache must
+be in passthrough mode when invalidate_cblocks is used.
 
    invalidate_cblocks [<cblock>|<cblock begin>-<cblock end>]*
 
index 7209fab8b8edade7a57e85e4da2c727b59e58d9e..416b7b752a6e0018d4a11800606a8be6b8890e22 100644 (file)
@@ -310,7 +310,7 @@ static void free_entry(struct entry_pool *ep, struct entry *e)
 static struct entry *epool_find(struct entry_pool *ep, dm_cblock_t cblock)
 {
        struct entry *e = ep->entries + from_cblock(cblock);
-       return e->hlist.pprev ? e : NULL;
+       return !hlist_unhashed(&e->hlist) ? e : NULL;
 }
 
 static bool epool_empty(struct entry_pool *ep)
index 41e664b474f146b5a474a758039f65594a7c34db..9efcf1059b99e3ae2e6e712eb150c0954646d5d8 100644 (file)
@@ -3057,7 +3057,7 @@ static int cache_message(struct dm_target *ti, unsigned argc, char **argv)
        if (!argc)
                return -EINVAL;
 
-       if (!strcmp(argv[0], "invalidate_cblocks"))
+       if (!strcasecmp(argv[0], "invalidate_cblocks"))
                return process_invalidate_cblocks_message(cache, argc - 1, (const char **) argv + 1);
 
        if (argc != 2)