Commit 740c3d226cbba6cd6a32adfb66809c94938f3e57

Authored by Chris Mason
1 parent 806468f8bf

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

... ... @@ -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.
... ... @@ -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  
... ... @@ -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, \
... ... @@ -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;