/* * LGPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * (C) Copyright 2014 Commissariat a l'energie atomique et aux energies * alternatives * * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser General Public License * (LGPL) version 2.1 or (at your discretion) any later version. * (LGPL) version 2.1 accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl-2.1.html * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * LGPL HEADER END */ /* * lustre/utils/liblustreapi_lease.c * * lustreapi library for file leases * * Author: Henri Doreau */ #include #include #include #include #include #include "lustreapi_internal.h" static inline const char *lease_mode2str(int mode) { switch (mode) { case LL_LEASE_WRLCK: return "WRITE"; case LL_LEASE_RDLCK: return "READ"; case LL_LEASE_UNLCK: return "UNLOCK"; } return "???"; } /** * Get a lease on an open file. * * \param fd File to get the lease on. * \param mode Lease mode, either LL_LEASE_RDLCK or LL_LEASE_WRLCK. * * \retval 0 on success. * \retval -errno on error. */ int llapi_lease_get(int fd, int mode) { int rc; if (mode != LL_LEASE_RDLCK && mode != LL_LEASE_WRLCK) return -EINVAL; rc = ioctl(fd, LL_IOC_SET_LEASE, mode); if (rc < 0) { rc = -errno; llapi_error(LLAPI_MSG_ERROR, rc, "cannot get %s lease", lease_mode2str(mode)); } return rc; } /** * Check if a lease is still set on a file. * * \param fd File to check the lease on. * * \retval lease type if present (LL_LEASE_READ or LL_LEASE_WRITE). * \retval 0 if no lease is present. * \retval -errno on error. */ int llapi_lease_check(int fd) { int rc; rc = ioctl(fd, LL_IOC_GET_LEASE); if (rc < 0) { rc = -errno; llapi_error(LLAPI_MSG_ERROR, rc, "cannot check lease"); } return rc; } /** * Remove a lease. * * \param fd File to remove the lease from. * * \retval type of the lease that was removed (LL_LEASE_READ or LL_LEASE_WRITE). * \retval 0 if no lease was present. * \retval -errno on error. */ int llapi_lease_put(int fd) { int rc; rc = ioctl(fd, LL_IOC_SET_LEASE, LL_LEASE_UNLCK); if (rc < 0) { rc = -errno; llapi_error(LLAPI_MSG_ERROR, rc, "cannot put lease"); } return rc; }