Btrfs: use rcu to protect device->name
Al pointed out that we can just toss out the old name on a device and add a new one arbitrarily, so anybody who uses device->name in printk could possibly use free'd memory. Instead of adding locking around all of this he suggested doing it with RCU, so I've introduced a struct rcu_string that does just that and have gone through and protected all accesses to device->name that aren't under the uuid_mutex with rcu_read_lock(). This protects us and I will use it for dealing with removing the device that we used to mount the file system in a later patch. Thanks, Reviewed-by: David Sterba <dsterba@suse.cz> Signed-off-by: Josef Bacik <josef@redhat.com>
This commit is contained in:
@@ -20,6 +20,7 @@
|
||||
#include "volumes.h"
|
||||
#include "check-integrity.h"
|
||||
#include "locking.h"
|
||||
#include "rcu-string.h"
|
||||
|
||||
static struct kmem_cache *extent_state_cache;
|
||||
static struct kmem_cache *extent_buffer_cache;
|
||||
@@ -1917,9 +1918,9 @@ int repair_io_failure(struct btrfs_mapping_tree *map_tree, u64 start,
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
printk(KERN_INFO "btrfs read error corrected: ino %lu off %llu (dev %s "
|
||||
"sector %llu)\n", page->mapping->host->i_ino, start,
|
||||
dev->name, sector);
|
||||
printk_in_rcu(KERN_INFO "btrfs read error corrected: ino %lu off %llu "
|
||||
"(dev %s sector %llu)\n", page->mapping->host->i_ino,
|
||||
start, rcu_str_deref(dev->name), sector);
|
||||
|
||||
bio_put(bio);
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user