#define device_name_printk(dev, level, fmt, ...) do { \
struct rcu_string *name; \
\
rcu_read_lock(); \
name = rcu_dereference(dev->name); \
printk(level "%s: " fmt, name->str, ##__VA_ARGS__); \
rcu_read_unlock(); \
} while (0)
Right, that has the same problem of limiting flexibility in the device
name args. That's why I gave that example of a specific macro for
dereferencing a device name arg's rcu_string.
Does this diff make it more clear? It's generated on your patch, only
build tested..
- z
diff --git a/fs/btrfs/check-integrity.c b/fs/btrfs/check-integrity.c
index 2c07e80..614024e 100644
--- a/fs/btrfs/check-integrity.c
+++ b/fs/btrfs/check-integrity.c
@@ -844,18 +844,13 @@ static int btrfsic_process_superblock_dev_mirror(
superblock_tmp->never_written = 0;
superblock_tmp->mirror_num = 1 + superblock_mirror_num;
if (state->print_mask & BTRFSIC_PRINT_MASK_SUPERBLOCK_WRITE) {
- struct rcu_string *name;
-
- rcu_read_lock();
- name = rcu_dereference(device->name);
- printk(KERN_INFO "New initial S-block (bdev %p, %s)"
+ printk_in_rcu(KERN_INFO "New initial S-block (bdev %p, %s)"
" @%llu (%s/%llu/%d)\n",
- superblock_bdev, name->str,
+ superblock_bdev, rcu_str_deref(device->name),
(unsigned long long)dev_bytenr,
dev_state->name,
(unsigned long long)dev_bytenr,
superblock_mirror_num);
- rcu_read_unlock();
}
list_add(&superblock_tmp->all_blocks_node,
&state->all_blocks_list);
diff --git a/fs/btrfs/rcu-string.h b/fs/btrfs/rcu-string.h
index 4af8f61..a3a86bb 100644
--- a/fs/btrfs/rcu-string.h
+++ b/fs/btrfs/rcu-string.h
@@ -37,3 +37,14 @@ static inline void rcu_string_free(struct rcu_string
*str)
if (str)
kfree_rcu(str, rcu);
}
+
+#define printk_in_rcu(args...) do { \
+ rcu_read_lock(); \
+ printk(##args); \
+ rcu_read_unlock(); \
+} while (0)
+
+#define rcu_str_deref(rcu_str) ({ \
+ struct rcu_string *__str = rcu_dereference(rcu_str); \
+ __str->str; \
+})
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html