btrfs: handle add/remove of sysfs links when devices are added/removed
diff mbox

Message ID 537FAA8B.3060402@suse.com
State Accepted
Headers show

Commit Message

Jeff Mahoney May 23, 2014, 8:07 p.m. UTC
btrfs currently publishes device membership via sysfs based on the devices
present when the file system is mounted. That publishing is not updated
when devices are added or removed while mounted.

This patch handles those events.

Signed-off-by: Jeff Mahoney <jeffm@suse.com>
---
 fs/btrfs/volumes.c |   11 +++++++++++
 1 file changed, 11 insertions(+)

Comments

Anand Jain May 26, 2014, 9:51 a.m. UTC | #1
Jeff,

  We were working on the same bugs. I have sent out my patches
  as well.

  Further I will be working on to revamp /sys/fs/btrfs/<fsid>/devices
  so that instead of links to block device we will have dir based
  on devices of the FS.

     [PATCH RFC] btrfs: revamp /sys/fs/btrfs/<fsid>/devices

  Comments appreciated.

Thanks, Anand


On 24/05/14 04:07, Jeff Mahoney wrote:
>
> btrfs currently publishes device membership via sysfs based on the devices
> present when the file system is mounted. That publishing is not updated
> when devices are added or removed while mounted.
>
> This patch handles those events.
>
> Signed-off-by: Jeff Mahoney <jeffm@suse.com>
> ---
>   fs/btrfs/volumes.c |   11 +++++++++++
>   1 file changed, 11 insertions(+)
>
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -1704,6 +1704,9 @@ int btrfs_rm_device(struct btrfs_root *r
>
>   	ret = 0;
>
> +	sysfs_remove_link(root->fs_info->device_dir_kobj,
> +			  part_to_dev(bdev->bd_part)->kobj.name);
> +
>   	/* Notify udev that device has changed */
>   	if (bdev)
>   		btrfs_kobject_uevent(bdev, KOBJ_CHANGE);
> @@ -2038,6 +2041,12 @@ int btrfs_init_new_device(struct btrfs_r
>   		goto error;
>   	}
>
> +	ret = sysfs_create_link(root->fs_info->device_dir_kobj,
> +				&part_to_dev(bdev->bd_part)->kobj,
> +				part_to_dev(bdev->bd_part)->kobj.name);
> +	if (ret)
> +		goto error;
> +
>   	lock_chunks(root);
>
>   	q = bdev_get_queue(bdev);
> @@ -2152,6 +2161,8 @@ error_trans:
>   	unlock_chunks(root);
>   	btrfs_end_transaction(trans, root);
>   	rcu_string_free(device->name);
> +	sysfs_remove_link(root->fs_info->device_dir_kobj,
> +			  part_to_dev(bdev->bd_part)->kobj.name);
>   	kfree(device);
>   error:
>   	blkdev_put(bdev, FMODE_EXCL);
>
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch
diff mbox

--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -1704,6 +1704,9 @@  int btrfs_rm_device(struct btrfs_root *r
 
 	ret = 0;
 
+	sysfs_remove_link(root->fs_info->device_dir_kobj,
+			  part_to_dev(bdev->bd_part)->kobj.name);
+
 	/* Notify udev that device has changed */
 	if (bdev)
 		btrfs_kobject_uevent(bdev, KOBJ_CHANGE);
@@ -2038,6 +2041,12 @@  int btrfs_init_new_device(struct btrfs_r
 		goto error;
 	}
 
+	ret = sysfs_create_link(root->fs_info->device_dir_kobj,
+				&part_to_dev(bdev->bd_part)->kobj,
+				part_to_dev(bdev->bd_part)->kobj.name);
+	if (ret)
+		goto error;
+
 	lock_chunks(root);
 
 	q = bdev_get_queue(bdev);
@@ -2152,6 +2161,8 @@  error_trans:
 	unlock_chunks(root);
 	btrfs_end_transaction(trans, root);
 	rcu_string_free(device->name);
+	sysfs_remove_link(root->fs_info->device_dir_kobj,
+			  part_to_dev(bdev->bd_part)->kobj.name);
 	kfree(device);
 error:
 	blkdev_put(bdev, FMODE_EXCL);