diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-16 23:27:56 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-16 23:27:56 -0400 |
commit | 4fc8adcfec3da639da76e8314c9ccefe5bf9a045 (patch) | |
tree | e07a2dea8acf04d8bbbecd4fd3a571653ecdd953 /include/linux/dcache.h | |
parent | 84588e7a5d8220446d677d7b909a20ee7a4496b9 (diff) | |
parent | aa4d86163e4e91a1ac560954a554bab417e338f4 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull third hunk of vfs changes from Al Viro:
"This contains the ->direct_IO() changes from Omar + saner
generic_write_checks() + dealing with fcntl()/{read,write}() races
(mirroring O_APPEND/O_DIRECT into iocb->ki_flags and instead of
repeatedly looking at ->f_flags, which can be changed by fcntl(2),
check ->ki_flags - which cannot) + infrastructure bits for dhowells'
d_inode annotations + Christophs switch of /dev/loop to
vfs_iter_write()"
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (30 commits)
block: loop: switch to VFS ITER_BVEC
configfs: Fix inconsistent use of file_inode() vs file->f_path.dentry->d_inode
VFS: Make pathwalk use d_is_reg() rather than S_ISREG()
VFS: Fix up debugfs to use d_is_dir() in place of S_ISDIR()
VFS: Combine inode checks with d_is_negative() and d_is_positive() in pathwalk
NFS: Don't use d_inode as a variable name
VFS: Impose ordering on accesses of d_inode and d_flags
VFS: Add owner-filesystem positive/negative dentry checks
nfs: generic_write_checks() shouldn't be done on swapout...
ocfs2: use __generic_file_write_iter()
mirror O_APPEND and O_DIRECT into iocb->ki_flags
switch generic_write_checks() to iocb and iter
ocfs2: move generic_write_checks() before the alignment checks
ocfs2_file_write_iter: stop messing with ppos
udf_file_write_iter: reorder and simplify
fuse: ->direct_IO() doesn't need generic_write_checks()
ext4_file_write_iter: move generic_write_checks() up
xfs_file_aio_write_checks: switch to iocb/iov_iter
generic_write_checks(): drop isblk argument
blkdev_write_iter: expand generic_file_checks() call in there
...
Diffstat (limited to 'include/linux/dcache.h')
-rw-r--r-- | include/linux/dcache.h | 59 |
1 files changed, 41 insertions, 18 deletions
diff --git a/include/linux/dcache.h b/include/linux/dcache.h index d8358799c594..df334cbacc6d 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h | |||
@@ -404,26 +404,11 @@ static inline bool d_mountpoint(const struct dentry *dentry) | |||
404 | /* | 404 | /* |
405 | * Directory cache entry type accessor functions. | 405 | * Directory cache entry type accessor functions. |
406 | */ | 406 | */ |
407 | static inline void __d_set_type(struct dentry *dentry, unsigned type) | ||
408 | { | ||
409 | dentry->d_flags = (dentry->d_flags & ~DCACHE_ENTRY_TYPE) | type; | ||
410 | } | ||
411 | |||
412 | static inline void __d_clear_type(struct dentry *dentry) | ||
413 | { | ||
414 | __d_set_type(dentry, DCACHE_MISS_TYPE); | ||
415 | } | ||
416 | |||
417 | static inline void d_set_type(struct dentry *dentry, unsigned type) | ||
418 | { | ||
419 | spin_lock(&dentry->d_lock); | ||
420 | __d_set_type(dentry, type); | ||
421 | spin_unlock(&dentry->d_lock); | ||
422 | } | ||
423 | |||
424 | static inline unsigned __d_entry_type(const struct dentry *dentry) | 407 | static inline unsigned __d_entry_type(const struct dentry *dentry) |
425 | { | 408 | { |
426 | return dentry->d_flags & DCACHE_ENTRY_TYPE; | 409 | unsigned type = READ_ONCE(dentry->d_flags); |
410 | smp_rmb(); | ||
411 | return type & DCACHE_ENTRY_TYPE; | ||
427 | } | 412 | } |
428 | 413 | ||
429 | static inline bool d_is_miss(const struct dentry *dentry) | 414 | static inline bool d_is_miss(const struct dentry *dentry) |
@@ -482,6 +467,44 @@ static inline bool d_is_positive(const struct dentry *dentry) | |||
482 | return !d_is_negative(dentry); | 467 | return !d_is_negative(dentry); |
483 | } | 468 | } |
484 | 469 | ||
470 | /** | ||
471 | * d_really_is_negative - Determine if a dentry is really negative (ignoring fallthroughs) | ||
472 | * @dentry: The dentry in question | ||
473 | * | ||
474 | * Returns true if the dentry represents either an absent name or a name that | ||
475 | * doesn't map to an inode (ie. ->d_inode is NULL). The dentry could represent | ||
476 | * a true miss, a whiteout that isn't represented by a 0,0 chardev or a | ||
477 | * fallthrough marker in an opaque directory. | ||
478 | * | ||
479 | * Note! (1) This should be used *only* by a filesystem to examine its own | ||
480 | * dentries. It should not be used to look at some other filesystem's | ||
481 | * dentries. (2) It should also be used in combination with d_inode() to get | ||
482 | * the inode. (3) The dentry may have something attached to ->d_lower and the | ||
483 | * type field of the flags may be set to something other than miss or whiteout. | ||
484 | */ | ||
485 | static inline bool d_really_is_negative(const struct dentry *dentry) | ||
486 | { | ||
487 | return dentry->d_inode == NULL; | ||
488 | } | ||
489 | |||
490 | /** | ||
491 | * d_really_is_positive - Determine if a dentry is really positive (ignoring fallthroughs) | ||
492 | * @dentry: The dentry in question | ||
493 | * | ||
494 | * Returns true if the dentry represents a name that maps to an inode | ||
495 | * (ie. ->d_inode is not NULL). The dentry might still represent a whiteout if | ||
496 | * that is represented on medium as a 0,0 chardev. | ||
497 | * | ||
498 | * Note! (1) This should be used *only* by a filesystem to examine its own | ||
499 | * dentries. It should not be used to look at some other filesystem's | ||
500 | * dentries. (2) It should also be used in combination with d_inode() to get | ||
501 | * the inode. | ||
502 | */ | ||
503 | static inline bool d_really_is_positive(const struct dentry *dentry) | ||
504 | { | ||
505 | return dentry->d_inode != NULL; | ||
506 | } | ||
507 | |||
485 | extern void d_set_fallthru(struct dentry *dentry); | 508 | extern void d_set_fallthru(struct dentry *dentry); |
486 | 509 | ||
487 | static inline bool d_is_fallthru(const struct dentry *dentry) | 510 | static inline bool d_is_fallthru(const struct dentry *dentry) |