int nffs_dir_close(struct nffs_dir *dir) { int rc; if (dir == NULL) { return 0; } if (dir->nd_dirent.nde_inode_entry != NULL) { rc = nffs_inode_dec_refcnt(dir->nd_dirent.nde_inode_entry); if (rc != 0) { return rc; } } rc = nffs_inode_dec_refcnt(dir->nd_parent_inode_entry); if (rc != 0) { return rc; } rc = nffs_dir_free(dir); if (rc != 0) { return rc; } return 0; }
int nffs_dir_read(struct nffs_dir *dir, struct nffs_dirent **out_dirent) { struct nffs_inode_entry *child; int rc; if (dir->nd_dirent.nde_inode_entry == NULL) { child = SLIST_FIRST(&dir->nd_parent_inode_entry->nie_child_list); } else { child = SLIST_NEXT(dir->nd_dirent.nde_inode_entry, nie_sibling_next); rc = nffs_inode_dec_refcnt(dir->nd_dirent.nde_inode_entry); if (rc != 0) { /* XXX: Need to clean up anything? */ return rc; } } dir->nd_dirent.nde_inode_entry = child; if (child == NULL) { *out_dirent = NULL; return FS_ENOENT; } child->nie_refcnt++; *out_dirent = &dir->nd_dirent; return 0; }
/** * Closes the specified file and invalidates the file handle. If the file has * already been unlinked, and this is the last open handle to the file, this * operation causes the file to be deleted. * * @param file The file handle to close. * * @return 0 on success; nonzero on failure. */ int nffs_file_close(struct nffs_file *file) { int rc; rc = nffs_inode_dec_refcnt(file->nf_inode_entry); if (rc != 0) { return rc; } rc = nffs_file_free(file); if (rc != 0) { return rc; } return 0; }