diff options
Diffstat (limited to 'fs/namei.c')
-rw-r--r-- | fs/namei.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/fs/namei.c b/fs/namei.c index 89a612e392eb..7720fbd5277b 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -536,8 +536,8 @@ static int unlazy_walk(struct nameidata *nd, struct dentry *dentry) | |||
536 | * a reference at this point. | 536 | * a reference at this point. |
537 | */ | 537 | */ |
538 | BUG_ON(!IS_ROOT(dentry) && dentry->d_parent != parent); | 538 | BUG_ON(!IS_ROOT(dentry) && dentry->d_parent != parent); |
539 | BUG_ON(!parent->d_count); | 539 | BUG_ON(!parent->d_lockref.count); |
540 | parent->d_count++; | 540 | parent->d_lockref.count++; |
541 | spin_unlock(&dentry->d_lock); | 541 | spin_unlock(&dentry->d_lock); |
542 | } | 542 | } |
543 | spin_unlock(&parent->d_lock); | 543 | spin_unlock(&parent->d_lock); |
@@ -3327,7 +3327,7 @@ void dentry_unhash(struct dentry *dentry) | |||
3327 | { | 3327 | { |
3328 | shrink_dcache_parent(dentry); | 3328 | shrink_dcache_parent(dentry); |
3329 | spin_lock(&dentry->d_lock); | 3329 | spin_lock(&dentry->d_lock); |
3330 | if (dentry->d_count == 1) | 3330 | if (dentry->d_lockref.count == 1) |
3331 | __d_drop(dentry); | 3331 | __d_drop(dentry); |
3332 | spin_unlock(&dentry->d_lock); | 3332 | spin_unlock(&dentry->d_lock); |
3333 | } | 3333 | } |
@@ -3671,11 +3671,15 @@ SYSCALL_DEFINE5(linkat, int, olddfd, const char __user *, oldname, | |||
3671 | if ((flags & ~(AT_SYMLINK_FOLLOW | AT_EMPTY_PATH)) != 0) | 3671 | if ((flags & ~(AT_SYMLINK_FOLLOW | AT_EMPTY_PATH)) != 0) |
3672 | return -EINVAL; | 3672 | return -EINVAL; |
3673 | /* | 3673 | /* |
3674 | * Using empty names is equivalent to using AT_SYMLINK_FOLLOW | 3674 | * To use null names we require CAP_DAC_READ_SEARCH |
3675 | * on /proc/self/fd/<fd>. | 3675 | * This ensures that not everyone will be able to create |
3676 | * handlink using the passed filedescriptor. | ||
3676 | */ | 3677 | */ |
3677 | if (flags & AT_EMPTY_PATH) | 3678 | if (flags & AT_EMPTY_PATH) { |
3679 | if (!capable(CAP_DAC_READ_SEARCH)) | ||
3680 | return -ENOENT; | ||
3678 | how = LOOKUP_EMPTY; | 3681 | how = LOOKUP_EMPTY; |
3682 | } | ||
3679 | 3683 | ||
3680 | if (flags & AT_SYMLINK_FOLLOW) | 3684 | if (flags & AT_SYMLINK_FOLLOW) |
3681 | how |= LOOKUP_FOLLOW; | 3685 | how |= LOOKUP_FOLLOW; |