linux-ext4.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] blkid: use proper statement instead of 0
@ 2013-06-19 17:14 Eryu Guan
  2013-06-19 17:14 ` [PATCH 2/2] blkid: fix broken garbage collection Eryu Guan
  0 siblings, 1 reply; 2+ messages in thread
From: Eryu Guan @ 2013-06-19 17:14 UTC (permalink / raw)
  To: linux-ext4; +Cc: tytso, Eryu Guan

NULL for pointers and '\0' for chars are more proper than 0.

Also fix a comment to match the code, bic_list should be bic_devs.

Signed-off-by: Eryu Guan <guaneryu@gmail.com>
---
 lib/blkid/blkidP.h | 2 +-
 lib/blkid/cache.c  | 2 +-
 lib/blkid/read.c   | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/lib/blkid/blkidP.h b/lib/blkid/blkidP.h
index e0f11a0..a99b242 100644
--- a/lib/blkid/blkidP.h
+++ b/lib/blkid/blkidP.h
@@ -83,7 +83,7 @@ typedef struct blkid_struct_tag *blkid_tag;
 #define BLKID_PROBE_INTERVAL	200
 
 /* This describes an entire blkid cache file and probed devices.
- * We can traverse all of the found devices via bic_list.
+ * We can traverse all of the found devices via bic_devs.
  * We can traverse all of the tag types by bic_tags, which hold empty tags
  * for each tag type.  Those tags can be used as list_heads for iterating
  * through all devices with a specific tag type (e.g. LABEL).
diff --git a/lib/blkid/cache.c b/lib/blkid/cache.c
index 8bdd239..1b6a86d 100644
--- a/lib/blkid/cache.c
+++ b/lib/blkid/cache.c
@@ -105,7 +105,7 @@ int blkid_get_cache(blkid_cache *ret_cache, const char *filename)
 	INIT_LIST_HEAD(&cache->bic_tags);
 
 	if (filename && !strlen(filename))
-		filename = 0;
+		filename = NULL;
 	if (!filename)
 		filename = safe_getenv("BLKID_FILE");
 	if (!filename)
diff --git a/lib/blkid/read.c b/lib/blkid/read.c
index efc348b..f182235 100644
--- a/lib/blkid/read.c
+++ b/lib/blkid/read.c
@@ -415,7 +415,7 @@ void blkid_read_cache(blkid_cache cache)
 		unsigned int end;
 
 		lineno++;
-		if (buf[0] == 0)
+		if (buf[0] == '\0')
 			continue;
 		end = strlen(buf) - 1;
 		/* Continue reading next line if it ends with a backslash */
-- 
1.8.2.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [PATCH 2/2] blkid: fix broken garbage collection
  2013-06-19 17:14 [PATCH 1/2] blkid: use proper statement instead of 0 Eryu Guan
@ 2013-06-19 17:14 ` Eryu Guan
  0 siblings, 0 replies; 2+ messages in thread
From: Eryu Guan @ 2013-06-19 17:14 UTC (permalink / raw)
  To: linux-ext4; +Cc: tytso, Eryu Guan

'blkid -g' fails to perform garbage collection on the blkid cache
since commit

fe144e1 libblkid: Refuse to create a device structure for a non-existent device

Non-existent devices won't be added to the cache->bic_devs list, so
blkid_gc_cache() couldn't even know the to-be-gc'ed devices.

To fix that a new cache flag BLKID_BIC_FL_GC is added to indicate that
there are stale devices in cache to be gc'ed, as devices are all valid
in cache->bic_devs we can just write out the cache to disk to perform
the garbage collection.

Tested by adding non-existent device entry to blkid.tab and running
'blkid -g' to see whether the entry is removed. 'make -C lib/blkid
check' reported no failures too.

Also fix the return value of 'blkid -g', return 0 instead.

Signed-off-by: Eryu Guan <guaneryu@gmail.com>
---
 lib/blkid/blkidP.h  |  1 +
 lib/blkid/cache.c   | 25 +++++++------------------
 lib/blkid/devname.c |  4 +++-
 misc/blkid.c        |  1 +
 4 files changed, 12 insertions(+), 19 deletions(-)

diff --git a/lib/blkid/blkidP.h b/lib/blkid/blkidP.h
index a99b242..f236400 100644
--- a/lib/blkid/blkidP.h
+++ b/lib/blkid/blkidP.h
@@ -100,6 +100,7 @@ struct blkid_struct_cache
 
 #define BLKID_BIC_FL_PROBED	0x0002	/* We probed /proc/partition devices */
 #define BLKID_BIC_FL_CHANGED	0x0004	/* Cache has changed from disk */
+#define BLKID_BIC_FL_GC		0x0008	/* Cache has stale devices */
 
 extern char *blkid_strdup(const char *s);
 extern char *blkid_strndup(const char *s, const int length);
diff --git a/lib/blkid/cache.c b/lib/blkid/cache.c
index 1b6a86d..0a68639 100644
--- a/lib/blkid/cache.c
+++ b/lib/blkid/cache.c
@@ -159,26 +159,15 @@ void blkid_put_cache(blkid_cache cache)
 
 void blkid_gc_cache(blkid_cache cache)
 {
-	struct list_head *p, *pnext;
-	struct stat st;
-
-	if (!cache)
+	if (!cache || !(cache->bic_flags & BLKID_BIC_FL_GC))
 		return;
 
-	list_for_each_safe(p, pnext, &cache->bic_devs) {
-		blkid_dev dev = list_entry(p, struct blkid_struct_dev, bid_devs);
-		if (!p)
-			break;
-		if (stat(dev->bid_name, &st) < 0) {
-			DBG(DEBUG_CACHE,
-			    printf("freeing %s\n", dev->bid_name));
-			blkid_free_dev(dev);
-			cache->bic_flags |= BLKID_BIC_FL_CHANGED;
-		} else {
-			DBG(DEBUG_CACHE,
-			    printf("Device %s exists\n", dev->bid_name));
-		}
-	}
+	/*
+	 * Only valid devices are kept in cache, set BLKID_BIC_FL_CHANGED
+	 * to write cache to disk to perform a garbage collection.
+	 */
+	cache->bic_flags |= BLKID_BIC_FL_CHANGED;
+	return;
 }
 
 
diff --git a/lib/blkid/devname.c b/lib/blkid/devname.c
index a6673c1..0d8e66f 100644
--- a/lib/blkid/devname.c
+++ b/lib/blkid/devname.c
@@ -66,8 +66,10 @@ blkid_dev blkid_get_dev(blkid_cache cache, const char *devname, int flags)
 	}
 
 	if (!dev && (flags & BLKID_DEV_CREATE)) {
-		if (access(devname, F_OK) < 0)
+		if (access(devname, F_OK) < 0) {
+			cache->bic_flags |= BLKID_BIC_FL_GC;
 			return NULL;
+		}
 		dev = blkid_new_dev();
 		if (!dev)
 			return NULL;
diff --git a/misc/blkid.c b/misc/blkid.c
index a4a8db0..b269eeb 100644
--- a/misc/blkid.c
+++ b/misc/blkid.c
@@ -365,6 +365,7 @@ int main(int argc, char **argv)
 	err = 2;
 	if (gc) {
 		blkid_gc_cache(cache);
+		err = 0;
 		goto exit;
 	}
 	if (output_format & OUTPUT_PRETTY_LIST)
-- 
1.8.2.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2013-06-19 17:15 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-06-19 17:14 [PATCH 1/2] blkid: use proper statement instead of 0 Eryu Guan
2013-06-19 17:14 ` [PATCH 2/2] blkid: fix broken garbage collection Eryu Guan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).