diff options
Diffstat (limited to 'arch/parisc/hpux/sys_hpux.c')
| -rw-r--r-- | arch/parisc/hpux/sys_hpux.c | 65 |
1 files changed, 22 insertions, 43 deletions
diff --git a/arch/parisc/hpux/sys_hpux.c b/arch/parisc/hpux/sys_hpux.c index 30394081d9b..6ab9580b0b0 100644 --- a/arch/parisc/hpux/sys_hpux.c +++ b/arch/parisc/hpux/sys_hpux.c | |||
| @@ -185,26 +185,21 @@ struct hpux_statfs { | |||
| 185 | int16_t f_pad; | 185 | int16_t f_pad; |
| 186 | }; | 186 | }; |
| 187 | 187 | ||
| 188 | static int do_statfs_hpux(struct path *path, struct hpux_statfs *buf) | 188 | static int do_statfs_hpux(struct kstatfs *st, struct hpux_statfs __user *p) |
| 189 | { | 189 | { |
| 190 | struct kstatfs st; | 190 | struct hpux_statfs buf; |
| 191 | int retval; | 191 | memset(&buf, 0, sizeof(buf)); |
| 192 | 192 | buf.f_type = st->f_type; | |
| 193 | retval = vfs_statfs(path, &st); | 193 | buf.f_bsize = st->f_bsize; |
| 194 | if (retval) | 194 | buf.f_blocks = st->f_blocks; |
| 195 | return retval; | 195 | buf.f_bfree = st->f_bfree; |
| 196 | 196 | buf.f_bavail = st->f_bavail; | |
| 197 | memset(buf, 0, sizeof(*buf)); | 197 | buf.f_files = st->f_files; |
| 198 | buf->f_type = st.f_type; | 198 | buf.f_ffree = st->f_ffree; |
| 199 | buf->f_bsize = st.f_bsize; | 199 | buf.f_fsid[0] = st->f_fsid.val[0]; |
| 200 | buf->f_blocks = st.f_blocks; | 200 | buf.f_fsid[1] = st->f_fsid.val[1]; |
| 201 | buf->f_bfree = st.f_bfree; | 201 | if (copy_to_user(p, &buf, sizeof(buf))) |
| 202 | buf->f_bavail = st.f_bavail; | 202 | return -EFAULT; |
| 203 | buf->f_files = st.f_files; | ||
| 204 | buf->f_ffree = st.f_ffree; | ||
| 205 | buf->f_fsid[0] = st.f_fsid.val[0]; | ||
| 206 | buf->f_fsid[1] = st.f_fsid.val[1]; | ||
| 207 | |||
| 208 | return 0; | 203 | return 0; |
| 209 | } | 204 | } |
| 210 | 205 | ||
| @@ -212,35 +207,19 @@ static int do_statfs_hpux(struct path *path, struct hpux_statfs *buf) | |||
| 212 | asmlinkage long hpux_statfs(const char __user *pathname, | 207 | asmlinkage long hpux_statfs(const char __user *pathname, |
| 213 | struct hpux_statfs __user *buf) | 208 | struct hpux_statfs __user *buf) |
| 214 | { | 209 | { |
| 215 | struct path path; | 210 | struct kstatfs st; |
| 216 | int error; | 211 | int error = user_statfs(pathname, &st); |
| 217 | 212 | if (!error) | |
| 218 | error = user_path(pathname, &path); | 213 | error = do_statfs_hpux(&st, buf); |
| 219 | if (!error) { | ||
| 220 | struct hpux_statfs tmp; | ||
| 221 | error = do_statfs_hpux(&path, &tmp); | ||
| 222 | if (!error && copy_to_user(buf, &tmp, sizeof(tmp))) | ||
| 223 | error = -EFAULT; | ||
| 224 | path_put(&path); | ||
| 225 | } | ||
| 226 | return error; | 214 | return error; |
| 227 | } | 215 | } |
| 228 | 216 | ||
| 229 | asmlinkage long hpux_fstatfs(unsigned int fd, struct hpux_statfs __user * buf) | 217 | asmlinkage long hpux_fstatfs(unsigned int fd, struct hpux_statfs __user * buf) |
| 230 | { | 218 | { |
| 231 | struct file *file; | 219 | struct kstatfs st; |
| 232 | struct hpux_statfs tmp; | 220 | int error = fd_statfs(fd, &st); |
| 233 | int error; | 221 | if (!error) |
| 234 | 222 | error = do_statfs_hpux(&st, buf); | |
| 235 | error = -EBADF; | ||
| 236 | file = fget(fd); | ||
| 237 | if (!file) | ||
| 238 | goto out; | ||
| 239 | error = do_statfs_hpux(&file->f_path, &tmp); | ||
| 240 | if (!error && copy_to_user(buf, &tmp, sizeof(tmp))) | ||
| 241 | error = -EFAULT; | ||
| 242 | fput(file); | ||
| 243 | out: | ||
| 244 | return error; | 223 | return error; |
| 245 | } | 224 | } |
| 246 | 225 | ||
