Ejemplo n.º 1
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");
  cache_inode_invalidate(&pevdata->event_context.fsal_data,
                           &cache_status,
                           CACHE_INODE_INVALIDATE_CLEARBITS);

  ReturnCode(ERR_FSAL_NO_ERROR, 0);
}
Ejemplo n.º 2
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);
}
Ejemplo n.º 3
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);
}
Ejemplo n.º 4
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 */