Message ID | 20200803202913.15913-3-rgoldwyn@suse.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs: Enumerate and export exclusive operations | expand |
On 3.08.20 г. 23:29 ч., Goldwyn Rodrigues wrote: > From: Goldwyn Rodrigues <rgoldwyn@suse.com> > > /sys/fs/<fsid>/exclusive_operation contains the currently executing > exclusive operation. Add a sysfs_notify() when operation end, so > userspace can be notified of exclusive operation is finished. > > Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com> Reviewed-by: Nikolay Borisov <nborisov@suse.com> > --- > fs/btrfs/ioctl.c | 2 ++ > fs/btrfs/sysfs.c | 25 +++++++++++++++++++++++++ > 2 files changed, 27 insertions(+) > > diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c > index 3352b4ffa5c6..664c02a5baf9 100644 > --- a/fs/btrfs/ioctl.c > +++ b/fs/btrfs/ioctl.c > @@ -373,6 +373,8 @@ bool btrfs_exclop_start(struct btrfs_fs_info *fs_info, int type) > void btrfs_exclop_finish(struct btrfs_fs_info *fs_info) > { > atomic_set(&fs_info->exclusive_operation, BTRFS_EXCLOP_NONE); > + sysfs_notify(&fs_info->fs_devices->fsid_kobj, NULL, > + "exclusive_operation"); > } > > /* > diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c > index a39bff64ff24..71950c121588 100644 > --- a/fs/btrfs/sysfs.c > +++ b/fs/btrfs/sysfs.c > @@ -808,6 +808,30 @@ static ssize_t btrfs_checksum_show(struct kobject *kobj, > > BTRFS_ATTR(, checksum, btrfs_checksum_show); > > +static ssize_t btrfs_exclusive_operation_show(struct kobject *kobj, > + struct kobj_attribute *a, char *buf) > +{ > + struct btrfs_fs_info *fs_info = to_fs_info(kobj); > + switch (atomic_read(&fs_info->exclusive_operation)) { > + case BTRFS_EXCLOP_NONE: > + return scnprintf(buf, PAGE_SIZE, "none\n"); > + case BTRFS_EXCLOP_BALANCE: > + return scnprintf(buf, PAGE_SIZE, "balance\n"); > + case BTRFS_EXCLOP_DEV_ADD: > + return scnprintf(buf, PAGE_SIZE, "device add\n"); > + case BTRFS_EXCLOP_DEV_REPLACE: > + return scnprintf(buf, PAGE_SIZE, "device replace\n"); > + case BTRFS_EXCLOP_DEV_REMOVE: > + return scnprintf(buf, PAGE_SIZE, "device remove\n"); > + case BTRFS_EXCLOP_SWAP_ACTIVATE: > + return scnprintf(buf, PAGE_SIZE, "swap activate\n"); > + case BTRFS_EXCLOP_RESIZE: > + return scnprintf(buf, PAGE_SIZE, "resize\n"); > + } > + return 0; > +} > +BTRFS_ATTR(, exclusive_operation, btrfs_exclusive_operation_show); > + > static const struct attribute *btrfs_attrs[] = { > BTRFS_ATTR_PTR(, label), > BTRFS_ATTR_PTR(, nodesize), > @@ -816,6 +840,7 @@ static const struct attribute *btrfs_attrs[] = { > BTRFS_ATTR_PTR(, quota_override), > BTRFS_ATTR_PTR(, metadata_uuid), > BTRFS_ATTR_PTR(, checksum), > + BTRFS_ATTR_PTR(, exclusive_operation), > NULL, > }; > >
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 3352b4ffa5c6..664c02a5baf9 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -373,6 +373,8 @@ bool btrfs_exclop_start(struct btrfs_fs_info *fs_info, int type) void btrfs_exclop_finish(struct btrfs_fs_info *fs_info) { atomic_set(&fs_info->exclusive_operation, BTRFS_EXCLOP_NONE); + sysfs_notify(&fs_info->fs_devices->fsid_kobj, NULL, + "exclusive_operation"); } /* diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c index a39bff64ff24..71950c121588 100644 --- a/fs/btrfs/sysfs.c +++ b/fs/btrfs/sysfs.c @@ -808,6 +808,30 @@ static ssize_t btrfs_checksum_show(struct kobject *kobj, BTRFS_ATTR(, checksum, btrfs_checksum_show); +static ssize_t btrfs_exclusive_operation_show(struct kobject *kobj, + struct kobj_attribute *a, char *buf) +{ + struct btrfs_fs_info *fs_info = to_fs_info(kobj); + switch (atomic_read(&fs_info->exclusive_operation)) { + case BTRFS_EXCLOP_NONE: + return scnprintf(buf, PAGE_SIZE, "none\n"); + case BTRFS_EXCLOP_BALANCE: + return scnprintf(buf, PAGE_SIZE, "balance\n"); + case BTRFS_EXCLOP_DEV_ADD: + return scnprintf(buf, PAGE_SIZE, "device add\n"); + case BTRFS_EXCLOP_DEV_REPLACE: + return scnprintf(buf, PAGE_SIZE, "device replace\n"); + case BTRFS_EXCLOP_DEV_REMOVE: + return scnprintf(buf, PAGE_SIZE, "device remove\n"); + case BTRFS_EXCLOP_SWAP_ACTIVATE: + return scnprintf(buf, PAGE_SIZE, "swap activate\n"); + case BTRFS_EXCLOP_RESIZE: + return scnprintf(buf, PAGE_SIZE, "resize\n"); + } + return 0; +} +BTRFS_ATTR(, exclusive_operation, btrfs_exclusive_operation_show); + static const struct attribute *btrfs_attrs[] = { BTRFS_ATTR_PTR(, label), BTRFS_ATTR_PTR(, nodesize), @@ -816,6 +840,7 @@ static const struct attribute *btrfs_attrs[] = { BTRFS_ATTR_PTR(, quota_override), BTRFS_ATTR_PTR(, metadata_uuid), BTRFS_ATTR_PTR(, checksum), + BTRFS_ATTR_PTR(, exclusive_operation), NULL, };