Whamcloud - gitweb
LU-9771 flr: resync support and test tool
[fs/lustre-release.git] / lustre / utils / liblustreapi_lease.c
1 /*
2  * LGPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * (C) Copyright 2014 Commissariat a l'energie atomique et aux energies
7  *     alternatives
8  *
9  * All rights reserved. This program and the accompanying materials
10  * are made available under the terms of the GNU Lesser General Public License
11  * (LGPL) version 2.1 or (at your discretion) any later version.
12  * (LGPL) version 2.1 accompanies this distribution, and is available at
13  * http://www.gnu.org/licenses/lgpl-2.1.html
14  *
15  * This library is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  * Lesser General Public License for more details.
19  *
20  * LGPL HEADER END
21  */
22 /*
23  * lustre/utils/liblustreapi_lease.c
24  *
25  * lustreapi library for file leases
26  *
27  * Author: Henri Doreau <henri.doreau@cea.fr>
28  */
29
30 #include <unistd.h>
31 #include <fcntl.h>
32 #include <sys/ioctl.h>
33 #include <errno.h>
34 #include <lustre/lustreapi.h>
35 #include "lustreapi_internal.h"
36
37 static inline const char *lease_mode2str(int mode)
38 {
39         switch (mode) {
40         case LL_LEASE_WRLCK: return "WRITE";
41         case LL_LEASE_RDLCK: return "READ";
42         case LL_LEASE_UNLCK: return "UNLOCK";
43         }
44         return "???";
45 }
46
47 /**
48  * Extend lease get support.
49  *
50  * \param fd    File to get lease on.
51  * \param data  ll_ioc_lease data.
52  *
53  * \retval 0 on success.
54  * \retval -errno on error.
55  */
56 int llapi_lease_get_ext(int fd, struct ll_ioc_lease *data)
57 {
58         int rc;
59
60         rc = ioctl(fd, LL_IOC_SET_LEASE, data);
61         if (rc < 0) {
62                 rc = -errno;
63
64                 /* exclude ENOTTY in case this is an old kernel that only
65                  * supports LL_IOC_SET_LEASE_OLD */
66                 if (rc != -ENOTTY)
67                         llapi_error(LLAPI_MSG_ERROR, rc,
68                                     "cannot get %s lease, ext %x",
69                                     lease_mode2str(data->lil_mode),
70                                     data->lil_flags);
71         }
72         return rc;
73 }
74
75 /**
76  * Get a lease on an open file.
77  *
78  * \param fd    File to get the lease on.
79  * \param mode  Lease mode, either LL_LEASE_RDLCK or LL_LEASE_WRLCK.
80  *
81  * \retval 0 on success.
82  * \retval -errno on error.
83  */
84 int llapi_lease_get(int fd, int mode)
85 {
86         struct ll_ioc_lease data = { 0 };
87         int rc;
88
89         if (mode != LL_LEASE_RDLCK && mode != LL_LEASE_WRLCK)
90                 return -EINVAL;
91
92         data.lil_mode = mode;
93         rc = llapi_lease_get_ext(fd, &data);
94         if (rc == -ENOTTY) {
95                 rc = ioctl(fd, LL_IOC_SET_LEASE_OLD, mode);
96                 if (rc < 0)
97                         rc = -errno;
98         }
99
100         return rc;
101 }
102
103 /**
104  * Check if a lease is still set on a file.
105  *
106  * \param fd    File to check the lease on.
107  *
108  * \retval lease type if present (LL_LEASE_READ or LL_LEASE_WRITE).
109  * \retval 0 if no lease is present.
110  * \retval -errno on error.
111  */
112 int llapi_lease_check(int fd)
113 {
114         int rc;
115
116         rc = ioctl(fd, LL_IOC_GET_LEASE);
117         if (rc < 0) {
118                 rc = -errno;
119                 llapi_error(LLAPI_MSG_ERROR, rc, "cannot check lease");
120         }
121         return rc;
122 }
123
124 /**
125  * Remove a lease.
126  *
127  * \param fd    File to remove the lease from.
128  *
129  * \retval type of the lease that was removed (LL_LEASE_READ or LL_LEASE_WRITE).
130  * \retval 0 if no lease was present.
131  * \retval -errno on error.
132  */
133 int llapi_lease_put(int fd)
134 {
135         struct ll_ioc_lease data = { .lil_mode = LL_LEASE_UNLCK };
136
137         return llapi_lease_get_ext(fd, &data);
138 }