fsal_status_t dumb_fsal_up_update(fsal_up_event_data_t * pevdata) { cache_inode_status_t cache_status; LogFullDebug(COMPONENT_FSAL_UP, "FSAL_UP_DUMB: Entered dumb_fsal_up_update"); cache_inode_invalidate(&pevdata->event_context.fsal_data, &cache_status, CACHE_INODE_INVALIDATE_CLEARBITS); ReturnCode(ERR_FSAL_NO_ERROR, 0); }
fsal_status_t dumb_fsal_up_update(fsal_up_event_data_t * pevdata) { cache_inode_status_t cache_status; LogFullDebug(COMPONENT_FSAL_UP, "FSAL_UP_DUMB: Entered dumb_fsal_up_update\n"); if ((pevdata->type.update.upu_flags & FSAL_UP_NLINK) && (pevdata->type.update.upu_stat_buf.st_nlink == 0) ) { LogFullDebug(COMPONENT_FSAL_UP, "FSAL_UP_DUMB: nlink has become zero; close fds\n"); cache_inode_invalidate(&pevdata->event_context.fsal_data, &cache_status, (CACHE_INODE_INVALIDATE_CLEARBITS | CACHE_INODE_INVALIDATE_CLOSE)); } else cache_inode_invalidate(&pevdata->event_context.fsal_data, &cache_status, CACHE_INODE_INVALIDATE_CLEARBITS); ReturnCode(ERR_FSAL_NO_ERROR, 0); }
fsal_status_t dumb_fsal_up_invalidate_step2(fsal_up_event_data_t * pevdata) { cache_inode_status_t cache_status; LogDebug(COMPONENT_FSAL_UP, "FSAL_UP_DUMB: calling cache_inode_invalidate()"); /* Lock the entry */ cache_inode_invalidate(&pevdata->event_context.fsal_data, &cache_status, CACHE_INODE_INVALIDATE_CLOSE); ReturnCode(ERR_FSAL_NO_ERROR, 0); }
cache_inode_status_t cache_inode_operate_cached_dirent(cache_entry_t *directory, const char *name, const char *newname, cache_inode_dirent_op_t dirent_op) { cache_inode_dir_entry_t *dirent, *dirent2, *dirent3; cache_inode_status_t status = CACHE_INODE_SUCCESS; int code = 0; assert((dirent_op == CACHE_INODE_DIRENT_OP_LOOKUP) || (dirent_op == CACHE_INODE_DIRENT_OP_REMOVE) || (dirent_op == CACHE_INODE_DIRENT_OP_RENAME)); /* Sanity check */ if (directory->type != DIRECTORY) { status = CACHE_INODE_NOT_A_DIRECTORY; goto out; } LogFullDebug(COMPONENT_CACHE_INODE, "%s %p name=%s newname=%s", dirent_op == CACHE_INODE_DIRENT_OP_REMOVE ? "REMOVE" : "RENAME", directory, name, newname); /* If no active entry, do nothing */ if (directory->object.dir.nbactive == 0) { if (! ((directory->flags & CACHE_INODE_TRUST_CONTENT) && (directory->flags & CACHE_INODE_DIR_POPULATED))) { /* We cannot serve negative lookups. */ /* status == CACHE_INODE_SUCCESS; */ } else { status = CACHE_INODE_NOT_FOUND; } goto out; } dirent = cache_inode_avl_qp_lookup_s(directory, name, 1); if ((!dirent) || (dirent->flags & DIR_ENTRY_FLAG_DELETED)) { if (! ((directory->flags & CACHE_INODE_TRUST_CONTENT) && (directory->flags & CACHE_INODE_DIR_POPULATED)) || (dirent_op == CACHE_INODE_DIRENT_OP_REMOVE)) { /* We cannot serve negative lookups. */ /* status == CACHE_INODE_SUCCESS; */ } else { status = CACHE_INODE_NOT_FOUND; } LogFullDebug(COMPONENT_CACHE_INODE, "dirent=%p%s directory flags%s%s", dirent, dirent ? ((dirent->flags & DIR_ENTRY_FLAG_DELETED) ? " DELETED" : "") : "", (directory->flags & CACHE_INODE_TRUST_CONTENT) ? " TRUST" : "", (directory->flags & CACHE_INODE_DIR_POPULATED) ? " POPULATED" : ""); goto out; } /* We perform operations anyway even if CACHE_INODE_TRUST_CONTENT is clear. That way future upcalls can call in to this function to update the content to be correct. We just don't ever return a not found or exists error. */ switch (dirent_op) { case CACHE_INODE_DIRENT_OP_REMOVE: /* mark deleted */ avl_dirent_set_deleted(directory, dirent); directory->object.dir.nbactive--; break; case CACHE_INODE_DIRENT_OP_RENAME: dirent2 = cache_inode_avl_qp_lookup_s(directory, newname, 1); if (dirent2) { /* rename would cause a collision */ if (directory->flags & CACHE_INODE_TRUST_CONTENT) { /* overwrite, replace entry and expire the * old */ cache_entry_t *oldentry; avl_dirent_set_deleted(directory, dirent); cache_inode_key_dup(&dirent2->ckey, &dirent->ckey); oldentry = cache_inode_get_keyed( &dirent2->ckey, CIG_KEYED_FLAG_CACHED_ONLY, &status); if (oldentry) { /* if it is still around, mark it * gone/stale */ status = cache_inode_invalidate( oldentry, CIV_FLAGS); cache_inode_lru_unref(oldentry, LRU_FLAG_NONE); } } else status = CACHE_INODE_ENTRY_EXISTS; } else { /* Size (including terminating NUL) of the filename */ size_t newnamesize = strlen(newname) + 1; /* try to rename--no longer in-place */ dirent3 = gsh_malloc(sizeof(cache_inode_dir_entry_t) + newnamesize); memcpy(dirent3->name, newname, newnamesize); dirent3->flags = DIR_ENTRY_FLAG_NONE; cache_inode_key_dup(&dirent3->ckey, &dirent->ckey); avl_dirent_set_deleted(directory, dirent); code = cache_inode_avl_qp_insert(directory, dirent3); if (code < 0) { /* collision, tree state unchanged (unlikely) */ status = CACHE_INODE_ENTRY_EXISTS; /* dirent is on persist tree, undelete it */ avl_dirent_clear_deleted(directory, dirent); /* dirent3 was never inserted */ gsh_free(dirent3); } } /* !found */ break; case CACHE_INODE_DIRENT_OP_LOOKUP: /* Lookup was performed before switch statement */ break; } out: return status; } /* cache_inode_operate_cached_dirent */