Lines Matching refs:dentry
26 static int autofs4_dir_symlink(struct inode *,struct dentry *,const char *);
27 static int autofs4_dir_unlink(struct inode *,struct dentry *);
28 static int autofs4_dir_rmdir(struct inode *,struct dentry *);
29 static int autofs4_dir_mkdir(struct inode *,struct dentry *,umode_t);
35 static struct dentry *autofs4_lookup(struct inode *,struct dentry *, unsigned int);
37 static int autofs4_d_manage(struct dentry *, bool);
38 static void autofs4_dentry_release(struct dentry *);
74 static void autofs4_add_active(struct dentry *dentry) in autofs4_add_active() argument
76 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); in autofs4_add_active()
77 struct autofs_info *ino = autofs4_dentry_ino(dentry); in autofs4_add_active()
90 static void autofs4_del_active(struct dentry *dentry) in autofs4_del_active() argument
92 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); in autofs4_del_active()
93 struct autofs_info *ino = autofs4_dentry_ino(dentry); in autofs4_del_active()
108 struct dentry *dentry = file->f_path.dentry; in autofs4_dir_open() local
109 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); in autofs4_dir_open()
111 DPRINTK("file=%p dentry=%p %pd", file, dentry, dentry); in autofs4_dir_open()
126 if (!d_mountpoint(dentry) && simple_empty(dentry)) { in autofs4_dir_open()
136 static void autofs4_dentry_release(struct dentry *de) in autofs4_dentry_release()
158 static struct dentry *autofs4_lookup_active(struct dentry *dentry) in autofs4_lookup_active() argument
160 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); in autofs4_lookup_active()
161 struct dentry *parent = dentry->d_parent; in autofs4_lookup_active()
162 struct qstr *name = &dentry->d_name; in autofs4_lookup_active()
174 struct dentry *active; in autofs4_lookup_active()
178 active = ino->dentry; in autofs4_lookup_active()
212 static struct dentry *autofs4_lookup_expiring(struct dentry *dentry, in autofs4_lookup_expiring() argument
215 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); in autofs4_lookup_expiring()
216 struct dentry *parent = dentry->d_parent; in autofs4_lookup_expiring()
217 struct qstr *name = &dentry->d_name; in autofs4_lookup_expiring()
229 struct dentry *expiring; in autofs4_lookup_expiring()
238 expiring = ino->dentry; in autofs4_lookup_expiring()
272 static int autofs4_mount_wait(struct dentry *dentry, bool rcu_walk) in autofs4_mount_wait() argument
274 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); in autofs4_mount_wait()
275 struct autofs_info *ino = autofs4_dentry_ino(dentry); in autofs4_mount_wait()
281 DPRINTK("waiting for mount name=%pd", dentry); in autofs4_mount_wait()
282 status = autofs4_wait(sbi, dentry, NFY_MOUNT); in autofs4_mount_wait()
289 static int do_expire_wait(struct dentry *dentry, bool rcu_walk) in do_expire_wait() argument
291 struct dentry *expiring; in do_expire_wait()
293 expiring = autofs4_lookup_expiring(dentry, rcu_walk); in do_expire_wait()
297 return autofs4_expire_wait(dentry, rcu_walk); in do_expire_wait()
311 static struct dentry *autofs4_mountpoint_changed(struct path *path) in autofs4_mountpoint_changed()
313 struct dentry *dentry = path->dentry; in autofs4_mountpoint_changed() local
314 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); in autofs4_mountpoint_changed()
320 if (autofs_type_indirect(sbi->type) && d_unhashed(dentry)) { in autofs4_mountpoint_changed()
321 struct dentry *parent = dentry->d_parent; in autofs4_mountpoint_changed()
323 struct dentry *new = d_lookup(parent, &dentry->d_name); in autofs4_mountpoint_changed()
328 dput(path->dentry); in autofs4_mountpoint_changed()
329 path->dentry = new; in autofs4_mountpoint_changed()
331 return path->dentry; in autofs4_mountpoint_changed()
336 struct dentry *dentry = path->dentry; in autofs4_d_automount() local
337 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); in autofs4_d_automount()
338 struct autofs_info *ino = autofs4_dentry_ino(dentry); in autofs4_d_automount()
341 DPRINTK("dentry=%p %pd", dentry, dentry); in autofs4_d_automount()
355 status = do_expire_wait(dentry, 0); in autofs4_d_automount()
363 status = autofs4_mount_wait(dentry, 0); in autofs4_d_automount()
374 if (d_really_is_positive(dentry) && d_is_symlink(dentry)) { in autofs4_d_automount()
379 if (!d_mountpoint(dentry)) { in autofs4_d_automount()
392 if (have_submounts(dentry)) { in autofs4_d_automount()
397 if (!simple_empty(dentry)) { in autofs4_d_automount()
404 status = autofs4_mount_wait(dentry, 0); in autofs4_d_automount()
415 dentry = autofs4_mountpoint_changed(path); in autofs4_d_automount()
416 if (!dentry) in autofs4_d_automount()
422 static int autofs4_d_manage(struct dentry *dentry, bool rcu_walk) in autofs4_d_manage() argument
424 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); in autofs4_d_manage()
425 struct autofs_info *ino = autofs4_dentry_ino(dentry); in autofs4_d_manage()
428 DPRINTK("dentry=%p %pd", dentry, dentry); in autofs4_d_manage()
432 if (!d_mountpoint(dentry)) in autofs4_d_manage()
438 if (do_expire_wait(dentry, rcu_walk) == -ECHILD) in autofs4_d_manage()
445 status = autofs4_mount_wait(dentry, rcu_walk); in autofs4_d_manage()
460 if (d_mountpoint(dentry)) in autofs4_d_manage()
462 inode = d_inode_rcu(dentry); in autofs4_d_manage()
465 if (list_empty(&dentry->d_subdirs)) in autofs4_d_manage()
467 if (!simple_empty(dentry)) in autofs4_d_manage()
487 if ((!d_mountpoint(dentry) && !simple_empty(dentry)) || in autofs4_d_manage()
488 (d_really_is_positive(dentry) && d_is_symlink(dentry))) in autofs4_d_manage()
497 static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) in autofs4_lookup() argument
501 struct dentry *active; in autofs4_lookup()
503 DPRINTK("name = %pd", dentry); in autofs4_lookup()
506 if (dentry->d_name.len > NAME_MAX) in autofs4_lookup()
515 active = autofs4_lookup_active(dentry); in autofs4_lookup()
525 if (!autofs4_oz_mode(sbi) && !IS_ROOT(dentry->d_parent)) in autofs4_lookup()
529 if (autofs_type_indirect(sbi->type) && IS_ROOT(dentry->d_parent)) in autofs4_lookup()
530 __managed_dentry_set_managed(dentry); in autofs4_lookup()
536 dentry->d_fsdata = ino; in autofs4_lookup()
537 ino->dentry = dentry; in autofs4_lookup()
539 autofs4_add_active(dentry); in autofs4_lookup()
541 d_instantiate(dentry, NULL); in autofs4_lookup()
547 struct dentry *dentry, in autofs4_dir_symlink() argument
551 struct autofs_info *ino = autofs4_dentry_ino(dentry); in autofs4_dir_symlink()
557 DPRINTK("%s <- %pd", symname, dentry); in autofs4_dir_symlink()
566 autofs4_del_active(dentry); in autofs4_dir_symlink()
577 if (!dentry->d_fsdata) in autofs4_dir_symlink()
583 d_add(dentry, inode); in autofs4_dir_symlink()
585 dget(dentry); in autofs4_dir_symlink()
587 p_ino = autofs4_dentry_ino(dentry->d_parent); in autofs4_dir_symlink()
588 if (p_ino && !IS_ROOT(dentry)) in autofs4_dir_symlink()
611 static int autofs4_dir_unlink(struct inode *dir, struct dentry *dentry) in autofs4_dir_unlink() argument
614 struct autofs_info *ino = autofs4_dentry_ino(dentry); in autofs4_dir_unlink()
622 p_ino = autofs4_dentry_ino(dentry->d_parent); in autofs4_dir_unlink()
623 if (p_ino && !IS_ROOT(dentry)) in autofs4_dir_unlink()
626 dput(ino->dentry); in autofs4_dir_unlink()
628 d_inode(dentry)->i_size = 0; in autofs4_dir_unlink()
629 clear_nlink(d_inode(dentry)); in autofs4_dir_unlink()
634 __autofs4_add_expiring(dentry); in autofs4_dir_unlink()
635 d_drop(dentry); in autofs4_dir_unlink()
652 static void autofs_set_leaf_automount_flags(struct dentry *dentry) in autofs_set_leaf_automount_flags() argument
654 struct dentry *parent; in autofs_set_leaf_automount_flags()
657 if (IS_ROOT(dentry->d_parent)) in autofs_set_leaf_automount_flags()
660 managed_dentry_set_managed(dentry); in autofs_set_leaf_automount_flags()
662 parent = dentry->d_parent; in autofs_set_leaf_automount_flags()
670 static void autofs_clear_leaf_automount_flags(struct dentry *dentry) in autofs_clear_leaf_automount_flags() argument
673 struct dentry *parent; in autofs_clear_leaf_automount_flags()
676 if (IS_ROOT(dentry->d_parent)) in autofs_clear_leaf_automount_flags()
679 managed_dentry_clear_managed(dentry); in autofs_clear_leaf_automount_flags()
681 parent = dentry->d_parent; in autofs_clear_leaf_automount_flags()
685 d_child = &dentry->d_child; in autofs_clear_leaf_automount_flags()
693 static int autofs4_dir_rmdir(struct inode *dir, struct dentry *dentry) in autofs4_dir_rmdir() argument
696 struct autofs_info *ino = autofs4_dentry_ino(dentry); in autofs4_dir_rmdir()
699 DPRINTK("dentry %p, removing %pd", dentry, dentry); in autofs4_dir_rmdir()
705 if (!simple_empty(dentry)) { in autofs4_dir_rmdir()
709 __autofs4_add_expiring(dentry); in autofs4_dir_rmdir()
710 d_drop(dentry); in autofs4_dir_rmdir()
714 autofs_clear_leaf_automount_flags(dentry); in autofs4_dir_rmdir()
717 p_ino = autofs4_dentry_ino(dentry->d_parent); in autofs4_dir_rmdir()
718 if (p_ino && dentry->d_parent != dentry) in autofs4_dir_rmdir()
721 dput(ino->dentry); in autofs4_dir_rmdir()
722 d_inode(dentry)->i_size = 0; in autofs4_dir_rmdir()
723 clear_nlink(d_inode(dentry)); in autofs4_dir_rmdir()
731 static int autofs4_dir_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) in autofs4_dir_mkdir() argument
734 struct autofs_info *ino = autofs4_dentry_ino(dentry); in autofs4_dir_mkdir()
741 DPRINTK("dentry %p, creating %pd", dentry, dentry); in autofs4_dir_mkdir()
747 autofs4_del_active(dentry); in autofs4_dir_mkdir()
752 d_add(dentry, inode); in autofs4_dir_mkdir()
755 autofs_set_leaf_automount_flags(dentry); in autofs4_dir_mkdir()
757 dget(dentry); in autofs4_dir_mkdir()
759 p_ino = autofs4_dentry_ino(dentry->d_parent); in autofs4_dir_mkdir()
760 if (p_ino && !IS_ROOT(dentry)) in autofs4_dir_mkdir()
840 int is_autofs4_dentry(struct dentry *dentry) in is_autofs4_dentry() argument
842 return dentry && d_really_is_positive(dentry) && in is_autofs4_dentry()
843 dentry->d_op == &autofs4_dentry_operations && in is_autofs4_dentry()
844 dentry->d_fsdata != NULL; in is_autofs4_dentry()