linux/fs/afs/flock.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/* AFS file locking support
   3 *
   4 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
   5 * Written by David Howells (dhowells@redhat.com)
   6 */
   7
   8#include "internal.h"
   9
  10#define AFS_LOCK_GRANTED        0
  11#define AFS_LOCK_PENDING        1
  12#define AFS_LOCK_YOUR_TRY       2
  13
  14struct workqueue_struct *afs_lock_manager;
  15
  16static void afs_next_locker(struct afs_vnode *vnode, int error);
  17static void afs_fl_copy_lock(struct file_lock *new, struct file_lock *fl);
  18static void afs_fl_release_private(struct file_lock *fl);
  19
  20static const struct file_lock_operations afs_lock_ops = {
  21        .fl_copy_lock           = afs_fl_copy_lock,
  22        .fl_release_private     = afs_fl_release_private,
  23};
  24
  25static inline void afs_set_lock_state(struct afs_vnode *vnode, enum afs_lock_state state)
  26{
  27        _debug("STATE %u -> %u", vnode->lock_state, state);
  28        vnode->lock_state = state;
  29}
  30
  31static atomic_t afs_file_lock_debug_id;
  32
  33/*
  34 * if the callback is broken on this vnode, then the lock may now be available
  35 */
  36void afs_lock_may_be_available(struct afs_vnode *vnode)
  37{
  38        _enter("{%llx:%llu}", vnode->fid.vid, vnode->fid.vnode);
  39
  40        spin_lock(&vnode->lock);
  41        if (vnode->lock_state == AFS_VNODE_LOCK_WAITING_FOR_CB)
  42                afs_next_locker(vnode, 0);
  43        trace_afs_flock_ev(vnode, NULL, afs_flock_callback_break, 0);
  44        spin_unlock(&vnode->lock);
  45}
  46
  47/*
  48 * the lock will time out in 5 minutes unless we extend it, so schedule
  49 * extension in a bit less than that time
  50 */
  51static void afs_schedule_lock_extension(struct afs_vnode *vnode)
  52{
  53        ktime_t expires_at, now, duration;
  54        u64 duration_j;
  55
  56        expires_at = ktime_add_ms(vnode->locked_at, AFS_LOCKWAIT * 1000 / 2);
  57        now = ktime_get_real();
  58        duration = ktime_sub(expires_at, now);
  59        if (duration <= 0)
  60                duration_j = 0;
  61        else
  62                duration_j = nsecs_to_jiffies(ktime_to_ns(duration));
  63
  64        queue_delayed_work(afs_lock_manager, &vnode->lock_work, duration_j);
  65}
  66
  67/*
  68 * In the case of successful completion of a lock operation, record the time
  69 * the reply appeared and start the lock extension timer.
  70 */
  71void afs_lock_op_done(struct afs_call *call)
  72{
  73        struct afs_operation *op = call->op;
  74        struct afs_vnode *vnode = op->file[0].vnode;
  75
  76        if (call->error == 0) {
  77                spin_lock(&vnode->lock);
  78                trace_afs_flock_ev(vnode, NULL, afs_flock_timestamp, 0);
  79                vnode->locked_at = call->reply_time;
  80                afs_schedule_lock_extension(vnode);
  81                spin_unlock(&vnode->lock);
  82        }
  83}
  84
  85/*
  86 * grant one or more locks (readlocks are allowed to jump the queue if the
  87 * first lock in the queue is itself a readlock)
  88 * - the caller must hold the vnode lock
  89 */
  90static void afs_grant_locks(struct afs_vnode *vnode)
  91{
  92        struct file_lock *p, *_p;
  93        bool exclusive = (vnode->lock_type == AFS_LOCK_WRITE);
  94
  95        list_for_each_entry_safe(p, _p, &vnode->pending_locks, fl_u.afs.link) {
  96                if (!exclusive && p->fl_type == F_WRLCK)
  97                        continue;
  98
  99                list_move_tail(&p->fl_u.afs.link, &vnode->granted_locks);
 100                p->fl_u.afs.state = AFS_LOCK_GRANTED;
 101                trace_afs_flock_op(vnode, p, afs_flock_op_grant);
 102                wake_up(&p->fl_wait);
 103        }
 104}
 105
 106/*
 107 * If an error is specified, reject every pending lock that matches the
 108 * authentication and type of the lock we failed to get.  If there are any
 109 * remaining lockers, try to wake up one of them to have a go.
 110 */
 111static void afs_next_locker(struct afs_vnode *vnode, int error)
 112{
 113        struct file_lock *p, *_p, *next = NULL;
 114        struct key *key = vnode->lock_key;
 115        unsigned int fl_type = F_RDLCK;
 116
 117        _enter("");
 118
 119        if (vnode->lock_type == AFS_LOCK_WRITE)
 120                fl_type = F_WRLCK;
 121
 122        list_for_each_entry_safe(p, _p, &vnode->pending_locks, fl_u.afs.link) {
 123                if (error &&
 124                    p->fl_type == fl_type &&
 125                    afs_file_key(p->fl_file) == key) {
 126                        list_del_init(&p->fl_u.afs.link);
 127                        p->fl_u.afs.state = error;
 128                        wake_up(&p->fl_wait);
 129                }
 130
 131                /* Select the next locker to hand off to. */
 132                if (next &&
 133                    (next->fl_type == F_WRLCK || p->fl_type == F_RDLCK))
 134                        continue;
 135                next = p;
 136        }
 137
 138        vnode->lock_key = NULL;
 139        key_put(key);
 140
 141        if (next) {
 142                afs_set_lock_state(vnode, AFS_VNODE_LOCK_SETTING);
 143                next->fl_u.afs.state = AFS_LOCK_YOUR_TRY;
 144                trace_afs_flock_op(vnode, next, afs_flock_op_wake);
 145                wake_up(&next->fl_wait);
 146        } else {
 147                afs_set_lock_state(vnode, AFS_VNODE_LOCK_NONE);
 148                trace_afs_flock_ev(vnode, NULL, afs_flock_no_lockers, 0);
 149        }
 150
 151        _leave("");
 152}
 153
 154/*
 155 * Kill off all waiters in the the pending lock queue due to the vnode being
 156 * deleted.
 157 */
 158static void afs_kill_lockers_enoent(struct afs_vnode *vnode)
 159{
 160        struct file_lock *p;
 161
 162        afs_set_lock_state(vnode, AFS_VNODE_LOCK_DELETED);
 163
 164        while (!list_empty(&vnode->pending_locks)) {
 165                p = list_entry(vnode->pending_locks.next,
 166                               struct file_lock, fl_u.afs.link);
 167                list_del_init(&p->fl_u.afs.link);
 168                p->fl_u.afs.state = -ENOENT;
 169                wake_up(&p->fl_wait);
 170        }
 171
 172        key_put(vnode->lock_key);
 173        vnode->lock_key = NULL;
 174}
 175
 176static void afs_lock_success(struct afs_operation *op)
 177{
 178        _enter("op=%08x", op->debug_id);
 179        afs_vnode_commit_status(op, &op->file[0]);
 180}
 181
 182static const struct afs_operation_ops afs_set_lock_operation = {
 183        .issue_afs_rpc  = afs_fs_set_lock,
 184        .issue_yfs_rpc  = yfs_fs_set_lock,
 185        .success        = afs_lock_success,
 186        .aborted        = afs_check_for_remote_deletion,
 187};
 188
 189/*
 190 * Get a lock on a file
 191 */
 192static int afs_set_lock(struct afs_vnode *vnode, struct key *key,
 193                        afs_lock_type_t type)
 194{
 195        struct afs_operation *op;
 196
 197        _enter("%s{%llx:%llu.%u},%x,%u",
 198               vnode->volume->name,
 199               vnode->fid.vid,
 200               vnode->fid.vnode,
 201               vnode->fid.unique,
 202               key_serial(key), type);
 203
 204        op = afs_alloc_operation(key, vnode->volume);
 205        if (IS_ERR(op))
 206                return PTR_ERR(op);
 207
 208        afs_op_set_vnode(op, 0, vnode);
 209
 210        op->lock.type   = type;
 211        op->ops         = &afs_set_lock_operation;
 212        return afs_do_sync_operation(op);
 213}
 214
 215static const struct afs_operation_ops afs_extend_lock_operation = {
 216        .issue_afs_rpc  = afs_fs_extend_lock,
 217        .issue_yfs_rpc  = yfs_fs_extend_lock,
 218        .success        = afs_lock_success,
 219};
 220
 221/*
 222 * Extend a lock on a file
 223 */
 224static int afs_extend_lock(struct afs_vnode *vnode, struct key *key)
 225{
 226        struct afs_operation *op;
 227
 228        _enter("%s{%llx:%llu.%u},%x",
 229               vnode->volume->name,
 230               vnode->fid.vid,
 231               vnode->fid.vnode,
 232               vnode->fid.unique,
 233               key_serial(key));
 234
 235        op = afs_alloc_operation(key, vnode->volume);
 236        if (IS_ERR(op))
 237                return PTR_ERR(op);
 238
 239        afs_op_set_vnode(op, 0, vnode);
 240
 241        op->flags       |= AFS_OPERATION_UNINTR;
 242        op->ops         = &afs_extend_lock_operation;
 243        return afs_do_sync_operation(op);
 244}
 245
 246static const struct afs_operation_ops afs_release_lock_operation = {
 247        .issue_afs_rpc  = afs_fs_release_lock,
 248        .issue_yfs_rpc  = yfs_fs_release_lock,
 249        .success        = afs_lock_success,
 250};
 251
 252/*
 253 * Release a lock on a file
 254 */
 255static int afs_release_lock(struct afs_vnode *vnode, struct key *key)
 256{
 257        struct afs_operation *op;
 258
 259        _enter("%s{%llx:%llu.%u},%x",
 260               vnode->volume->name,
 261               vnode->fid.vid,
 262               vnode->fid.vnode,
 263               vnode->fid.unique,
 264               key_serial(key));
 265
 266        op = afs_alloc_operation(key, vnode->volume);
 267        if (IS_ERR(op))
 268                return PTR_ERR(op);
 269
 270        afs_op_set_vnode(op, 0, vnode);
 271
 272        op->flags       |= AFS_OPERATION_UNINTR;
 273        op->ops         = &afs_release_lock_operation;
 274        return afs_do_sync_operation(op);
 275}
 276
 277/*
 278 * do work for a lock, including:
 279 * - probing for a lock we're waiting on but didn't get immediately
 280 * - extending a lock that's close to timing out
 281 */
 282void afs_lock_work(struct work_struct *work)
 283{
 284        struct afs_vnode *vnode =
 285                container_of(work, struct afs_vnode, lock_work.work);
 286        struct key *key;
 287        int ret;
 288
 289        _enter("{%llx:%llu}", vnode->fid.vid, vnode->fid.vnode);
 290
 291        spin_lock(&vnode->lock);
 292
 293again:
 294        _debug("wstate %u for %p", vnode->lock_state, vnode);
 295        switch (vnode->lock_state) {
 296        case AFS_VNODE_LOCK_NEED_UNLOCK:
 297                afs_set_lock_state(vnode, AFS_VNODE_LOCK_UNLOCKING);
 298                trace_afs_flock_ev(vnode, NULL, afs_flock_work_unlocking, 0);
 299                spin_unlock(&vnode->lock);
 300
 301                /* attempt to release the server lock; if it fails, we just
 302                 * wait 5 minutes and it'll expire anyway */
 303                ret = afs_release_lock(vnode, vnode->lock_key);
 304                if (ret < 0 && vnode->lock_state != AFS_VNODE_LOCK_DELETED) {
 305                        trace_afs_flock_ev(vnode, NULL, afs_flock_release_fail,
 306                                           ret);
 307                        printk(KERN_WARNING "AFS:"
 308                               " Failed to release lock on {%llx:%llx} error %d\n",
 309                               vnode->fid.vid, vnode->fid.vnode, ret);
 310                }
 311
 312                spin_lock(&vnode->lock);
 313                if (ret == -ENOENT)
 314                        afs_kill_lockers_enoent(vnode);
 315                else
 316                        afs_next_locker(vnode, 0);
 317                spin_unlock(&vnode->lock);
 318                return;
 319
 320        /* If we've already got a lock, then it must be time to extend that
 321         * lock as AFS locks time out after 5 minutes.
 322         */
 323        case AFS_VNODE_LOCK_GRANTED:
 324                _debug("extend");
 325
 326                ASSERT(!list_empty(&vnode->granted_locks));
 327
 328                key = key_get(vnode->lock_key);
 329                afs_set_lock_state(vnode, AFS_VNODE_LOCK_EXTENDING);
 330                trace_afs_flock_ev(vnode, NULL, afs_flock_work_extending, 0);
 331                spin_unlock(&vnode->lock);
 332
 333                ret = afs_extend_lock(vnode, key); /* RPC */
 334                key_put(key);
 335
 336                if (ret < 0) {
 337                        trace_afs_flock_ev(vnode, NULL, afs_flock_extend_fail,
 338                                           ret);
 339                        pr_warn("AFS: Failed to extend lock on {%llx:%llx} error %d\n",
 340                                vnode->fid.vid, vnode->fid.vnode, ret);
 341                }
 342
 343                spin_lock(&vnode->lock);
 344
 345                if (ret == -ENOENT) {
 346                        afs_kill_lockers_enoent(vnode);
 347                        spin_unlock(&vnode->lock);
 348                        return;
 349                }
 350
 351                if (vnode->lock_state != AFS_VNODE_LOCK_EXTENDING)
 352                        goto again;
 353                afs_set_lock_state(vnode, AFS_VNODE_LOCK_GRANTED);
 354
 355                if (ret != 0)
 356                        queue_delayed_work(afs_lock_manager, &vnode->lock_work,
 357                                           HZ * 10);
 358                spin_unlock(&vnode->lock);
 359                _leave(" [ext]");
 360                return;
 361
 362        /* If we're waiting for a callback to indicate lock release, we can't
 363         * actually rely on this, so need to recheck at regular intervals.  The
 364         * problem is that the server might not notify us if the lock just
 365         * expires (say because a client died) rather than being explicitly
 366         * released.
 367         */
 368        case AFS_VNODE_LOCK_WAITING_FOR_CB:
 369                _debug("retry");
 370                afs_next_locker(vnode, 0);
 371                spin_unlock(&vnode->lock);
 372                return;
 373
 374        case AFS_VNODE_LOCK_DELETED:
 375                afs_kill_lockers_enoent(vnode);
 376                spin_unlock(&vnode->lock);
 377                return;
 378
 379        default:
 380                /* Looks like a lock request was withdrawn. */
 381                spin_unlock(&vnode->lock);
 382                _leave(" [no]");
 383                return;
 384        }
 385}
 386
 387/*
 388 * pass responsibility for the unlocking of a vnode on the server to the
 389 * manager thread, lest a pending signal in the calling thread interrupt
 390 * AF_RXRPC
 391 * - the caller must hold the vnode lock
 392 */
 393static void afs_defer_unlock(struct afs_vnode *vnode)
 394{
 395        _enter("%u", vnode->lock_state);
 396
 397        if (list_empty(&vnode->granted_locks) &&
 398            (vnode->lock_state == AFS_VNODE_LOCK_GRANTED ||
 399             vnode->lock_state == AFS_VNODE_LOCK_EXTENDING)) {
 400                cancel_delayed_work(&vnode->lock_work);
 401
 402                afs_set_lock_state(vnode, AFS_VNODE_LOCK_NEED_UNLOCK);
 403                trace_afs_flock_ev(vnode, NULL, afs_flock_defer_unlock, 0);
 404                queue_delayed_work(afs_lock_manager, &vnode->lock_work, 0);
 405        }
 406}
 407
 408/*
 409 * Check that our view of the file metadata is up to date and check to see
 410 * whether we think that we have a locking permit.
 411 */
 412static int afs_do_setlk_check(struct afs_vnode *vnode, struct key *key,
 413                              enum afs_flock_mode mode, afs_lock_type_t type)
 414{
 415        afs_access_t access;
 416        int ret;
 417
 418        /* Make sure we've got a callback on this file and that our view of the
 419         * data version is up to date.
 420         */
 421        ret = afs_validate(vnode, key);
 422        if (ret < 0)
 423                return ret;
 424
 425        /* Check the permission set to see if we're actually going to be
 426         * allowed to get a lock on this file.
 427         */
 428        ret = afs_check_permit(vnode, key, &access);
 429        if (ret < 0)
 430                return ret;
 431
 432        /* At a rough estimation, you need LOCK, WRITE or INSERT perm to
 433         * read-lock a file and WRITE or INSERT perm to write-lock a file.
 434         *
 435         * We can't rely on the server to do this for us since if we want to
 436         * share a read lock that we already have, we won't go the server.
 437         */
 438        if (type == AFS_LOCK_READ) {
 439                if (!(access & (AFS_ACE_INSERT | AFS_ACE_WRITE | AFS_ACE_LOCK)))
 440                        return -EACCES;
 441        } else {
 442                if (!(access & (AFS_ACE_INSERT | AFS_ACE_WRITE)))
 443                        return -EACCES;
 444        }
 445
 446        return 0;
 447}
 448
 449/*
 450 * request a lock on a file on the server
 451 */
 452static int afs_do_setlk(struct file *file, struct file_lock *fl)
 453{
 454        struct inode *inode = locks_inode(file);
 455        struct afs_vnode *vnode = AFS_FS_I(inode);
 456        enum afs_flock_mode mode = AFS_FS_S(inode->i_sb)->flock_mode;
 457        afs_lock_type_t type;
 458        struct key *key = afs_file_key(file);
 459        bool partial, no_server_lock = false;
 460        int ret;
 461
 462        if (mode == afs_flock_mode_unset)
 463                mode = afs_flock_mode_openafs;
 464
 465        _enter("{%llx:%llu},%llu-%llu,%u,%u",
 466               vnode->fid.vid, vnode->fid.vnode,
 467               fl->fl_start, fl->fl_end, fl->fl_type, mode);
 468
 469        fl->fl_ops = &afs_lock_ops;
 470        INIT_LIST_HEAD(&fl->fl_u.afs.link);
 471        fl->fl_u.afs.state = AFS_LOCK_PENDING;
 472
 473        partial = (fl->fl_start != 0 || fl->fl_end != OFFSET_MAX);
 474        type = (fl->fl_type == F_RDLCK) ? AFS_LOCK_READ : AFS_LOCK_WRITE;
 475        if (mode == afs_flock_mode_write && partial)
 476                type = AFS_LOCK_WRITE;
 477
 478        ret = afs_do_setlk_check(vnode, key, mode, type);
 479        if (ret < 0)
 480                return ret;
 481
 482        trace_afs_flock_op(vnode, fl, afs_flock_op_set_lock);
 483
 484        /* AFS3 protocol only supports full-file locks and doesn't provide any
 485         * method of upgrade/downgrade, so we need to emulate for partial-file
 486         * locks.
 487         *
 488         * The OpenAFS client only gets a server lock for a full-file lock and
 489         * keeps partial-file locks local.  Allow this behaviour to be emulated
 490         * (as the default).
 491         */
 492        if (mode == afs_flock_mode_local ||
 493            (partial && mode == afs_flock_mode_openafs)) {
 494                no_server_lock = true;
 495                goto skip_server_lock;
 496        }
 497
 498        spin_lock(&vnode->lock);
 499        list_add_tail(&fl->fl_u.afs.link, &vnode->pending_locks);
 500
 501        ret = -ENOENT;
 502        if (vnode->lock_state == AFS_VNODE_LOCK_DELETED)
 503                goto error_unlock;
 504
 505        /* If we've already got a lock on the server then try to move to having
 506         * the VFS grant the requested lock.  Note that this means that other
 507         * clients may get starved out.
 508         */
 509        _debug("try %u", vnode->lock_state);
 510        if (vnode->lock_state == AFS_VNODE_LOCK_GRANTED) {
 511                if (type == AFS_LOCK_READ) {
 512                        _debug("instant readlock");
 513                        list_move_tail(&fl->fl_u.afs.link, &vnode->granted_locks);
 514                        fl->fl_u.afs.state = AFS_LOCK_GRANTED;
 515                        goto vnode_is_locked_u;
 516                }
 517
 518                if (vnode->lock_type == AFS_LOCK_WRITE) {
 519                        _debug("instant writelock");
 520                        list_move_tail(&fl->fl_u.afs.link, &vnode->granted_locks);
 521                        fl->fl_u.afs.state = AFS_LOCK_GRANTED;
 522                        goto vnode_is_locked_u;
 523                }
 524        }
 525
 526        if (vnode->lock_state == AFS_VNODE_LOCK_NONE &&
 527            !(fl->fl_flags & FL_SLEEP)) {
 528                ret = -EAGAIN;
 529                if (type == AFS_LOCK_READ) {
 530                        if (vnode->status.lock_count == -1)
 531                                goto lock_is_contended; /* Write locked */
 532                } else {
 533                        if (vnode->status.lock_count != 0)
 534                                goto lock_is_contended; /* Locked */
 535                }
 536        }
 537
 538        if (vnode->lock_state != AFS_VNODE_LOCK_NONE)
 539                goto need_to_wait;
 540
 541try_to_lock:
 542        /* We don't have a lock on this vnode and we aren't currently waiting
 543         * for one either, so ask the server for a lock.
 544         *
 545         * Note that we need to be careful if we get interrupted by a signal
 546         * after dispatching the request as we may still get the lock, even
 547         * though we don't wait for the reply (it's not too bad a problem - the
 548         * lock will expire in 5 mins anyway).
 549         */
 550        trace_afs_flock_ev(vnode, fl, afs_flock_try_to_lock, 0);
 551        vnode->lock_key = key_get(key);
 552        vnode->lock_type = type;
 553        afs_set_lock_state(vnode, AFS_VNODE_LOCK_SETTING);
 554        spin_unlock(&vnode->lock);
 555
 556        ret = afs_set_lock(vnode, key, type); /* RPC */
 557
 558        spin_lock(&vnode->lock);
 559        switch (ret) {
 560        case -EKEYREJECTED:
 561        case -EKEYEXPIRED:
 562        case -EKEYREVOKED:
 563        case -EPERM:
 564        case -EACCES:
 565                fl->fl_u.afs.state = ret;
 566                trace_afs_flock_ev(vnode, fl, afs_flock_fail_perm, ret);
 567                list_del_init(&fl->fl_u.afs.link);
 568                afs_next_locker(vnode, ret);
 569                goto error_unlock;
 570
 571        case -ENOENT:
 572                fl->fl_u.afs.state = ret;
 573                trace_afs_flock_ev(vnode, fl, afs_flock_fail_other, ret);
 574                list_del_init(&fl->fl_u.afs.link);
 575                afs_kill_lockers_enoent(vnode);
 576                goto error_unlock;
 577
 578        default:
 579                fl->fl_u.afs.state = ret;
 580                trace_afs_flock_ev(vnode, fl, afs_flock_fail_other, ret);
 581                list_del_init(&fl->fl_u.afs.link);
 582                afs_next_locker(vnode, 0);
 583                goto error_unlock;
 584
 585        case -EWOULDBLOCK:
 586                /* The server doesn't have a lock-waiting queue, so the client
 587                 * will have to retry.  The server will break the outstanding
 588                 * callbacks on a file when a lock is released.
 589                 */
 590                ASSERT(list_empty(&vnode->granted_locks));
 591                ASSERTCMP(vnode->pending_locks.next, ==, &fl->fl_u.afs.link);
 592                goto lock_is_contended;
 593
 594        case 0:
 595                afs_set_lock_state(vnode, AFS_VNODE_LOCK_GRANTED);
 596                trace_afs_flock_ev(vnode, fl, afs_flock_acquired, type);
 597                afs_grant_locks(vnode);
 598                goto vnode_is_locked_u;
 599        }
 600
 601vnode_is_locked_u:
 602        spin_unlock(&vnode->lock);
 603vnode_is_locked:
 604        /* the lock has been granted by the server... */
 605        ASSERTCMP(fl->fl_u.afs.state, ==, AFS_LOCK_GRANTED);
 606
 607skip_server_lock:
 608        /* ... but the VFS still needs to distribute access on this client. */
 609        trace_afs_flock_ev(vnode, fl, afs_flock_vfs_locking, 0);
 610        ret = locks_lock_file_wait(file, fl);
 611        trace_afs_flock_ev(vnode, fl, afs_flock_vfs_lock, ret);
 612        if (ret < 0)
 613                goto vfs_rejected_lock;
 614
 615        /* Again, make sure we've got a callback on this file and, again, make
 616         * sure that our view of the data version is up to date (we ignore
 617         * errors incurred here and deal with the consequences elsewhere).
 618         */
 619        afs_validate(vnode, key);
 620        _leave(" = 0");
 621        return 0;
 622
 623lock_is_contended:
 624        if (!(fl->fl_flags & FL_SLEEP)) {
 625                list_del_init(&fl->fl_u.afs.link);
 626                afs_next_locker(vnode, 0);
 627                ret = -EAGAIN;
 628                goto error_unlock;
 629        }
 630
 631        afs_set_lock_state(vnode, AFS_VNODE_LOCK_WAITING_FOR_CB);
 632        trace_afs_flock_ev(vnode, fl, afs_flock_would_block, ret);
 633        queue_delayed_work(afs_lock_manager, &vnode->lock_work, HZ * 5);
 634
 635need_to_wait:
 636        /* We're going to have to wait.  Either this client doesn't have a lock
 637         * on the server yet and we need to wait for a callback to occur, or
 638         * the client does have a lock on the server, but it's shared and we
 639         * need an exclusive lock.
 640         */
 641        spin_unlock(&vnode->lock);
 642
 643        trace_afs_flock_ev(vnode, fl, afs_flock_waiting, 0);
 644        ret = wait_event_interruptible(fl->fl_wait,
 645                                       fl->fl_u.afs.state != AFS_LOCK_PENDING);
 646        trace_afs_flock_ev(vnode, fl, afs_flock_waited, ret);
 647
 648        if (fl->fl_u.afs.state >= 0 && fl->fl_u.afs.state != AFS_LOCK_GRANTED) {
 649                spin_lock(&vnode->lock);
 650
 651                switch (fl->fl_u.afs.state) {
 652                case AFS_LOCK_YOUR_TRY:
 653                        fl->fl_u.afs.state = AFS_LOCK_PENDING;
 654                        goto try_to_lock;
 655                case AFS_LOCK_PENDING:
 656                        if (ret > 0) {
 657                                /* We need to retry the lock.  We may not be
 658                                 * notified by the server if it just expired
 659                                 * rather than being released.
 660                                 */
 661                                ASSERTCMP(vnode->lock_state, ==, AFS_VNODE_LOCK_WAITING_FOR_CB);
 662                                afs_set_lock_state(vnode, AFS_VNODE_LOCK_SETTING);
 663                                fl->fl_u.afs.state = AFS_LOCK_PENDING;
 664                                goto try_to_lock;
 665                        }
 666                        goto error_unlock;
 667                case AFS_LOCK_GRANTED:
 668                default:
 669                        break;
 670                }
 671
 672                spin_unlock(&vnode->lock);
 673        }
 674
 675        if (fl->fl_u.afs.state == AFS_LOCK_GRANTED)
 676                goto vnode_is_locked;
 677        ret = fl->fl_u.afs.state;
 678        goto error;
 679
 680vfs_rejected_lock:
 681        /* The VFS rejected the lock we just obtained, so we have to discard
 682         * what we just got.  We defer this to the lock manager work item to
 683         * deal with.
 684         */
 685        _debug("vfs refused %d", ret);
 686        if (no_server_lock)
 687                goto error;
 688        spin_lock(&vnode->lock);
 689        list_del_init(&fl->fl_u.afs.link);
 690        afs_defer_unlock(vnode);
 691
 692error_unlock:
 693        spin_unlock(&vnode->lock);
 694error:
 695        _leave(" = %d", ret);
 696        return ret;
 697}
 698
 699/*
 700 * unlock on a file on the server
 701 */
 702static int afs_do_unlk(struct file *file, struct file_lock *fl)
 703{
 704        struct afs_vnode *vnode = AFS_FS_I(locks_inode(file));
 705        int ret;
 706
 707        _enter("{%llx:%llu},%u", vnode->fid.vid, vnode->fid.vnode, fl->fl_type);
 708
 709        trace_afs_flock_op(vnode, fl, afs_flock_op_unlock);
 710
 711        /* Flush all pending writes before doing anything with locks. */
 712        vfs_fsync(file, 0);
 713
 714        ret = locks_lock_file_wait(file, fl);
 715        _leave(" = %d [%u]", ret, vnode->lock_state);
 716        return ret;
 717}
 718
 719/*
 720 * return information about a lock we currently hold, if indeed we hold one
 721 */
 722static int afs_do_getlk(struct file *file, struct file_lock *fl)
 723{
 724        struct afs_vnode *vnode = AFS_FS_I(locks_inode(file));
 725        struct key *key = afs_file_key(file);
 726        int ret, lock_count;
 727
 728        _enter("");
 729
 730        if (vnode->lock_state == AFS_VNODE_LOCK_DELETED)
 731                return -ENOENT;
 732
 733        fl->fl_type = F_UNLCK;
 734
 735        /* check local lock records first */
 736        posix_test_lock(file, fl);
 737        if (fl->fl_type == F_UNLCK) {
 738                /* no local locks; consult the server */
 739                ret = afs_fetch_status(vnode, key, false, NULL);
 740                if (ret < 0)
 741                        goto error;
 742
 743                lock_count = READ_ONCE(vnode->status.lock_count);
 744                if (lock_count != 0) {
 745                        if (lock_count > 0)
 746                                fl->fl_type = F_RDLCK;
 747                        else
 748                                fl->fl_type = F_WRLCK;
 749                        fl->fl_start = 0;
 750                        fl->fl_end = OFFSET_MAX;
 751                        fl->fl_pid = 0;
 752                }
 753        }
 754
 755        ret = 0;
 756error:
 757        _leave(" = %d [%hd]", ret, fl->fl_type);
 758        return ret;
 759}
 760
 761/*
 762 * manage POSIX locks on a file
 763 */
 764int afs_lock(struct file *file, int cmd, struct file_lock *fl)
 765{
 766        struct afs_vnode *vnode = AFS_FS_I(locks_inode(file));
 767        enum afs_flock_operation op;
 768        int ret;
 769
 770        _enter("{%llx:%llu},%d,{t=%x,fl=%x,r=%Ld:%Ld}",
 771               vnode->fid.vid, vnode->fid.vnode, cmd,
 772               fl->fl_type, fl->fl_flags,
 773               (long long) fl->fl_start, (long long) fl->fl_end);
 774
 775        if (IS_GETLK(cmd))
 776                return afs_do_getlk(file, fl);
 777
 778        fl->fl_u.afs.debug_id = atomic_inc_return(&afs_file_lock_debug_id);
 779        trace_afs_flock_op(vnode, fl, afs_flock_op_lock);
 780
 781        if (fl->fl_type == F_UNLCK)
 782                ret = afs_do_unlk(file, fl);
 783        else
 784                ret = afs_do_setlk(file, fl);
 785
 786        switch (ret) {
 787        case 0:         op = afs_flock_op_return_ok; break;
 788        case -EAGAIN:   op = afs_flock_op_return_eagain; break;
 789        case -EDEADLK:  op = afs_flock_op_return_edeadlk; break;
 790        default:        op = afs_flock_op_return_error; break;
 791        }
 792        trace_afs_flock_op(vnode, fl, op);
 793        return ret;
 794}
 795
 796/*
 797 * manage FLOCK locks on a file
 798 */
 799int afs_flock(struct file *file, int cmd, struct file_lock *fl)
 800{
 801        struct afs_vnode *vnode = AFS_FS_I(locks_inode(file));
 802        enum afs_flock_operation op;
 803        int ret;
 804
 805        _enter("{%llx:%llu},%d,{t=%x,fl=%x}",
 806               vnode->fid.vid, vnode->fid.vnode, cmd,
 807               fl->fl_type, fl->fl_flags);
 808
 809        /*
 810         * No BSD flocks over NFS allowed.
 811         * Note: we could try to fake a POSIX lock request here by
 812         * using ((u32) filp | 0x80000000) or some such as the pid.
 813         * Not sure whether that would be unique, though, or whether
 814         * that would break in other places.
 815         */
 816        if (!(fl->fl_flags & FL_FLOCK))
 817                return -ENOLCK;
 818
 819        fl->fl_u.afs.debug_id = atomic_inc_return(&afs_file_lock_debug_id);
 820        trace_afs_flock_op(vnode, fl, afs_flock_op_flock);
 821
 822        /* we're simulating flock() locks using posix locks on the server */
 823        if (fl->fl_type == F_UNLCK)
 824                ret = afs_do_unlk(file, fl);
 825        else
 826                ret = afs_do_setlk(file, fl);
 827
 828        switch (ret) {
 829        case 0:         op = afs_flock_op_return_ok; break;
 830        case -EAGAIN:   op = afs_flock_op_return_eagain; break;
 831        case -EDEADLK:  op = afs_flock_op_return_edeadlk; break;
 832        default:        op = afs_flock_op_return_error; break;
 833        }
 834        trace_afs_flock_op(vnode, fl, op);
 835        return ret;
 836}
 837
 838/*
 839 * the POSIX lock management core VFS code copies the lock record and adds the
 840 * copy into its own list, so we need to add that copy to the vnode's lock
 841 * queue in the same place as the original (which will be deleted shortly
 842 * after)
 843 */
 844static void afs_fl_copy_lock(struct file_lock *new, struct file_lock *fl)
 845{
 846        struct afs_vnode *vnode = AFS_FS_I(locks_inode(fl->fl_file));
 847
 848        _enter("");
 849
 850        new->fl_u.afs.debug_id = atomic_inc_return(&afs_file_lock_debug_id);
 851
 852        spin_lock(&vnode->lock);
 853        trace_afs_flock_op(vnode, new, afs_flock_op_copy_lock);
 854        list_add(&new->fl_u.afs.link, &fl->fl_u.afs.link);
 855        spin_unlock(&vnode->lock);
 856}
 857
 858/*
 859 * need to remove this lock from the vnode queue when it's removed from the
 860 * VFS's list
 861 */
 862static void afs_fl_release_private(struct file_lock *fl)
 863{
 864        struct afs_vnode *vnode = AFS_FS_I(locks_inode(fl->fl_file));
 865
 866        _enter("");
 867
 868        spin_lock(&vnode->lock);
 869
 870        trace_afs_flock_op(vnode, fl, afs_flock_op_release_lock);
 871        list_del_init(&fl->fl_u.afs.link);
 872        if (list_empty(&vnode->granted_locks))
 873                afs_defer_unlock(vnode);
 874
 875        _debug("state %u for %p", vnode->lock_state, vnode);
 876        spin_unlock(&vnode->lock);
 877}
 878