From: John L. Hammond Date: Tue, 6 May 2014 14:16:49 +0000 (-0500) Subject: LU-5013 llite: add LL_LEASE_{RD,WR,UN}LCK X-Git-Tag: 2.6.51~56 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=9fa072a08fe0951257db5af53169b54f45f2f719 LU-5013 llite: add LL_LEASE_{RD,WR,UN}LCK Define new constants LL_LEASE_{RD,WR,UN}LCK for use as the argument to and return value from the LL_IOC_{GET,SET}_LEASE ioctls. As arguments, these contants replace the use of F_{RD,WR,UN}LCK from fcntl.h. As return values they replace the use of FMODE_{READ,WRITE} which are internal to the Linux kernel source and not under the control of the Lustre ioctl interface. Signed-off-by: John L. Hammond Change-Id: I2643d7c548f84dd91cd2855894bf22f94fd20e98 Reviewed-on: http://review.whamcloud.com/10233 Tested-by: Jenkins Reviewed-by: Jinshan Xiong Tested-by: Maloo Reviewed-by: Lai Siyao Reviewed-by: Oleg Drokin --- diff --git a/lustre/include/lustre/lustre_user.h b/lustre/include/lustre/lustre_user.h index 10d1833..6625a83 100644 --- a/lustre/include/lustre/lustre_user.h +++ b/lustre/include/lustre/lustre_user.h @@ -266,6 +266,13 @@ struct ost_id { #define LL_IOC_MIGRATE _IOR('f', 247, int) #define LL_IOC_FID2MDTIDX _IOWR('f', 248, struct lu_fid) +/* Lease types for use as arg and return of LL_IOC_{GET,SET}_LEASE ioctl. */ +enum ll_lease_type { + LL_LEASE_RDLCK = 0x1, + LL_LEASE_WRLCK = 0x2, + LL_LEASE_UNLCK = 0x4, +}; + #define LL_STATFS_LMV 1 #define LL_STATFS_LOV 2 #define LL_STATFS_NODELAY 4 diff --git a/lustre/llite/file.c b/lustre/llite/file.c index 52fc9ff..3418966 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -2320,6 +2320,12 @@ out: RETURN(rc); } +static inline long ll_lease_type_from_fmode(fmode_t fmode) +{ + return ((fmode & FMODE_READ) ? LL_LEASE_RDLCK : 0) | + ((fmode & FMODE_WRITE) ? LL_LEASE_WRLCK : 0); +} + static long ll_file_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { @@ -2530,20 +2536,20 @@ ll_file_ioctl(struct file *file, unsigned int cmd, unsigned long arg) struct ll_inode_info *lli = ll_i2info(inode); struct obd_client_handle *och = NULL; bool lease_broken; - fmode_t mode = 0; + fmode_t fmode; switch (arg) { - case F_WRLCK: + case LL_LEASE_WRLCK: if (!(file->f_mode & FMODE_WRITE)) RETURN(-EPERM); - mode = FMODE_WRITE; + fmode = FMODE_WRITE; break; - case F_RDLCK: + case LL_LEASE_RDLCK: if (!(file->f_mode & FMODE_READ)) RETURN(-EPERM); - mode = FMODE_READ; + fmode = FMODE_READ; break; - case F_UNLCK: + case LL_LEASE_UNLCK: mutex_lock(&lli->lli_och_mutex); if (fd->fd_lease_och != NULL) { och = fd->fd_lease_och; @@ -2551,25 +2557,26 @@ ll_file_ioctl(struct file *file, unsigned int cmd, unsigned long arg) } mutex_unlock(&lli->lli_och_mutex); - if (och != NULL) { - mode = och->och_flags &(FMODE_READ|FMODE_WRITE); - rc = ll_lease_close(och, inode, &lease_broken); - if (rc == 0 && lease_broken) - mode = 0; - } else { - rc = -ENOLCK; - } + if (och == NULL) + RETURN(-ENOLCK); + + fmode = och->och_flags; + rc = ll_lease_close(och, inode, &lease_broken); + if (rc < 0) + RETURN(rc); + + if (lease_broken) + fmode = 0; - /* return the type of lease or error */ - RETURN(rc < 0 ? rc : (int)mode); + RETURN(ll_lease_type_from_fmode(fmode)); default: RETURN(-EINVAL); } - CDEBUG(D_INODE, "Set lease with mode %d\n", mode); + CDEBUG(D_INODE, "Set lease with mode %u\n", fmode); /* apply for lease */ - och = ll_lease_open(inode, file, mode, 0); + och = ll_lease_open(inode, file, fmode, 0); if (IS_ERR(och)) RETURN(PTR_ERR(och)); @@ -2590,8 +2597,8 @@ ll_file_ioctl(struct file *file, unsigned int cmd, unsigned long arg) case LL_IOC_GET_LEASE: { struct ll_inode_info *lli = ll_i2info(inode); struct ldlm_lock *lock = NULL; + fmode_t fmode = 0; - rc = 0; mutex_lock(&lli->lli_och_mutex); if (fd->fd_lease_och != NULL) { struct obd_client_handle *och = fd->fd_lease_och; @@ -2600,14 +2607,15 @@ ll_file_ioctl(struct file *file, unsigned int cmd, unsigned long arg) if (lock != NULL) { lock_res_and_lock(lock); if (!ldlm_is_cancel(lock)) - rc = och->och_flags & - (FMODE_READ | FMODE_WRITE); + fmode = och->och_flags; + unlock_res_and_lock(lock); LDLM_LOCK_PUT(lock); } } mutex_unlock(&lli->lli_och_mutex); - RETURN(rc); + + RETURN(ll_lease_type_from_fmode(fmode)); } case LL_IOC_HSM_IMPORT: { struct hsm_user_import *hui; diff --git a/lustre/tests/multiop.c b/lustre/tests/multiop.c index 0bb9826..fc4aa51 100644 --- a/lustre/tests/multiop.c +++ b/lustre/tests/multiop.c @@ -296,13 +296,13 @@ int main(int argc, char **argv) commands++; switch (*commands) { case 'U': - flags = F_UNLCK; + flags = LL_LEASE_UNLCK; break; case 'R': - flags = F_RDLCK; + flags = LL_LEASE_RDLCK; break; case 'W': - flags = F_WRLCK; + flags = LL_LEASE_WRLCK; break; default: errx(-1, "unknown mode: %c", *commands); @@ -312,16 +312,16 @@ int main(int argc, char **argv) if (rc < 0) err(errno, "apply lease error"); - if (flags != F_UNLCK) + if (flags != LL_LEASE_UNLCK) break; /* F_UNLCK, interpret return code */ if (rc > 0) { - const char *str = "Unknown"; - if (rc == FMODE_READ) - str = "FMODE_READ"; - else if (rc == FMODE_WRITE) - str = "FMODE_WRITE"; + const char *str = "unknown"; + if (rc == LL_LEASE_RDLCK) + str = "read"; + else if (rc == LL_LEASE_WRLCK) + str = "write"; fprintf(stdout, "%s lease(%d) released.\n", str, rc); } else if (rc == 0) { @@ -335,12 +335,12 @@ int main(int argc, char **argv) rc = ioctl(fd, LL_IOC_GET_LEASE); if (rc > 0) { - const char *str = "Unknown"; + const char *str = "unknown"; - if (rc == FMODE_READ) - str = "FMODE_READ"; - else if (rc == FMODE_WRITE) - str = "FMODE_WRITE"; + if (rc == LL_LEASE_RDLCK) + str = "read"; + else if (rc == LL_LEASE_WRLCK) + str = "write"; fprintf(stdout, "%s lease(%d) has applied.\n", str, rc); if (*commands == '-')