Commit 740c3d226cbba6cd6a32adfb66809c94938f3e57
1 parent
806468f8bf
Exists in
master
and in
6 other branches
Btrfs: fix the new inspection ioctls for 32 bit compat
The new ioctls to follow backrefs are not clean for 32/64 bit compat. This reworks them for u64s everywhere. They are brand new, so there are no problems with changing the interface now. Signed-off-by: Chris Mason <chris.mason@oracle.com>
Showing 4 changed files with 15 additions and 16 deletions Side-by-side Diff
fs/btrfs/backref.c
... | ... | @@ -676,14 +676,14 @@ |
676 | 676 | bytes_left = ipath->fspath->bytes_left > s_ptr ? |
677 | 677 | ipath->fspath->bytes_left - s_ptr : 0; |
678 | 678 | |
679 | - fspath_min = (char *)ipath->fspath->str + (i + 1) * s_ptr; | |
679 | + fspath_min = (char *)ipath->fspath->val + (i + 1) * s_ptr; | |
680 | 680 | fspath = iref_to_path(ipath->fs_root, ipath->btrfs_path, iref, eb, |
681 | 681 | inum, fspath_min, bytes_left); |
682 | 682 | if (IS_ERR(fspath)) |
683 | 683 | return PTR_ERR(fspath); |
684 | 684 | |
685 | 685 | if (fspath > fspath_min) { |
686 | - ipath->fspath->str[i] = fspath; | |
686 | + ipath->fspath->val[i] = (u64)fspath; | |
687 | 687 | ++ipath->fspath->elem_cnt; |
688 | 688 | ipath->fspath->bytes_left = fspath - fspath_min; |
689 | 689 | } else { |
690 | 690 | |
... | ... | @@ -698,9 +698,9 @@ |
698 | 698 | /* |
699 | 699 | * this dumps all file system paths to the inode into the ipath struct, provided |
700 | 700 | * is has been created large enough. each path is zero-terminated and accessed |
701 | - * from ipath->fspath->str[i]. | |
701 | + * from ipath->fspath->val[i]. | |
702 | 702 | * when it returns, there are ipath->fspath->elem_cnt number of paths available |
703 | - * in ipath->fspath->str[]. when the allocated space wasn't sufficient, the | |
703 | + * in ipath->fspath->val[]. when the allocated space wasn't sufficient, the | |
704 | 704 | * number of missed paths in recored in ipath->fspath->elem_missed, otherwise, |
705 | 705 | * it's zero. ipath->fspath->bytes_missing holds the number of bytes that would |
706 | 706 | * have been needed to return all paths. |
fs/btrfs/ioctl.c
... | ... | @@ -2895,7 +2895,7 @@ |
2895 | 2895 | { |
2896 | 2896 | int ret = 0; |
2897 | 2897 | int i; |
2898 | - unsigned long rel_ptr; | |
2898 | + u64 rel_ptr; | |
2899 | 2899 | int size; |
2900 | 2900 | struct btrfs_ioctl_ino_path_args *ipa = NULL; |
2901 | 2901 | struct inode_fs_paths *ipath = NULL; |
2902 | 2902 | |
... | ... | @@ -2930,11 +2930,11 @@ |
2930 | 2930 | goto out; |
2931 | 2931 | |
2932 | 2932 | for (i = 0; i < ipath->fspath->elem_cnt; ++i) { |
2933 | - rel_ptr = ipath->fspath->str[i] - (char *)ipath->fspath->str; | |
2934 | - ipath->fspath->str[i] = (void *)rel_ptr; | |
2933 | + rel_ptr = ipath->fspath->val[i] - (u64)ipath->fspath->val; | |
2934 | + ipath->fspath->val[i] = rel_ptr; | |
2935 | 2935 | } |
2936 | 2936 | |
2937 | - ret = copy_to_user(ipa->fspath, ipath->fspath, size); | |
2937 | + ret = copy_to_user((void *)ipa->fspath, (void *)ipath->fspath, size); | |
2938 | 2938 | if (ret) { |
2939 | 2939 | ret = -EFAULT; |
2940 | 2940 | goto out; |
... | ... | @@ -3017,7 +3017,7 @@ |
3017 | 3017 | if (ret < 0) |
3018 | 3018 | goto out; |
3019 | 3019 | |
3020 | - ret = copy_to_user(loi->inodes, inodes, size); | |
3020 | + ret = copy_to_user((void *)loi->inodes, (void *)inodes, size); | |
3021 | 3021 | if (ret) |
3022 | 3022 | ret = -EFAULT; |
3023 | 3023 |
fs/btrfs/ioctl.h
... | ... | @@ -198,24 +198,23 @@ |
198 | 198 | __u32 bytes_missing; /* out -- additional bytes needed for result */ |
199 | 199 | __u32 elem_cnt; /* out */ |
200 | 200 | __u32 elem_missed; /* out */ |
201 | - union { | |
202 | - char *str[0]; /* out */ | |
203 | - __u64 val[0]; /* out */ | |
204 | - }; | |
201 | + __u64 val[0]; /* out */ | |
205 | 202 | }; |
206 | 203 | |
207 | 204 | struct btrfs_ioctl_ino_path_args { |
208 | 205 | __u64 inum; /* in */ |
209 | 206 | __u32 size; /* in */ |
210 | 207 | __u64 reserved[4]; |
211 | - struct btrfs_data_container *fspath; /* out */ | |
208 | + /* struct btrfs_data_container *fspath; out */ | |
209 | + __u64 fspath; /* out */ | |
212 | 210 | }; |
213 | 211 | |
214 | 212 | struct btrfs_ioctl_logical_ino_args { |
215 | 213 | __u64 logical; /* in */ |
216 | 214 | __u32 size; /* in */ |
217 | 215 | __u64 reserved[4]; |
218 | - struct btrfs_data_container *inodes; /* out */ | |
216 | + /* struct btrfs_data_container *inodes; out */ | |
217 | + __u64 inodes; | |
219 | 218 | }; |
220 | 219 | |
221 | 220 | #define BTRFS_IOC_SNAP_CREATE _IOW(BTRFS_IOCTL_MAGIC, 1, \ |
fs/btrfs/scrub.c
... | ... | @@ -272,7 +272,7 @@ |
272 | 272 | swarn->logical, swarn->dev->name, |
273 | 273 | (unsigned long long)swarn->sector, root, inum, offset, |
274 | 274 | min(isize - offset, (u64)PAGE_SIZE), nlink, |
275 | - ipath->fspath->str[i]); | |
275 | + (char *)ipath->fspath->val[i]); | |
276 | 276 | |
277 | 277 | free_ipath(ipath); |
278 | 278 | return 0; |