Re: [PATCH] Btrfs: use rcu to protect device->name V2

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




#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


[Index of Archives]     [Linux Filesystem Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux