Esempio n. 1
0
/* Lock / unlock a volatile file, with different creation flags */
static void test12(void)
{
	int rc;
	int fd;
	int gid;

	rc = mkdir(mainpath, 0600);
	ASSERTF(rc == 0, "mkdir failed for '%s': %s",
		mainpath, strerror(errno));

	fd = llapi_create_volatile_idx(mainpath, -1, O_CREAT | O_WRONLY);
	ASSERTF(fd >= 0, "llapi_create_volatile_idx failed on '%s': %s",
		mainpath, strerror(-fd));

	gid = 34895;
	rc = llapi_group_lock(fd, gid);
	ASSERTF(rc == 0, "cannot lock '%s': %s", mainpath, strerror(-rc));

	rc = llapi_group_unlock(fd, gid);
	ASSERTF(rc == 0, "cannot unlock '%s': %s", mainpath, strerror(-rc));

	close(fd);

	fd = llapi_create_volatile_idx(mainpath, -1,
				       O_CREAT | O_WRONLY | O_LOV_DELAY_CREATE);
	ASSERTF(fd >= 0, "llapi_create_volatile_idx failed on '%s': %s",
		mainpath, strerror(-fd));

	gid = 3354895;
	rc = llapi_group_lock(fd, gid);
	ASSERTF(rc == 0, "cannot lock '%s': %s", mainpath, strerror(-rc));

	rc = llapi_group_unlock(fd, gid);
	ASSERTF(rc == 0, "cannot unlock '%s': %s", mainpath, strerror(-rc));

	close(fd);

	fd = llapi_create_volatile_idx(mainpath, -1, O_RDONLY);
	ASSERTF(fd >= 0, "llapi_create_volatile_idx failed on '%s': %s",
		mainpath, strerror(-fd));

	gid = 3489655;
	rc = llapi_group_lock(fd, gid);
	ASSERTF(rc == 0, "cannot lock '%s': %s", mainpath, strerror(-rc));

	rc = llapi_group_unlock(fd, gid);
	ASSERTF(rc == 0, "cannot unlock '%s': %s", mainpath, strerror(-rc));

	close(fd);
}
Esempio n. 2
0
/** Create the destination volatile file for a restore operation.
 *
 * \param hcp        Private copyaction handle.
 * \param mdt_index  MDT index where to create the volatile file.
 * \param flags      Volatile file creation flags.
 * \return 0 on success.
 */
static int create_restore_volatile(struct hsm_copyaction_private *hcp,
				   int mdt_index, int open_flags)
{
	int			 rc;
	int			 fd;
	char			 parent[PATH_MAX + 1];
	const char		*mnt = hcp->ct_priv->mnt;
	struct hsm_action_item	*hai = &hcp->copy.hc_hai;

	rc = fid_parent(mnt, &hai->hai_fid, parent, sizeof(parent));
	if (rc < 0) {
		/* fid_parent() failed, try to keep on going */
		llapi_error(LLAPI_MSG_ERROR, rc,
			    "cannot get parent path to restore "DFID" "
			    "using '%s'", PFID(&hai->hai_fid), mnt);
		snprintf(parent, sizeof(parent), "%s", mnt);
	}

	fd = llapi_create_volatile_idx(parent, mdt_index, open_flags);
	if (fd < 0)
		return fd;

	rc = fchown(fd, hcp->stat.st_uid, hcp->stat.st_gid);
	if (rc < 0)
		goto err_cleanup;

	rc = llapi_fd2fid(fd, &hai->hai_dfid);
	if (rc < 0)
		goto err_cleanup;

	hcp->data_fd = fd;

	return 0;

err_cleanup:
	hcp->data_fd = -1;
	close(fd);

	return rc;
}