Whamcloud - gitweb
git://git.whamcloud.com
/
fs
/
lustre-release.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
| inline |
side by side
LU-8080 utils: Replace calls to signal with sigaction
[fs/lustre-release.git]
/
lustre
/
utils
/
liblustreapi_hsm.c
diff --git
a/lustre/utils/liblustreapi_hsm.c
b/lustre/utils/liblustreapi_hsm.c
index
d95383a
..
0b12f37
100644
(file)
--- a/
lustre/utils/liblustreapi_hsm.c
+++ b/
lustre/utils/liblustreapi_hsm.c
@@
-474,6
+474,8
@@
int llapi_hsm_register_event_fifo(const char *path)
{
int read_fd;
struct stat statbuf;
+ struct sigaction ignore_action;
+ int rc;
/* Create the FIFO if necessary. */
if ((mkfifo(path, 0644) < 0) && (errno != EEXIST)) {
@@
-508,19
+510,24
@@
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);
+ memset(&ignore_action, 0, sizeof(ignore_action));
+ ignore_action.sa_handler = SIG_IGN;
+ sigemptyset(&ignore_action.sa_mask);
+ sigaction(SIGPIPE, &ignore_action, NULL);
return 0;
}
@@
-800,13
+807,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);
@@
-1173,13
+1184,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;