Whamcloud - gitweb
LU-4569 hsm: Prevent copytool from importing existing file. 85/10185/3
authorHenri Doreau <henri.doreau@cea.fr>
Thu, 1 May 2014 09:57:34 +0000 (11:57 +0200)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 20 May 2014 04:47:45 +0000 (04:47 +0000)
Requesting import of an already existing FID can lead to data
corruption since both inodes in lustre would refer to the same
file in the backend.

Signed-off-by: Henri Doreau <henri.doreau@cea.fr>
Change-Id: I38bab1c890ff84b22f8816597f6d0b367aba4b38
Reviewed-on: http://review.whamcloud.com/10185
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: jacques-Charles Lafoucriere <jacques-charles.lafoucriere@cea.fr>
Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/utils/lhsmtool_posix.c

index 6df6af5..8c8ac00 100644 (file)
@@ -1392,10 +1392,20 @@ static char *path_concat(const char *dirname, const char *basename)
 
 static int ct_import_fid(const lustre_fid *import_fid)
 {
 
 static int ct_import_fid(const lustre_fid *import_fid)
 {
-       char fid_path[PATH_MAX];
+       char    fid_path[PATH_MAX];
+       int     rc;
+
+       ct_path_lustre(fid_path, sizeof(fid_path), opt.o_mnt, import_fid);
+       rc = access(fid_path, F_OK);
+       if (rc == 0 || errno != ENOENT) {
+               rc = (errno == 0) ? -EEXIST : -errno;
+               CT_ERROR(rc, "cannot import '"DFID"'", PFID(import_fid));
+               return rc;
+       }
 
        ct_path_archive(fid_path, sizeof(fid_path), opt.o_hsm_root,
                        import_fid);
 
        ct_path_archive(fid_path, sizeof(fid_path), opt.o_hsm_root,
                        import_fid);
+
        CT_TRACE("Resolving "DFID" to %s", PFID(import_fid), fid_path);
 
        return ct_import_one(fid_path, opt.o_dst);
        CT_TRACE("Resolving "DFID" to %s", PFID(import_fid), fid_path);
 
        return ct_import_one(fid_path, opt.o_dst);