Blame view
fs/stat.c
12 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 |
/* * linux/fs/stat.c * * Copyright (C) 1991, 1992 Linus Torvalds */ |
630d9c472 fs: reduce the us... |
6 |
#include <linux/export.h> |
1da177e4c Linux-2.6.12-rc2 |
7 8 9 |
#include <linux/mm.h> #include <linux/errno.h> #include <linux/file.h> |
1da177e4c Linux-2.6.12-rc2 |
10 11 12 13 14 |
#include <linux/highuid.h> #include <linux/fs.h> #include <linux/namei.h> #include <linux/security.h> #include <linux/syscalls.h> |
ba52de123 [PATCH] inode-die... |
15 |
#include <linux/pagemap.h> |
1da177e4c Linux-2.6.12-rc2 |
16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <asm/uaccess.h> #include <asm/unistd.h> void generic_fillattr(struct inode *inode, struct kstat *stat) { stat->dev = inode->i_sb->s_dev; stat->ino = inode->i_ino; stat->mode = inode->i_mode; stat->nlink = inode->i_nlink; stat->uid = inode->i_uid; stat->gid = inode->i_gid; stat->rdev = inode->i_rdev; |
3ddcd0569 vfs: optimize ino... |
29 |
stat->size = i_size_read(inode); |
1da177e4c Linux-2.6.12-rc2 |
30 31 32 |
stat->atime = inode->i_atime; stat->mtime = inode->i_mtime; stat->ctime = inode->i_ctime; |
ba52de123 [PATCH] inode-die... |
33 |
stat->blksize = (1 << inode->i_blkbits); |
3ddcd0569 vfs: optimize ino... |
34 |
stat->blocks = inode->i_blocks; |
1da177e4c Linux-2.6.12-rc2 |
35 36 37 |
} EXPORT_SYMBOL(generic_fillattr); |
b7a6ec52d vfs: split out vf... |
38 39 40 41 42 43 44 45 46 47 48 49 50 |
/** * vfs_getattr_nosec - getattr without security checks * @path: file to get attributes from * @stat: structure to return attributes in * * Get attributes without calling security_inode_getattr. * * Currently the only caller other than vfs_getattr is internal to the * filehandle lookup code, which uses only the inode number and returns * no attributes to any user. Any other code probably wants * vfs_getattr. */ int vfs_getattr_nosec(struct path *path, struct kstat *stat) |
1da177e4c Linux-2.6.12-rc2 |
51 |
{ |
3dadecce2 switch vfs_getatt... |
52 |
struct inode *inode = path->dentry->d_inode; |
1da177e4c Linux-2.6.12-rc2 |
53 54 |
if (inode->i_op->getattr) |
3dadecce2 switch vfs_getatt... |
55 |
return inode->i_op->getattr(path->mnt, path->dentry, stat); |
1da177e4c Linux-2.6.12-rc2 |
56 57 |
generic_fillattr(inode, stat); |
1da177e4c Linux-2.6.12-rc2 |
58 59 |
return 0; } |
b7a6ec52d vfs: split out vf... |
60 61 62 63 64 65 66 67 68 69 70 |
EXPORT_SYMBOL(vfs_getattr_nosec); int vfs_getattr(struct path *path, struct kstat *stat) { int retval; retval = security_inode_getattr(path->mnt, path->dentry); if (retval) return retval; return vfs_getattr_nosec(path, stat); } |
1da177e4c Linux-2.6.12-rc2 |
71 |
EXPORT_SYMBOL(vfs_getattr); |
1da177e4c Linux-2.6.12-rc2 |
72 73 |
int vfs_fstat(unsigned int fd, struct kstat *stat) { |
2903ff019 switch simple cas... |
74 |
struct fd f = fdget_raw(fd); |
1da177e4c Linux-2.6.12-rc2 |
75 |
int error = -EBADF; |
2903ff019 switch simple cas... |
76 |
if (f.file) { |
3dadecce2 switch vfs_getatt... |
77 |
error = vfs_getattr(&f.file->f_path, stat); |
2903ff019 switch simple cas... |
78 |
fdput(f); |
1da177e4c Linux-2.6.12-rc2 |
79 80 81 |
} return error; } |
1da177e4c Linux-2.6.12-rc2 |
82 |
EXPORT_SYMBOL(vfs_fstat); |
c78873252 Mark arguments to... |
83 84 |
int vfs_fstatat(int dfd, const char __user *filename, struct kstat *stat, int flag) |
0112fc222 Separate out comm... |
85 |
{ |
2eae7a187 kill vfs_stat_fd ... |
86 |
struct path path; |
0112fc222 Separate out comm... |
87 |
int error = -EINVAL; |
836fb7e7b vfs: make fstatat... |
88 |
unsigned int lookup_flags = 0; |
0112fc222 Separate out comm... |
89 |
|
65cfc6722 readlinkat(), fch... |
90 91 |
if ((flag & ~(AT_SYMLINK_NOFOLLOW | AT_NO_AUTOMOUNT | AT_EMPTY_PATH)) != 0) |
0112fc222 Separate out comm... |
92 |
goto out; |
2eae7a187 kill vfs_stat_fd ... |
93 94 |
if (!(flag & AT_SYMLINK_NOFOLLOW)) lookup_flags |= LOOKUP_FOLLOW; |
65cfc6722 readlinkat(), fch... |
95 96 |
if (flag & AT_EMPTY_PATH) lookup_flags |= LOOKUP_EMPTY; |
836fb7e7b vfs: make fstatat... |
97 |
retry: |
2eae7a187 kill vfs_stat_fd ... |
98 99 100 |
error = user_path_at(dfd, filename, lookup_flags, &path); if (error) goto out; |
3dadecce2 switch vfs_getatt... |
101 |
error = vfs_getattr(&path, stat); |
2eae7a187 kill vfs_stat_fd ... |
102 |
path_put(&path); |
836fb7e7b vfs: make fstatat... |
103 104 105 106 |
if (retry_estale(error, lookup_flags)) { lookup_flags |= LOOKUP_REVAL; goto retry; } |
0112fc222 Separate out comm... |
107 108 109 |
out: return error; } |
0112fc222 Separate out comm... |
110 |
EXPORT_SYMBOL(vfs_fstatat); |
c78873252 Mark arguments to... |
111 |
int vfs_stat(const char __user *name, struct kstat *stat) |
2eae7a187 kill vfs_stat_fd ... |
112 113 114 115 |
{ return vfs_fstatat(AT_FDCWD, name, stat, 0); } EXPORT_SYMBOL(vfs_stat); |
c78873252 Mark arguments to... |
116 |
int vfs_lstat(const char __user *name, struct kstat *stat) |
2eae7a187 kill vfs_stat_fd ... |
117 118 119 120 |
{ return vfs_fstatat(AT_FDCWD, name, stat, AT_SYMLINK_NOFOLLOW); } EXPORT_SYMBOL(vfs_lstat); |
0112fc222 Separate out comm... |
121 |
|
1da177e4c Linux-2.6.12-rc2 |
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
#ifdef __ARCH_WANT_OLD_STAT /* * For backward compatibility? Maybe this should be moved * into arch/i386 instead? */ static int cp_old_stat(struct kstat *stat, struct __old_kernel_stat __user * statbuf) { static int warncount = 5; struct __old_kernel_stat tmp; if (warncount > 0) { warncount--; printk(KERN_WARNING "VFS: Warning: %s using old stat() call. Recompile your binary. ", current->comm); } else if (warncount < 0) { /* it's laughable, but... */ warncount = 0; } memset(&tmp, 0, sizeof(struct __old_kernel_stat)); tmp.st_dev = old_encode_dev(stat->dev); tmp.st_ino = stat->ino; |
afefdbb28 [PATCH] VFS: Make... |
146 147 |
if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino) return -EOVERFLOW; |
1da177e4c Linux-2.6.12-rc2 |
148 149 150 151 |
tmp.st_mode = stat->mode; tmp.st_nlink = stat->nlink; if (tmp.st_nlink != stat->nlink) return -EOVERFLOW; |
a7c1938e2 userns: Convert s... |
152 153 |
SET_UID(tmp.st_uid, from_kuid_munged(current_user_ns(), stat->uid)); SET_GID(tmp.st_gid, from_kgid_munged(current_user_ns(), stat->gid)); |
1da177e4c Linux-2.6.12-rc2 |
154 155 156 157 158 159 160 161 162 163 164 |
tmp.st_rdev = old_encode_dev(stat->rdev); #if BITS_PER_LONG == 32 if (stat->size > MAX_NON_LFS) return -EOVERFLOW; #endif tmp.st_size = stat->size; tmp.st_atime = stat->atime.tv_sec; tmp.st_mtime = stat->mtime.tv_sec; tmp.st_ctime = stat->ctime.tv_sec; return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0; } |
c78873252 Mark arguments to... |
165 166 |
SYSCALL_DEFINE2(stat, const char __user *, filename, struct __old_kernel_stat __user *, statbuf) |
1da177e4c Linux-2.6.12-rc2 |
167 168 |
{ struct kstat stat; |
2eae7a187 kill vfs_stat_fd ... |
169 |
int error; |
1da177e4c Linux-2.6.12-rc2 |
170 |
|
2eae7a187 kill vfs_stat_fd ... |
171 172 173 |
error = vfs_stat(filename, &stat); if (error) return error; |
1da177e4c Linux-2.6.12-rc2 |
174 |
|
2eae7a187 kill vfs_stat_fd ... |
175 |
return cp_old_stat(&stat, statbuf); |
1da177e4c Linux-2.6.12-rc2 |
176 |
} |
257ac264d [CVE-2009-0029] S... |
177 |
|
c78873252 Mark arguments to... |
178 179 |
SYSCALL_DEFINE2(lstat, const char __user *, filename, struct __old_kernel_stat __user *, statbuf) |
1da177e4c Linux-2.6.12-rc2 |
180 181 |
{ struct kstat stat; |
2eae7a187 kill vfs_stat_fd ... |
182 |
int error; |
1da177e4c Linux-2.6.12-rc2 |
183 |
|
2eae7a187 kill vfs_stat_fd ... |
184 185 186 |
error = vfs_lstat(filename, &stat); if (error) return error; |
1da177e4c Linux-2.6.12-rc2 |
187 |
|
2eae7a187 kill vfs_stat_fd ... |
188 |
return cp_old_stat(&stat, statbuf); |
1da177e4c Linux-2.6.12-rc2 |
189 |
} |
257ac264d [CVE-2009-0029] S... |
190 191 |
SYSCALL_DEFINE2(fstat, unsigned int, fd, struct __old_kernel_stat __user *, statbuf) |
1da177e4c Linux-2.6.12-rc2 |
192 193 194 195 196 197 198 199 200 201 202 |
{ struct kstat stat; int error = vfs_fstat(fd, &stat); if (!error) error = cp_old_stat(&stat, statbuf); return error; } #endif /* __ARCH_WANT_OLD_STAT */ |
a52dd971f vfs: de-crapify "... |
203 204 205 206 207 208 209 210 |
#if BITS_PER_LONG == 32 # define choose_32_64(a,b) a #else # define choose_32_64(a,b) b #endif #define valid_dev(x) choose_32_64(old_valid_dev,new_valid_dev)(x) #define encode_dev(x) choose_32_64(old_encode_dev,new_encode_dev)(x) |
8529f613b vfs: don't force ... |
211 212 213 |
#ifndef INIT_STRUCT_STAT_PADDING # define INIT_STRUCT_STAT_PADDING(st) memset(&st, 0, sizeof(st)) #endif |
1da177e4c Linux-2.6.12-rc2 |
214 215 216 |
static int cp_new_stat(struct kstat *stat, struct stat __user *statbuf) { struct stat tmp; |
a52dd971f vfs: de-crapify "... |
217 |
if (!valid_dev(stat->dev) || !valid_dev(stat->rdev)) |
1da177e4c Linux-2.6.12-rc2 |
218 |
return -EOVERFLOW; |
a52dd971f vfs: de-crapify "... |
219 220 |
#if BITS_PER_LONG == 32 if (stat->size > MAX_NON_LFS) |
1da177e4c Linux-2.6.12-rc2 |
221 222 |
return -EOVERFLOW; #endif |
8529f613b vfs: don't force ... |
223 |
INIT_STRUCT_STAT_PADDING(tmp); |
a52dd971f vfs: de-crapify "... |
224 |
tmp.st_dev = encode_dev(stat->dev); |
1da177e4c Linux-2.6.12-rc2 |
225 |
tmp.st_ino = stat->ino; |
afefdbb28 [PATCH] VFS: Make... |
226 227 |
if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino) return -EOVERFLOW; |
1da177e4c Linux-2.6.12-rc2 |
228 229 230 231 |
tmp.st_mode = stat->mode; tmp.st_nlink = stat->nlink; if (tmp.st_nlink != stat->nlink) return -EOVERFLOW; |
a7c1938e2 userns: Convert s... |
232 233 |
SET_UID(tmp.st_uid, from_kuid_munged(current_user_ns(), stat->uid)); SET_GID(tmp.st_gid, from_kgid_munged(current_user_ns(), stat->gid)); |
a52dd971f vfs: de-crapify "... |
234 |
tmp.st_rdev = encode_dev(stat->rdev); |
1da177e4c Linux-2.6.12-rc2 |
235 236 237 238 239 240 241 242 243 244 245 246 247 |
tmp.st_size = stat->size; tmp.st_atime = stat->atime.tv_sec; tmp.st_mtime = stat->mtime.tv_sec; tmp.st_ctime = stat->ctime.tv_sec; #ifdef STAT_HAVE_NSEC tmp.st_atime_nsec = stat->atime.tv_nsec; tmp.st_mtime_nsec = stat->mtime.tv_nsec; tmp.st_ctime_nsec = stat->ctime.tv_nsec; #endif tmp.st_blocks = stat->blocks; tmp.st_blksize = stat->blksize; return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0; } |
c78873252 Mark arguments to... |
248 249 |
SYSCALL_DEFINE2(newstat, const char __user *, filename, struct stat __user *, statbuf) |
5590ff0d5 [PATCH] vfs: *at ... |
250 251 |
{ struct kstat stat; |
2eae7a187 kill vfs_stat_fd ... |
252 |
int error = vfs_stat(filename, &stat); |
5590ff0d5 [PATCH] vfs: *at ... |
253 |
|
2eae7a187 kill vfs_stat_fd ... |
254 255 256 |
if (error) return error; return cp_new_stat(&stat, statbuf); |
5590ff0d5 [PATCH] vfs: *at ... |
257 |
} |
c78873252 Mark arguments to... |
258 259 |
SYSCALL_DEFINE2(newlstat, const char __user *, filename, struct stat __user *, statbuf) |
1da177e4c Linux-2.6.12-rc2 |
260 261 |
{ struct kstat stat; |
2eae7a187 kill vfs_stat_fd ... |
262 |
int error; |
1da177e4c Linux-2.6.12-rc2 |
263 |
|
2eae7a187 kill vfs_stat_fd ... |
264 265 266 |
error = vfs_lstat(filename, &stat); if (error) return error; |
1da177e4c Linux-2.6.12-rc2 |
267 |
|
2eae7a187 kill vfs_stat_fd ... |
268 |
return cp_new_stat(&stat, statbuf); |
1da177e4c Linux-2.6.12-rc2 |
269 |
} |
5590ff0d5 [PATCH] vfs: *at ... |
270 |
|
2833c28aa [PATCH] powerpc: ... |
271 |
#if !defined(__ARCH_WANT_STAT64) || defined(__ARCH_WANT_SYS_NEWFSTATAT) |
c78873252 Mark arguments to... |
272 |
SYSCALL_DEFINE4(newfstatat, int, dfd, const char __user *, filename, |
6559eed8c [CVE-2009-0029] S... |
273 |
struct stat __user *, statbuf, int, flag) |
1da177e4c Linux-2.6.12-rc2 |
274 275 |
{ struct kstat stat; |
0112fc222 Separate out comm... |
276 |
int error; |
1da177e4c Linux-2.6.12-rc2 |
277 |
|
0112fc222 Separate out comm... |
278 279 280 281 |
error = vfs_fstatat(dfd, filename, &stat, flag); if (error) return error; return cp_new_stat(&stat, statbuf); |
1da177e4c Linux-2.6.12-rc2 |
282 |
} |
cff2b7600 [PATCH] fstatat64... |
283 |
#endif |
5590ff0d5 [PATCH] vfs: *at ... |
284 |
|
257ac264d [CVE-2009-0029] S... |
285 |
SYSCALL_DEFINE2(newfstat, unsigned int, fd, struct stat __user *, statbuf) |
1da177e4c Linux-2.6.12-rc2 |
286 287 288 289 290 291 292 293 294 |
{ struct kstat stat; int error = vfs_fstat(fd, &stat); if (!error) error = cp_new_stat(&stat, statbuf); return error; } |
6559eed8c [CVE-2009-0029] S... |
295 296 |
SYSCALL_DEFINE4(readlinkat, int, dfd, const char __user *, pathname, char __user *, buf, int, bufsiz) |
1da177e4c Linux-2.6.12-rc2 |
297 |
{ |
2d8f30380 [PATCH] sanitize ... |
298 |
struct path path; |
1da177e4c Linux-2.6.12-rc2 |
299 |
int error; |
1fa1e7f61 readlinkat: ensur... |
300 |
int empty = 0; |
7955119e0 vfs: fix readlink... |
301 |
unsigned int lookup_flags = LOOKUP_EMPTY; |
1da177e4c Linux-2.6.12-rc2 |
302 303 304 |
if (bufsiz <= 0) return -EINVAL; |
7955119e0 vfs: fix readlink... |
305 306 |
retry: error = user_path_at_empty(dfd, pathname, lookup_flags, &path, &empty); |
1da177e4c Linux-2.6.12-rc2 |
307 |
if (!error) { |
2d8f30380 [PATCH] sanitize ... |
308 |
struct inode *inode = path.dentry->d_inode; |
1da177e4c Linux-2.6.12-rc2 |
309 |
|
1fa1e7f61 readlinkat: ensur... |
310 |
error = empty ? -ENOENT : -EINVAL; |
acfa4380e inode->i_op is ne... |
311 |
if (inode->i_op->readlink) { |
2d8f30380 [PATCH] sanitize ... |
312 |
error = security_inode_readlink(path.dentry); |
1da177e4c Linux-2.6.12-rc2 |
313 |
if (!error) { |
68ac1234f switch touch_atim... |
314 |
touch_atime(&path); |
2d8f30380 [PATCH] sanitize ... |
315 |
error = inode->i_op->readlink(path.dentry, |
4ac913785 Embed a struct pa... |
316 |
buf, bufsiz); |
1da177e4c Linux-2.6.12-rc2 |
317 318 |
} } |
2d8f30380 [PATCH] sanitize ... |
319 |
path_put(&path); |
7955119e0 vfs: fix readlink... |
320 321 322 323 |
if (retry_estale(error, lookup_flags)) { lookup_flags |= LOOKUP_REVAL; goto retry; } |
1da177e4c Linux-2.6.12-rc2 |
324 325 326 |
} return error; } |
002c8976e [CVE-2009-0029] S... |
327 328 |
SYSCALL_DEFINE3(readlink, const char __user *, path, char __user *, buf, int, bufsiz) |
5590ff0d5 [PATCH] vfs: *at ... |
329 330 331 |
{ return sys_readlinkat(AT_FDCWD, path, buf, bufsiz); } |
1da177e4c Linux-2.6.12-rc2 |
332 333 |
/* ---------- LFS-64 ----------- */ |
0753f70f0 fs: Build sys_sta... |
334 |
#if defined(__ARCH_WANT_STAT64) || defined(__ARCH_WANT_COMPAT_STAT64) |
1da177e4c Linux-2.6.12-rc2 |
335 |
|
8529f613b vfs: don't force ... |
336 337 338 |
#ifndef INIT_STRUCT_STAT64_PADDING # define INIT_STRUCT_STAT64_PADDING(st) memset(&st, 0, sizeof(st)) #endif |
1da177e4c Linux-2.6.12-rc2 |
339 340 341 |
static long cp_new_stat64(struct kstat *stat, struct stat64 __user *statbuf) { struct stat64 tmp; |
8529f613b vfs: don't force ... |
342 |
INIT_STRUCT_STAT64_PADDING(tmp); |
1da177e4c Linux-2.6.12-rc2 |
343 344 345 346 347 348 349 350 351 352 353 |
#ifdef CONFIG_MIPS /* mips has weird padding, so we don't get 64 bits there */ if (!new_valid_dev(stat->dev) || !new_valid_dev(stat->rdev)) return -EOVERFLOW; tmp.st_dev = new_encode_dev(stat->dev); tmp.st_rdev = new_encode_dev(stat->rdev); #else tmp.st_dev = huge_encode_dev(stat->dev); tmp.st_rdev = huge_encode_dev(stat->rdev); #endif tmp.st_ino = stat->ino; |
afefdbb28 [PATCH] VFS: Make... |
354 355 |
if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino) return -EOVERFLOW; |
1da177e4c Linux-2.6.12-rc2 |
356 357 358 359 360 |
#ifdef STAT64_HAS_BROKEN_ST_INO tmp.__st_ino = stat->ino; #endif tmp.st_mode = stat->mode; tmp.st_nlink = stat->nlink; |
a7c1938e2 userns: Convert s... |
361 362 |
tmp.st_uid = from_kuid_munged(current_user_ns(), stat->uid); tmp.st_gid = from_kgid_munged(current_user_ns(), stat->gid); |
1da177e4c Linux-2.6.12-rc2 |
363 364 365 366 367 368 369 370 371 372 373 |
tmp.st_atime = stat->atime.tv_sec; tmp.st_atime_nsec = stat->atime.tv_nsec; tmp.st_mtime = stat->mtime.tv_sec; tmp.st_mtime_nsec = stat->mtime.tv_nsec; tmp.st_ctime = stat->ctime.tv_sec; tmp.st_ctime_nsec = stat->ctime.tv_nsec; tmp.st_size = stat->size; tmp.st_blocks = stat->blocks; tmp.st_blksize = stat->blksize; return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0; } |
c78873252 Mark arguments to... |
374 375 |
SYSCALL_DEFINE2(stat64, const char __user *, filename, struct stat64 __user *, statbuf) |
1da177e4c Linux-2.6.12-rc2 |
376 377 378 379 380 381 382 383 384 |
{ struct kstat stat; int error = vfs_stat(filename, &stat); if (!error) error = cp_new_stat64(&stat, statbuf); return error; } |
257ac264d [CVE-2009-0029] S... |
385 |
|
c78873252 Mark arguments to... |
386 387 |
SYSCALL_DEFINE2(lstat64, const char __user *, filename, struct stat64 __user *, statbuf) |
1da177e4c Linux-2.6.12-rc2 |
388 389 390 391 392 393 394 395 396 |
{ struct kstat stat; int error = vfs_lstat(filename, &stat); if (!error) error = cp_new_stat64(&stat, statbuf); return error; } |
257ac264d [CVE-2009-0029] S... |
397 398 |
SYSCALL_DEFINE2(fstat64, unsigned long, fd, struct stat64 __user *, statbuf) |
1da177e4c Linux-2.6.12-rc2 |
399 400 401 402 403 404 405 406 407 |
{ struct kstat stat; int error = vfs_fstat(fd, &stat); if (!error) error = cp_new_stat64(&stat, statbuf); return error; } |
c78873252 Mark arguments to... |
408 |
SYSCALL_DEFINE4(fstatat64, int, dfd, const char __user *, filename, |
6559eed8c [CVE-2009-0029] S... |
409 |
struct stat64 __user *, statbuf, int, flag) |
cff2b7600 [PATCH] fstatat64... |
410 411 |
{ struct kstat stat; |
0112fc222 Separate out comm... |
412 |
int error; |
cff2b7600 [PATCH] fstatat64... |
413 |
|
0112fc222 Separate out comm... |
414 415 416 417 |
error = vfs_fstatat(dfd, filename, &stat, flag); if (error) return error; return cp_new_stat64(&stat, statbuf); |
cff2b7600 [PATCH] fstatat64... |
418 |
} |
0753f70f0 fs: Build sys_sta... |
419 |
#endif /* __ARCH_WANT_STAT64 || __ARCH_WANT_COMPAT_STAT64 */ |
1da177e4c Linux-2.6.12-rc2 |
420 |
|
b462707e7 Add unlocked vers... |
421 422 |
/* Caller is here responsible for sufficient locking (ie. inode->i_lock) */ void __inode_add_bytes(struct inode *inode, loff_t bytes) |
1da177e4c Linux-2.6.12-rc2 |
423 |
{ |
1da177e4c Linux-2.6.12-rc2 |
424 425 426 427 428 429 430 |
inode->i_blocks += bytes >> 9; bytes &= 511; inode->i_bytes += bytes; if (inode->i_bytes >= 512) { inode->i_blocks++; inode->i_bytes -= 512; } |
b462707e7 Add unlocked vers... |
431 432 433 434 435 436 |
} void inode_add_bytes(struct inode *inode, loff_t bytes) { spin_lock(&inode->i_lock); __inode_add_bytes(inode, bytes); |
1da177e4c Linux-2.6.12-rc2 |
437 438 439 440 |
spin_unlock(&inode->i_lock); } EXPORT_SYMBOL(inode_add_bytes); |
1c8924eb1 quota: provide in... |
441 |
void __inode_sub_bytes(struct inode *inode, loff_t bytes) |
1da177e4c Linux-2.6.12-rc2 |
442 |
{ |
1da177e4c Linux-2.6.12-rc2 |
443 444 445 446 447 448 449 |
inode->i_blocks -= bytes >> 9; bytes &= 511; if (inode->i_bytes < bytes) { inode->i_blocks--; inode->i_bytes += 512; } inode->i_bytes -= bytes; |
1c8924eb1 quota: provide in... |
450 451 452 453 454 455 456 457 |
} EXPORT_SYMBOL(__inode_sub_bytes); void inode_sub_bytes(struct inode *inode, loff_t bytes) { spin_lock(&inode->i_lock); __inode_sub_bytes(inode, bytes); |
1da177e4c Linux-2.6.12-rc2 |
458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 |
spin_unlock(&inode->i_lock); } EXPORT_SYMBOL(inode_sub_bytes); loff_t inode_get_bytes(struct inode *inode) { loff_t ret; spin_lock(&inode->i_lock); ret = (((loff_t)inode->i_blocks) << 9) + inode->i_bytes; spin_unlock(&inode->i_lock); return ret; } EXPORT_SYMBOL(inode_get_bytes); void inode_set_bytes(struct inode *inode, loff_t bytes) { /* Caller is here responsible for sufficient locking * (ie. inode->i_lock) */ inode->i_blocks = bytes >> 9; inode->i_bytes = bytes & 511; } EXPORT_SYMBOL(inode_set_bytes); |