On Fri, May 25, 2012 at 04:07:17PM +0200, Stefan Behrens wrote:
> Two convenient utility functions that have so far been local to scrub are
> moved to utils.c.
> They will be used in the device stats code in a following commit.
>
[snip]
> -
> -static int scrub_fs_info(int fd, char *path,
> - struct btrfs_ioctl_fs_info_args *fi_args,
> - struct btrfs_ioctl_dev_info_args **di_ret)
> -{
> - int ret = 0;
> - int ndevs = 0;
> - int i = 1;
> - struct btrfs_fs_devices *fs_devices_mnt = NULL;
> - struct btrfs_ioctl_dev_info_args *di_args;
> - char mp[BTRFS_PATH_NAME_MAX + 1];
> -
> - memset(fi_args, 0, sizeof(*fi_args));
> -
> - ret = ioctl(fd, BTRFS_IOC_FS_INFO, fi_args);
> - if (ret && errno == EINVAL) {
what's removed here...
> - /* path is no mounted btrfs. try if it's a device */
> - ret = check_mounted_where(fd, path, mp, sizeof(mp),
> - &fs_devices_mnt);
> - if (!ret)
> - return -EINVAL;
> - if (ret < 0)
> - return ret;
> - fi_args->num_devices = 1;
> - fi_args->max_id = fs_devices_mnt->latest_devid;
> - i = fs_devices_mnt->latest_devid;
> - memcpy(fi_args->fsid, fs_devices_mnt->fsid, BTRFS_FSID_SIZE);
> - close(fd);
> - fd = open_file_or_dir(mp);
> - if (fd < 0)
> - return -errno;
> - } else if (ret) {
> - return -errno;
> - }
> -
> - if (!fi_args->num_devices)
> - return 0;
> -
> - di_args = *di_ret = malloc(fi_args->num_devices * sizeof(*di_args));
> - if (!di_args)
> - return -errno;
> -
> - for (; i <= fi_args->max_id; ++i) {
> - BUG_ON(ndevs >= fi_args->num_devices);
> - ret = scrub_device_info(fd, i, &di_args[ndevs]);
> - if (ret == -ENODEV)
> - continue;
> - if (ret)
> - return ret;
> - ++ndevs;
> - }
[snip]
> diff --git a/utils.c b/utils.c
> index 6157115..037f64b 100644
> --- a/utils.c
> +++ b/utils.c
> @@ -1233,3 +1233,69 @@ int open_file_or_dir(const char *fname)
> return fd;
> }
>
> +int get_device_info(int fd, u64 devid,
> + struct btrfs_ioctl_dev_info_args *di_args)
> +{
> + int ret;
> +
> + di_args->devid = devid;
> + memset(&di_args->uuid, '\0', sizeof(di_args->uuid));
> +
> + ret = ioctl(fd, BTRFS_IOC_DEV_INFO, di_args);
> + return ret ? -errno : 0;
> +}
> +
> +int get_fs_info(int fd, char *path, struct btrfs_ioctl_fs_info_args *fi_args,
> + struct btrfs_ioctl_dev_info_args **di_ret)
> +{
> + int ret = 0;
> + int ndevs = 0;
> + int i = 1;
> + struct btrfs_fs_devices *fs_devices_mnt = NULL;
> + struct btrfs_ioctl_dev_info_args *di_args;
> + char mp[BTRFS_PATH_NAME_MAX + 1];
> +
> + memset(fi_args, 0, sizeof(*fi_args));
> +
> + ret = ioctl(fd, BTRFS_IOC_FS_INFO, fi_args);
> + if (ret && (errno == EINVAL || errno == ENOTTY)) {
... isn't what's added here. (And the same for the function name).
It's possibly a minor point, but I did end up having to do a diff with
a Mark-I eyeball just to get a merge of this code right.
Hugo.
> + /* path is not a mounted btrfs. Try if it's a device */
> + ret = check_mounted_where(fd, path, mp, sizeof(mp),
> + &fs_devices_mnt);
> + if (!ret)
> + return -EINVAL;
> + if (ret < 0)
> + return ret;
> + fi_args->num_devices = 1;
> + fi_args->max_id = fs_devices_mnt->latest_devid;
> + i = fs_devices_mnt->latest_devid;
> + memcpy(fi_args->fsid, fs_devices_mnt->fsid, BTRFS_FSID_SIZE);
> + close(fd);
> + fd = open_file_or_dir(mp);
> + if (fd < 0)
> + return -errno;
> + } else if (ret) {
> + return -errno;
> + }
> +
> + if (!fi_args->num_devices)
> + return 0;
> +
> + di_args = *di_ret = malloc(fi_args->num_devices * sizeof(*di_args));
> + if (!di_args)
> + return -errno;
> +
> + for (; i <= fi_args->max_id; ++i) {
> + BUG_ON(ndevs >= fi_args->num_devices);
> + ret = get_device_info(fd, i, &di_args[ndevs]);
> + if (ret == -ENODEV)
> + continue;
> + if (ret)
> + return ret;
> + ndevs++;
> + }
> +
> + BUG_ON(ndevs == 0);
> +
> + return 0;
> +}
> diff --git a/utils.h b/utils.h
> index e281002..e33c231 100644
> --- a/utils.h
> +++ b/utils.h
> @@ -49,4 +49,8 @@ int get_mountpt(char *dev, char *mntpt, size_t size);
>
> int btrfs_scan_block_devices(int run_ioctl);
> int open_file_or_dir(const char *fname);
> +int get_device_info(int fd, u64 devid,
> + struct btrfs_ioctl_dev_info_args *di_args);
> +int get_fs_info(int fd, char *path, struct btrfs_ioctl_fs_info_args *fi_args,
> + struct btrfs_ioctl_dev_info_args **di_ret);
> #endif
--
=== Hugo Mills: hugo@... carfax.org.uk | darksatanic.net | lug.org.uk ===
PGP key: 515C238D from wwwkeys.eu.pgp.net or http://www.carfax.org.uk
--- Happiness is mandatory. Are you happy? ---
Attachment:
signature.asc
Description: Digital signature
