/* 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); }
/** 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; }