dpages->ndpage++;
}
- /* d_count can be zero */
+ AuDebugOn(!dentry->d_count);
dpage->dentries[dpage->ndentry++] = dget_dlock(dentry);
return 0; /* success */
if (this_parent->d_sb == sb
&& !IS_ROOT(this_parent)
&& au_di(this_parent)
+ && this_parent->d_count
&& (!test || test(this_parent, arg))) {
err = au_dpages_append(dpages, this_parent, GFP_ATOMIC);
if (unlikely(err))
next = tmp->next;
spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED);
- if (!list_empty(&dentry->d_subdirs)) {
- spin_unlock(&this_parent->d_lock);
- spin_release(&dentry->d_lock.dep_map, 1, _RET_IP_);
- this_parent = dentry;
- spin_acquire(&this_parent->d_lock.dep_map, 0, 1,
- _RET_IP_);
- goto repeat;
+ if (dentry->d_count) {
+ if (!list_empty(&dentry->d_subdirs)) {
+ spin_unlock(&this_parent->d_lock);
+ spin_release(&dentry->d_lock.dep_map, 1,
+ _RET_IP_);
+ this_parent = dentry;
+ spin_acquire(&this_parent->d_lock.dep_map, 0, 1,
+ _RET_IP_);
+ goto repeat;
+ }
+ if (dentry->d_sb == sb
+ && au_di(dentry)
+ && (!test || test(dentry, arg)))
+ err = au_dpages_append(dpages, dentry,
+ GFP_ATOMIC);
}
- if (dentry->d_sb == sb
- && au_di(dentry)
- && (!test || test(dentry, arg)))
- err = au_dpages_append(dpages, dentry, GFP_ATOMIC);
spin_unlock(&dentry->d_lock);
if (unlikely(err))
goto out;
err = 0;
write_seqlock(&rename_lock);
- if (do_include && (!test || test(dentry, arg))) {
+ spin_lock(&dentry->d_lock);
+ if (do_include
+ && dentry->d_count
+ && (!test || test(dentry, arg)))
err = au_dpages_append(dpages, dentry, GFP_ATOMIC);
- if (unlikely(err))
- goto out;
- }
+ spin_unlock(&dentry->d_lock);
+ if (unlikely(err))
+ goto out;
/*
* vfsmount_lock is unnecessary since this is a traverse in a single
*/
while (!IS_ROOT(dentry)) {
dentry = dentry->d_parent; /* rename_lock is locked */
- if (!test || test(dentry, arg)) {
+ spin_lock(&dentry->d_lock);
+ if (dentry->d_count
+ && (!test || test(dentry, arg)))
err = au_dpages_append(dpages, dentry, GFP_ATOMIC);
- if (unlikely(err))
- break;
- }
+ spin_unlock(&dentry->d_lock);
+ if (unlikely(err))
+ break;
}
out:
int err;
err = 0;
- if (udba == AuOpt_UDBA_REVAL) {
+ if (udba == AuOpt_UDBA_REVAL
+ && !au_test_fs_remote(h_dentry->d_sb)) {
IMustLock(h_dir);
err = (h_dentry->d_parent->d_inode != h_dir);
- } else if (udba == AuOpt_UDBA_HNOTIFY)
+ } else if (udba != AuOpt_UDBA_NONE)
err = au_h_verify_dentry(h_dentry, h_parent, br);
return err;
if (unlikely(!au_di(dentry)))
goto out;
+ inode = dentry->d_inode;
+ if (inode && is_bad_inode(inode))
+ goto out;
+
valid = 1;
sb = dentry->d_sb;
- inode = dentry->d_inode;
/*
* todo: very ugly
* i_mutex of parent dir may be held,