static void faf_poll_notify_nodes(unsigned long dvfs_id) { struct dvfs_file_struct *dvfs_file; struct faf_polled_fd *polled_fd; struct faf_polled_fd_node *polled_fd_node; struct hlist_node *pos; dvfs_file = _kddm_get_object_no_ft(dvfs_file_struct_ctnr, dvfs_id); if (dvfs_file && dvfs_file->file) { /* TODO: still required? */ if (atomic_read (&dvfs_file->file->f_count) == 0) dvfs_file->file = NULL; } if (!dvfs_file || !dvfs_file->file) goto out_put_dvfs_file; mutex_lock(&faf_polled_fd_mutex); polled_fd = __faf_polled_fd_find(dvfs_id); if (!polled_fd) goto out_unlock; hlist_for_each_entry(polled_fd_node, pos, &polled_fd->nodes, list) faf_poll_notify_node(polled_fd_node->node_id, dvfs_id); out_unlock: mutex_unlock(&faf_polled_fd_mutex); out_put_dvfs_file: _kddm_put_object(dvfs_file_struct_ctnr, dvfs_id); }
static int faf_polled_fd_remove(kerrighed_node_t client, int server_fd, unsigned long dvfs_id) { struct dvfs_file_struct *dvfs_file; struct faf_polled_fd *polled_fd; struct faf_polled_fd_node *polled_fd_node; int err; dvfs_file = _kddm_get_object_no_ft(dvfs_file_struct_ctnr, dvfs_id); if (dvfs_file && dvfs_file->file) { /* TODO: still required? */ if (atomic_read (&dvfs_file->file->f_count) == 0) dvfs_file->file = NULL; } mutex_lock(&faf_polled_fd_mutex); polled_fd = __faf_polled_fd_find(dvfs_id); BUG_ON(!polled_fd); BUG_ON(!polled_fd->count); polled_fd_node = __faf_polled_fd_find_node(polled_fd, client); BUG_ON(!polled_fd_node); BUG_ON(!polled_fd_node->count); polled_fd_node->count--; if (!polled_fd_node->count) faf_polled_fd_node_free(polled_fd, polled_fd_node); if (polled_fd->count) goto out_unlock; if (!dvfs_file || !dvfs_file->file) /* * The file is already closed or about to be closed. The last * __fput() automatically removes it from the interest set of * faf_poll_epfd. */ goto free_polled_fd; BUG_ON(faf_poll_epfd < 0); err = sys_epoll_ctl(faf_poll_epfd, EPOLL_CTL_DEL, server_fd, NULL); BUG_ON(err); free_polled_fd: faf_polled_fd_free(polled_fd); out_unlock: mutex_unlock(&faf_polled_fd_mutex); _kddm_put_object(dvfs_file_struct_ctnr, dvfs_id); return 0; }
static struct kern_ipc_perm *kcb_ipc_shm_findkey(struct ipc_ids *ids, key_t key) { long *key_index; int id = -1; key_index = _kddm_get_object_no_ft(ids->krgops->key_kddm_set, key); if (key_index) id = *key_index; _kddm_put_object(ids->krgops->key_kddm_set, key); if (id != -1) return kcb_ipc_shm_lock(ids, id); return NULL; }
/** * @author Pascal Gallard */ struct task_kddm_object *krg_task_readlock(pid_t pid) { struct task_kddm_object *obj; /* Filter well known cases of no task kddm object. */ if (!(pid & GLOBAL_PID_MASK)) return NULL; obj = _kddm_get_object_no_ft(task_kddm_set, pid); if (likely(obj)) { down_read(&obj->sem); if (obj->write_locked == 2) { /* Dying object */ up_read(&obj->sem); _kddm_put_object(task_kddm_set, pid); return NULL; } /* Marker for unlock. Dirty but temporary. */ obj->write_locked = 0; } return obj; }