* (C) Copyright 2012 Commissariat a l'energie atomique et aux energies
* alternatives
*
- * Copyright (c) 2013, 2016, Intel Corporation.
+ * Copyright (c) 2013, 2017, Intel Corporation.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser General Public License
#define CP_PRIV_MAGIC 0x19880429
struct hsm_copyaction_private {
__u32 magic;
+ __u32 source_fd;
__s32 data_fd;
const struct hsm_copytool_private *ct_priv;
struct hsm_copy copy;
* \param parent_len Destination buffer size.
* \return 0 on success.
*/
-static int fid_parent(const char *mnt, const lustre_fid *fid, char *parent,
+static int fid_parent(const char *mnt, const struct lu_fid *fid, char *parent,
size_t parent_len)
{
int rc;
int restore_mdt_index, int restore_open_flags,
bool is_error)
{
- struct hsm_copyaction_private *hcp;
- int rc;
+ struct hsm_copyaction_private *hcp;
+ int fd;
+ int rc;
hcp = calloc(1, sizeof(*hcp));
if (hcp == NULL)
return -ENOMEM;
+ hcp->source_fd = -1;
hcp->data_fd = -1;
hcp->ct_priv = ct;
hcp->copy.hc_hai = *hai;
if (is_error)
goto ok_out;
- if (hai->hai_action == HSMA_RESTORE) {
+ if (hai->hai_action == HSMA_ARCHIVE) {
+ fd = ct_open_by_fid(hcp->ct_priv, &hai->hai_dfid,
+ O_RDONLY | O_NOATIME | O_NOFOLLOW | O_NONBLOCK);
+ if (fd < 0) {
+ rc = fd;
+ goto err_out;
+ }
+
+ hcp->source_fd = fd;
+ } else if (hai->hai_action == HSMA_RESTORE) {
rc = ct_md_getattr(hcp->ct_priv, &hai->hai_fid, &hcp->stat);
if (rc < 0)
goto err_out;
restore_open_flags);
if (rc < 0)
goto err_out;
- }
-
- /* Since remove is atomic there is no need to send an initial
- * MDS_HSM_PROGRESS RPC. */
- if (hai->hai_action == HSMA_REMOVE)
+ } else if (hai->hai_action == HSMA_REMOVE) {
+ /* Since remove is atomic there is no need to send an
+ * initial MDS_HSM_PROGRESS RPC. */
goto out_log;
+ }
rc = ioctl(ct->mnt_fd, LL_IOC_HSM_COPY_START, &hcp->copy);
if (rc < 0) {
return 0;
err_out:
+ if (!(hcp->source_fd < 0))
+ close(hcp->source_fd);
+
if (!(hcp->data_fd < 0))
close(hcp->data_fd);
llapi_hsm_log_ct_progress(&hcp, hai, CT_FINISH, 0, 0);
err_cleanup:
+ if (!(hcp->source_fd < 0))
+ close(hcp->source_fd);
+
if (!(hcp->data_fd < 0))
close(hcp->data_fd);
* @return error code if the action is not a copy operation.
*/
int llapi_hsm_action_get_dfid(const struct hsm_copyaction_private *hcp,
- lustre_fid *fid)
+ struct lu_fid *fid)
{
const struct hsm_action_item *hai = &hcp->copy.hc_hai;
return -EINVAL;
if (hai->hai_action == HSMA_ARCHIVE) {
- return ct_open_by_fid(hcp->ct_priv, &hai->hai_dfid,
- O_RDONLY | O_NOATIME | O_NOFOLLOW | O_NONBLOCK);
+ fd = dup(hcp->source_fd);
+ return fd < 0 ? -errno : fd;
} else if (hai->hai_action == HSMA_RESTORE) {
fd = dup(hcp->data_fd);
return fd < 0 ? -errno : fd;
int llapi_hsm_import(const char *dst, int archive, const struct stat *st,
unsigned long long stripe_size, int stripe_offset,
int stripe_count, int stripe_pattern, char *pool_name,
- lustre_fid *newfid)
+ struct lu_fid *newfid)
{
struct hsm_user_import hui;
int fd;