| 3789 | } |
| 3790 | |
| 3791 | void Client::unlink(Dentry *dn, bool keepdir, bool keepdentry) |
| 3792 | { |
| 3793 | InodeRef in(dn->inode); |
| 3794 | ldout(cct, 15) << "unlink dir " << dn->dir->parent_inode << " '" << dn->name << "' dn " << dn |
| 3795 | << " inode " << dn->inode << dendl; |
| 3796 | |
| 3797 | // unlink from inode |
| 3798 | if (dn->inode) { |
| 3799 | dn->unlink(); |
| 3800 | dec_dentry_nr(); |
| 3801 | ldout(cct, 20) << "unlink inode " << in << " parents now " << in->dentries << dendl; |
| 3802 | } |
| 3803 | |
| 3804 | if (keepdentry) { |
| 3805 | dn->lease_mds = -1; |
| 3806 | } else { |
| 3807 | ldout(cct, 15) << "unlink removing '" << dn->name << "' dn " << dn << dendl; |
| 3808 | |
| 3809 | // unlink from dir |
| 3810 | Dir *dir = dn->dir; |
| 3811 | dn->detach(); |
| 3812 | |
| 3813 | // delete den |
| 3814 | lru.lru_remove(dn); |
| 3815 | dn->put(); |
| 3816 | |
| 3817 | if (dir->is_empty() && !keepdir) |
| 3818 | close_dir(dir); |
| 3819 | } |
| 3820 | } |
| 3821 | |
| 3822 | /** |
| 3823 | * For asynchronous flushes, check for errors from the IO and |
no test coverage detected