forked from mirrors/linux
New sysfs attributes that track the filesystem status of devices, stored
in the per-filesystem directory in /sys/fs/btrfs/FSID/devinfo . There's
a directory for each device, with name corresponding to the numerical
device id.
in_fs_metadata - device is in the list of fs metadata
missing - device is missing (no device node or block device)
replace_target - device is target of replace
writeable - writes from fs are allowed
These attributes reflect the state of the device::dev_state and created
at mount time.
Sample output:
$ pwd
/sys/fs/btrfs/6e1961f1-5918-4ecc-a22f-948897b409f7/devinfo/1/
$ ls
in_fs_metadata missing replace_target writeable
$ cat missing
0
The output from these attributes are 0 or 1. 0 indicates unset and 1
indicates set. These attributes are readonly.
It is observed that the device delete thread and sysfs read thread will
not race because the delete thread calls sysfs kobject_put() which in
turn waits for existing sysfs read to complete.
Note for device replace devid swap:
During the replace the target device temporarily assumes devid 0 before
assigning the devid of the soruce device.
In btrfs_dev_replace_finishing() we remove source sysfs devid using the
function btrfs_sysfs_remove_devices_attr(), so after that call
kobject_rename() to update the devid in the sysfs. This adds and calls
btrfs_sysfs_update_devid() helper function to update the device id.
Signed-off-by: Anand Jain <anand.jain@oracle.com>
Reviewed-by: David Sterba <dsterba@suse.com>
[ update changelog ]
Signed-off-by: David Sterba <dsterba@suse.com>
39 lines
1.5 KiB
C
39 lines
1.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
|
|
#ifndef BTRFS_SYSFS_H
|
|
#define BTRFS_SYSFS_H
|
|
|
|
#include <linux/kobject.h>
|
|
|
|
enum btrfs_feature_set {
|
|
FEAT_COMPAT,
|
|
FEAT_COMPAT_RO,
|
|
FEAT_INCOMPAT,
|
|
FEAT_MAX
|
|
};
|
|
|
|
char *btrfs_printable_features(enum btrfs_feature_set set, u64 flags);
|
|
const char * const btrfs_feature_set_name(enum btrfs_feature_set set);
|
|
int btrfs_sysfs_add_device_link(struct btrfs_fs_devices *fs_devices,
|
|
struct btrfs_device *one_device);
|
|
int btrfs_sysfs_rm_device_link(struct btrfs_fs_devices *fs_devices,
|
|
struct btrfs_device *one_device);
|
|
int btrfs_sysfs_add_fsid(struct btrfs_fs_devices *fs_devs);
|
|
void btrfs_sysfs_remove_fsid(struct btrfs_fs_devices *fs_devs);
|
|
void btrfs_sysfs_update_sprout_fsid(struct btrfs_fs_devices *fs_devices,
|
|
const u8 *fsid);
|
|
void btrfs_sysfs_feature_update(struct btrfs_fs_info *fs_info,
|
|
u64 bit, enum btrfs_feature_set set);
|
|
void btrfs_kobject_uevent(struct block_device *bdev, enum kobject_action action);
|
|
|
|
int __init btrfs_init_sysfs(void);
|
|
void __cold btrfs_exit_sysfs(void);
|
|
int btrfs_sysfs_add_mounted(struct btrfs_fs_info *fs_info);
|
|
void btrfs_sysfs_remove_mounted(struct btrfs_fs_info *fs_info);
|
|
void btrfs_sysfs_add_block_group_type(struct btrfs_block_group *cache);
|
|
int btrfs_sysfs_add_space_info_type(struct btrfs_fs_info *fs_info,
|
|
struct btrfs_space_info *space_info);
|
|
void btrfs_sysfs_remove_space_info(struct btrfs_space_info *space_info);
|
|
void btrfs_sysfs_update_devid(struct btrfs_device *device);
|
|
|
|
#endif
|