stat.c (e994defb7b6813ba6fa7a2a36e86d2455ad1dc35) stat.c (a52dd971f947893bc7735396c74cfa591f0a7558)
1/*
2 * linux/fs/stat.c
3 *
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 */
6
7#include <linux/export.h>
8#include <linux/mm.h>

--- 43 unchanged lines hidden (view full) ---

52 generic_fillattr(inode, stat);
53 return 0;
54}
55
56EXPORT_SYMBOL(vfs_getattr);
57
58int vfs_fstat(unsigned int fd, struct kstat *stat)
59{
1/*
2 * linux/fs/stat.c
3 *
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 */
6
7#include <linux/export.h>
8#include <linux/mm.h>

--- 43 unchanged lines hidden (view full) ---

52 generic_fillattr(inode, stat);
53 return 0;
54}
55
56EXPORT_SYMBOL(vfs_getattr);
57
58int vfs_fstat(unsigned int fd, struct kstat *stat)
59{
60 int fput_needed;
61 struct file *f = fget_light(fd, &fput_needed);
60 struct file *f = fget(fd);
62 int error = -EBADF;
63
64 if (f) {
65 error = vfs_getattr(f->f_path.mnt, f->f_path.dentry, stat);
61 int error = -EBADF;
62
63 if (f) {
64 error = vfs_getattr(f->f_path.mnt, f->f_path.dentry, stat);
66 fput_light(f, fput_needed);
65 fput(f);
67 }
68 return error;
69}
70EXPORT_SYMBOL(vfs_fstat);
71
72int vfs_fstatat(int dfd, const char __user *filename, struct kstat *stat,
73 int flag)
74{

--- 111 unchanged lines hidden (view full) ---

186 if (!error)
187 error = cp_old_stat(&stat, statbuf);
188
189 return error;
190}
191
192#endif /* __ARCH_WANT_OLD_STAT */
193
66 }
67 return error;
68}
69EXPORT_SYMBOL(vfs_fstat);
70
71int vfs_fstatat(int dfd, const char __user *filename, struct kstat *stat,
72 int flag)
73{

--- 111 unchanged lines hidden (view full) ---

185 if (!error)
186 error = cp_old_stat(&stat, statbuf);
187
188 return error;
189}
190
191#endif /* __ARCH_WANT_OLD_STAT */
192
193#if BITS_PER_LONG == 32
194# define choose_32_64(a,b) a
195#else
196# define choose_32_64(a,b) b
197#endif
198
199#define valid_dev(x) choose_32_64(old_valid_dev,new_valid_dev)(x)
200#define encode_dev(x) choose_32_64(old_encode_dev,new_encode_dev)(x)
201
194static int cp_new_stat(struct kstat *stat, struct stat __user *statbuf)
195{
196 struct stat tmp;
197
202static int cp_new_stat(struct kstat *stat, struct stat __user *statbuf)
203{
204 struct stat tmp;
205
206 if (!valid_dev(stat->dev) || !valid_dev(stat->rdev))
207 return -EOVERFLOW;
198#if BITS_PER_LONG == 32
208#if BITS_PER_LONG == 32
199 if (!old_valid_dev(stat->dev) || !old_valid_dev(stat->rdev))
209 if (stat->size > MAX_NON_LFS)
200 return -EOVERFLOW;
210 return -EOVERFLOW;
201#else
202 if (!new_valid_dev(stat->dev) || !new_valid_dev(stat->rdev))
203 return -EOVERFLOW;
204#endif
205
206 memset(&tmp, 0, sizeof(tmp));
211#endif
212
213 memset(&tmp, 0, sizeof(tmp));
207#if BITS_PER_LONG == 32
208 tmp.st_dev = old_encode_dev(stat->dev);
209#else
210 tmp.st_dev = new_encode_dev(stat->dev);
211#endif
214 tmp.st_dev = encode_dev(stat->dev);
212 tmp.st_ino = stat->ino;
213 if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino)
214 return -EOVERFLOW;
215 tmp.st_mode = stat->mode;
216 tmp.st_nlink = stat->nlink;
217 if (tmp.st_nlink != stat->nlink)
218 return -EOVERFLOW;
219 SET_UID(tmp.st_uid, stat->uid);
220 SET_GID(tmp.st_gid, stat->gid);
215 tmp.st_ino = stat->ino;
216 if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino)
217 return -EOVERFLOW;
218 tmp.st_mode = stat->mode;
219 tmp.st_nlink = stat->nlink;
220 if (tmp.st_nlink != stat->nlink)
221 return -EOVERFLOW;
222 SET_UID(tmp.st_uid, stat->uid);
223 SET_GID(tmp.st_gid, stat->gid);
221#if BITS_PER_LONG == 32
222 tmp.st_rdev = old_encode_dev(stat->rdev);
223#else
224 tmp.st_rdev = new_encode_dev(stat->rdev);
225#endif
226#if BITS_PER_LONG == 32
227 if (stat->size > MAX_NON_LFS)
228 return -EOVERFLOW;
229#endif
224 tmp.st_rdev = encode_dev(stat->rdev);
230 tmp.st_size = stat->size;
231 tmp.st_atime = stat->atime.tv_sec;
232 tmp.st_mtime = stat->mtime.tv_sec;
233 tmp.st_ctime = stat->ctime.tv_sec;
234#ifdef STAT_HAVE_NSEC
235 tmp.st_atime_nsec = stat->atime.tv_nsec;
236 tmp.st_mtime_nsec = stat->mtime.tv_nsec;
237 tmp.st_ctime_nsec = stat->ctime.tv_nsec;

--- 235 unchanged lines hidden ---
225 tmp.st_size = stat->size;
226 tmp.st_atime = stat->atime.tv_sec;
227 tmp.st_mtime = stat->mtime.tv_sec;
228 tmp.st_ctime = stat->ctime.tv_sec;
229#ifdef STAT_HAVE_NSEC
230 tmp.st_atime_nsec = stat->atime.tv_nsec;
231 tmp.st_mtime_nsec = stat->mtime.tv_nsec;
232 tmp.st_ctime_nsec = stat->ctime.tv_nsec;

--- 235 unchanged lines hidden ---