Whamcloud - gitweb
LU-8098 doc: add "lfs mdts" to lfs main man page
[fs/lustre-release.git] / lustre / utils / liblustreapi_hsm.c
index 8033b03..7eaf8eb 100644 (file)
@@ -32,6 +32,7 @@
  * Author: Henri Doreau <henri.doreau@cea.fr>
  */
 
+#include <fcntl.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
@@ -45,6 +46,7 @@
 #include <sys/stat.h>
 #include <sys/time.h>
 #include <sys/types.h>
+#include <time.h>
 #include <utime.h>
 #include <sys/syscall.h>
 #include <fnmatch.h>
@@ -470,6 +472,7 @@ out_free:
  */
 int llapi_hsm_register_event_fifo(const char *path)
 {
+       int rc;
        int read_fd;
        struct stat statbuf;
 
@@ -506,17 +509,19 @@ int llapi_hsm_register_event_fifo(const char *path)
        /* Open the FIFO for writes, but don't block on waiting
         * for a reader. */
        llapi_hsm_event_fd = open(path, O_WRONLY | O_NONBLOCK);
-       if (llapi_hsm_event_fd < 0) {
-               llapi_error(LLAPI_MSG_ERROR, errno,
-                           "cannot open(%s) for write", path);
-               return -errno;
-       }
+       rc = -errno;
 
        /* Now close the reader. An external monitoring process can
         * now open the FIFO for reads. If no reader comes along the
         * events are lost. NOTE: Only one reader at a time! */
        close(read_fd);
 
+       if (llapi_hsm_event_fd < 0) {
+               llapi_error(LLAPI_MSG_ERROR, -rc,
+                           "cannot open(%s) for write", path);
+               return rc;
+       }
+
        /* Ignore SIGPIPEs -- can occur if the reader goes away. */
        signal(SIGPIPE, SIG_IGN);
 
@@ -798,13 +803,17 @@ int llapi_hsm_copytool_unregister(struct hsm_copytool_private **priv)
        if (ct->magic != CT_PRIV_MAGIC)
                return -EINVAL;
 
+       /* Close the read side of the KUC pipe. This should be done
+        * before unregistering to avoid deadlock: a ldlm_cb thread
+        * enters libcfs_kkuc_group_put() acquires kg_sem and blocks
+        * in pipe_write() due to full pipe; then we attempt to
+        * unregister and block on kg_sem. */
+       libcfs_ukuc_stop(&ct->kuc);
+
        /* Tell the kernel to stop sending us messages */
        ct->kuc.lk_flags = LK_FLG_STOP;
        ioctl(ct->mnt_fd, LL_IOC_HSM_CT_START, &ct->kuc);
 
-       /* Shut down the kernelcomms */
-       libcfs_ukuc_stop(&ct->kuc);
-
        llapi_hsm_log_ct_registration(&ct, CT_UNREGISTER);
 
        close(ct->open_by_fid_fd);
@@ -1171,13 +1180,14 @@ int llapi_hsm_action_end(struct hsm_copyaction_private **phcp,
                        .lfu_ctime_nsec = hcp->stat.st_ctim.tv_nsec,
                };
 
-               /* Set {a,m,c}time of volatile file to that of original. */
-               if (ioctl(hcp->data_fd, LL_IOC_FUTIMES_3, &lfu) < 0) {
+               rc = fsync(hcp->data_fd);
+               if (rc < 0) {
                        errval = -errno;
                        goto end;
                }
 
-               rc = fsync(hcp->data_fd);
+               /* Set {a,m,c}time of volatile file to that of original. */
+               rc = ioctl(hcp->data_fd, LL_IOC_FUTIMES_3, &lfu);
                if (rc < 0) {
                        errval = -errno;
                        goto end;