]> git.ipfire.org Git - thirdparty/linux.git/blobdiff - fs/nfsd/nfs4state.c
Merge tag 'nfsd-6.9-2' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux
[thirdparty/linux.git] / fs / nfsd / nfs4state.c
index 3cef81e196c6862f0577090b18499e4f379204fd..84d4093ca71317ebb7a70bde76819704e25ec7dc 100644 (file)
@@ -1257,7 +1257,7 @@ static void nfs4_unlock_deleg_lease(struct nfs4_delegation *dp)
 
        WARN_ON_ONCE(!fp->fi_delegees);
 
-       vfs_setlease(nf->nf_file, F_UNLCK, NULL, (void **)&dp);
+       kernel_setlease(nf->nf_file, F_UNLCK, NULL, (void **)&dp);
        put_deleg_file(fp);
 }
 
@@ -5200,9 +5200,9 @@ static void nfsd_break_one_deleg(struct nfs4_delegation *dp)
 
 /* Called from break_lease() with flc_lock held. */
 static bool
-nfsd_break_deleg_cb(struct file_lock *fl)
+nfsd_break_deleg_cb(struct file_lease *fl)
 {
-       struct nfs4_delegation *dp = (struct nfs4_delegation *)fl->fl_owner;
+       struct nfs4_delegation *dp = (struct nfs4_delegation *) fl->c.flc_owner;
        struct nfs4_file *fp = dp->dl_stid.sc_file;
        struct nfs4_client *clp = dp->dl_stid.sc_client;
        struct nfsd_net *nn;
@@ -5236,9 +5236,9 @@ nfsd_break_deleg_cb(struct file_lock *fl)
  *   %true: Lease conflict was resolved
  *   %false: Lease conflict was not resolved.
  */
-static bool nfsd_breaker_owns_lease(struct file_lock *fl)
+static bool nfsd_breaker_owns_lease(struct file_lease *fl)
 {
-       struct nfs4_delegation *dl = fl->fl_owner;
+       struct nfs4_delegation *dl = fl->c.flc_owner;
        struct svc_rqst *rqst;
        struct nfs4_client *clp;
 
@@ -5253,10 +5253,10 @@ static bool nfsd_breaker_owns_lease(struct file_lock *fl)
 }
 
 static int
-nfsd_change_deleg_cb(struct file_lock *onlist, int arg,
+nfsd_change_deleg_cb(struct file_lease *onlist, int arg,
                     struct list_head *dispose)
 {
-       struct nfs4_delegation *dp = (struct nfs4_delegation *)onlist->fl_owner;
+       struct nfs4_delegation *dp = (struct nfs4_delegation *) onlist->c.flc_owner;
        struct nfs4_client *clp = dp->dl_stid.sc_client;
 
        if (arg & F_UNLCK) {
@@ -5267,7 +5267,7 @@ nfsd_change_deleg_cb(struct file_lock *onlist, int arg,
                return -EAGAIN;
 }
 
-static const struct lock_manager_operations nfsd_lease_mng_ops = {
+static const struct lease_manager_operations nfsd_lease_mng_ops = {
        .lm_breaker_owns_lease = nfsd_breaker_owns_lease,
        .lm_break = nfsd_break_deleg_cb,
        .lm_change = nfsd_change_deleg_cb,
@@ -5612,21 +5612,20 @@ static bool nfsd4_cb_channel_good(struct nfs4_client *clp)
        return clp->cl_minorversion && clp->cl_cb_state == NFSD4_CB_UNKNOWN;
 }
 
-static struct file_lock *nfs4_alloc_init_lease(struct nfs4_delegation *dp,
+static struct file_lease *nfs4_alloc_init_lease(struct nfs4_delegation *dp,
                                                int flag)
 {
-       struct file_lock *fl;
+       struct file_lease *fl;
 
-       fl = locks_alloc_lock();
+       fl = locks_alloc_lease();
        if (!fl)
                return NULL;
        fl->fl_lmops = &nfsd_lease_mng_ops;
-       fl->fl_flags = FL_DELEG;
-       fl->fl_type = flag == NFS4_OPEN_DELEGATE_READ? F_RDLCK: F_WRLCK;
-       fl->fl_end = OFFSET_MAX;
-       fl->fl_owner = (fl_owner_t)dp;
-       fl->fl_pid = current->tgid;
-       fl->fl_file = dp->dl_stid.sc_file->fi_deleg_file->nf_file;
+       fl->c.flc_flags = FL_DELEG;
+       fl->c.flc_type = flag == NFS4_OPEN_DELEGATE_READ? F_RDLCK: F_WRLCK;
+       fl->c.flc_owner = (fl_owner_t)dp;
+       fl->c.flc_pid = current->tgid;
+       fl->c.flc_file = dp->dl_stid.sc_file->fi_deleg_file->nf_file;
        return fl;
 }
 
@@ -5744,7 +5743,7 @@ nfs4_set_delegation(struct nfsd4_open *open, struct nfs4_ol_stateid *stp,
        struct nfs4_clnt_odstate *odstate = stp->st_clnt_odstate;
        struct nfs4_delegation *dp;
        struct nfsd_file *nf = NULL;
-       struct file_lock *fl;
+       struct file_lease *fl;
        u32 dl_type;
 
        /*
@@ -5814,9 +5813,10 @@ nfs4_set_delegation(struct nfsd4_open *open, struct nfs4_ol_stateid *stp,
        if (!fl)
                goto out_clnt_odstate;
 
-       status = vfs_setlease(fp->fi_deleg_file->nf_file, fl->fl_type, &fl, NULL);
+       status = kernel_setlease(fp->fi_deleg_file->nf_file,
+                                     fl->c.flc_type, &fl, NULL);
        if (fl)
-               locks_free_lock(fl);
+               locks_free_lease(fl);
        if (status)
                goto out_clnt_odstate;
 
@@ -5855,7 +5855,7 @@ nfs4_set_delegation(struct nfsd4_open *open, struct nfs4_ol_stateid *stp,
 
        return dp;
 out_unlock:
-       vfs_setlease(fp->fi_deleg_file->nf_file, F_UNLCK, NULL, (void **)&dp);
+       kernel_setlease(fp->fi_deleg_file->nf_file, F_UNLCK, NULL, (void **)&dp);
 out_clnt_odstate:
        put_clnt_odstate(dp->dl_clnt_odstate);
        nfs4_put_stid(&dp->dl_stid);
@@ -7509,7 +7509,7 @@ nfsd4_lm_put_owner(fl_owner_t owner)
 static bool
 nfsd4_lm_lock_expirable(struct file_lock *cfl)
 {
-       struct nfs4_lockowner *lo = (struct nfs4_lockowner *)cfl->fl_owner;
+       struct nfs4_lockowner *lo = (struct nfs4_lockowner *) cfl->c.flc_owner;
        struct nfs4_client *clp = lo->lo_owner.so_client;
        struct nfsd_net *nn;
 
@@ -7531,7 +7531,7 @@ nfsd4_lm_expire_lock(void)
 static void
 nfsd4_lm_notify(struct file_lock *fl)
 {
-       struct nfs4_lockowner           *lo = (struct nfs4_lockowner *)fl->fl_owner;
+       struct nfs4_lockowner           *lo = (struct nfs4_lockowner *) fl->c.flc_owner;
        struct net                      *net = lo->lo_owner.so_client->net;
        struct nfsd_net                 *nn = net_generic(net, nfsd_net_id);
        struct nfsd4_blocked_lock       *nbl = container_of(fl,
@@ -7568,7 +7568,7 @@ nfs4_set_lock_denied(struct file_lock *fl, struct nfsd4_lock_denied *deny)
        struct nfs4_lockowner *lo;
 
        if (fl->fl_lmops == &nfsd_posix_mng_ops) {
-               lo = (struct nfs4_lockowner *) fl->fl_owner;
+               lo = (struct nfs4_lockowner *) fl->c.flc_owner;
                xdr_netobj_dup(&deny->ld_owner, &lo->lo_owner.so_owner,
                                                GFP_KERNEL);
                if (!deny->ld_owner.data)
@@ -7587,7 +7587,7 @@ nevermind:
        if (fl->fl_end != NFS4_MAX_UINT64)
                deny->ld_length = fl->fl_end - fl->fl_start + 1;        
        deny->ld_type = NFS4_READ_LT;
-       if (fl->fl_type != F_RDLCK)
+       if (fl->c.flc_type != F_RDLCK)
                deny->ld_type = NFS4_WRITE_LT;
 }
 
@@ -7853,8 +7853,8 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        int lkflg;
        int err;
        bool new = false;
-       unsigned char fl_type;
-       unsigned int fl_flags = FL_POSIX;
+       unsigned char type;
+       unsigned int flags = FL_POSIX;
        struct net *net = SVC_NET(rqstp);
        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
 
@@ -7918,14 +7918,14 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                goto out;
 
        if (lock->lk_reclaim)
-               fl_flags |= FL_RECLAIM;
+               flags |= FL_RECLAIM;
 
        fp = lock_stp->st_stid.sc_file;
        switch (lock->lk_type) {
                case NFS4_READW_LT:
                        if (nfsd4_has_session(cstate) ||
                            exportfs_lock_op_is_async(sb->s_export_op))
-                               fl_flags |= FL_SLEEP;
+                               flags |= FL_SLEEP;
                        fallthrough;
                case NFS4_READ_LT:
                        spin_lock(&fp->fi_lock);
@@ -7933,12 +7933,12 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                        if (nf)
                                get_lock_access(lock_stp, NFS4_SHARE_ACCESS_READ);
                        spin_unlock(&fp->fi_lock);
-                       fl_type = F_RDLCK;
+                       type = F_RDLCK;
                        break;
                case NFS4_WRITEW_LT:
                        if (nfsd4_has_session(cstate) ||
                            exportfs_lock_op_is_async(sb->s_export_op))
-                               fl_flags |= FL_SLEEP;
+                               flags |= FL_SLEEP;
                        fallthrough;
                case NFS4_WRITE_LT:
                        spin_lock(&fp->fi_lock);
@@ -7946,7 +7946,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                        if (nf)
                                get_lock_access(lock_stp, NFS4_SHARE_ACCESS_WRITE);
                        spin_unlock(&fp->fi_lock);
-                       fl_type = F_WRLCK;
+                       type = F_WRLCK;
                        break;
                default:
                        status = nfserr_inval;
@@ -7966,7 +7966,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
         * on those filesystems:
         */
        if (!exportfs_lock_op_is_async(sb->s_export_op))
-               fl_flags &= ~FL_SLEEP;
+               flags &= ~FL_SLEEP;
 
        nbl = find_or_allocate_block(lock_sop, &fp->fi_fhandle, nn);
        if (!nbl) {
@@ -7976,11 +7976,11 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        }
 
        file_lock = &nbl->nbl_lock;
-       file_lock->fl_type = fl_type;
-       file_lock->fl_owner = (fl_owner_t)lockowner(nfs4_get_stateowner(&lock_sop->lo_owner));
-       file_lock->fl_pid = current->tgid;
-       file_lock->fl_file = nf->nf_file;
-       file_lock->fl_flags = fl_flags;
+       file_lock->c.flc_type = type;
+       file_lock->c.flc_owner = (fl_owner_t)lockowner(nfs4_get_stateowner(&lock_sop->lo_owner));
+       file_lock->c.flc_pid = current->tgid;
+       file_lock->c.flc_file = nf->nf_file;
+       file_lock->c.flc_flags = flags;
        file_lock->fl_lmops = &nfsd_posix_mng_ops;
        file_lock->fl_start = lock->lk_offset;
        file_lock->fl_end = last_byte_offset(lock->lk_offset, lock->lk_length);
@@ -7993,7 +7993,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                goto out;
        }
 
-       if (fl_flags & FL_SLEEP) {
+       if (flags & FL_SLEEP) {
                nbl->nbl_time = ktime_get_boottime_seconds();
                spin_lock(&nn->blocked_locks_lock);
                list_add_tail(&nbl->nbl_list, &lock_sop->lo_blocked);
@@ -8030,7 +8030,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
 out:
        if (nbl) {
                /* dequeue it if we queued it before */
-               if (fl_flags & FL_SLEEP) {
+               if (flags & FL_SLEEP) {
                        spin_lock(&nn->blocked_locks_lock);
                        if (!list_empty(&nbl->nbl_list) &&
                            !list_empty(&nbl->nbl_lru)) {
@@ -8098,9 +8098,9 @@ static __be32 nfsd_test_lock(struct svc_rqst *rqstp, struct svc_fh *fhp, struct
        err = nfserrno(nfsd_open_break_lease(inode, NFSD_MAY_READ));
        if (err)
                goto out;
-       lock->fl_file = nf->nf_file;
+       lock->c.flc_file = nf->nf_file;
        err = nfserrno(vfs_test_lock(nf->nf_file, lock));
-       lock->fl_file = NULL;
+       lock->c.flc_file = NULL;
 out:
        inode_unlock(inode);
        nfsd_file_put(nf);
@@ -8145,11 +8145,11 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        switch (lockt->lt_type) {
                case NFS4_READ_LT:
                case NFS4_READW_LT:
-                       file_lock->fl_type = F_RDLCK;
+                       file_lock->c.flc_type = F_RDLCK;
                        break;
                case NFS4_WRITE_LT:
                case NFS4_WRITEW_LT:
-                       file_lock->fl_type = F_WRLCK;
+                       file_lock->c.flc_type = F_WRLCK;
                        break;
                default:
                        dprintk("NFSD: nfs4_lockt: bad lock type!\n");
@@ -8159,9 +8159,9 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
 
        lo = find_lockowner_str(cstate->clp, &lockt->lt_owner);
        if (lo)
-               file_lock->fl_owner = (fl_owner_t)lo;
-       file_lock->fl_pid = current->tgid;
-       file_lock->fl_flags = FL_POSIX;
+               file_lock->c.flc_owner = (fl_owner_t)lo;
+       file_lock->c.flc_pid = current->tgid;
+       file_lock->c.flc_flags = FL_POSIX;
 
        file_lock->fl_start = lockt->lt_offset;
        file_lock->fl_end = last_byte_offset(lockt->lt_offset, lockt->lt_length);
@@ -8172,7 +8172,7 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        if (status)
                goto out;
 
-       if (file_lock->fl_type != F_UNLCK) {
+       if (file_lock->c.flc_type != F_UNLCK) {
                status = nfserr_denied;
                nfs4_set_lock_denied(file_lock, &lockt->lt_denied);
        }
@@ -8228,11 +8228,11 @@ nfsd4_locku(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                goto put_file;
        }
 
-       file_lock->fl_type = F_UNLCK;
-       file_lock->fl_owner = (fl_owner_t)lockowner(nfs4_get_stateowner(stp->st_stateowner));
-       file_lock->fl_pid = current->tgid;
-       file_lock->fl_file = nf->nf_file;
-       file_lock->fl_flags = FL_POSIX;
+       file_lock->c.flc_type = F_UNLCK;
+       file_lock->c.flc_owner = (fl_owner_t)lockowner(nfs4_get_stateowner(stp->st_stateowner));
+       file_lock->c.flc_pid = current->tgid;
+       file_lock->c.flc_file = nf->nf_file;
+       file_lock->c.flc_flags = FL_POSIX;
        file_lock->fl_lmops = &nfsd_posix_mng_ops;
        file_lock->fl_start = locku->lu_offset;
 
@@ -8289,8 +8289,8 @@ check_for_locks(struct nfs4_file *fp, struct nfs4_lockowner *lowner)
 
        if (flctx && !list_empty_careful(&flctx->flc_posix)) {
                spin_lock(&flctx->flc_lock);
-               list_for_each_entry(fl, &flctx->flc_posix, fl_list) {
-                       if (fl->fl_owner == (fl_owner_t)lowner) {
+               for_each_file_lock(fl, &flctx->flc_posix) {
+                       if (fl->c.flc_owner == (fl_owner_t)lowner) {
                                status = true;
                                break;
                        }
@@ -8813,7 +8813,7 @@ nfsd4_deleg_getattr_conflict(struct svc_rqst *rqstp, struct inode *inode,
        __be32 status;
        struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
        struct file_lock_context *ctx;
-       struct file_lock *fl;
+       struct file_lease *fl;
        struct nfs4_delegation *dp;
        struct iattr attrs;
        struct nfs4_cb_fattr *ncf;
@@ -8823,8 +8823,10 @@ nfsd4_deleg_getattr_conflict(struct svc_rqst *rqstp, struct inode *inode,
        if (!ctx)
                return 0;
        spin_lock(&ctx->flc_lock);
-       list_for_each_entry(fl, &ctx->flc_lease, fl_list) {
-               if (fl->fl_flags == FL_LAYOUT)
+       for_each_file_lock(fl, &ctx->flc_lease) {
+               unsigned char type = fl->c.flc_type;
+
+               if (fl->c.flc_flags == FL_LAYOUT)
                        continue;
                if (fl->fl_lmops != &nfsd_lease_mng_ops) {
                        /*
@@ -8832,19 +8834,19 @@ nfsd4_deleg_getattr_conflict(struct svc_rqst *rqstp, struct inode *inode,
                         * we are done; there isn't any write delegation
                         * on this inode
                         */
-                       if (fl->fl_type == F_RDLCK)
+                       if (type == F_RDLCK)
                                break;
                        goto break_lease;
                }
-               if (fl->fl_type == F_WRLCK) {
-                       dp = fl->fl_owner;
+               if (type == F_WRLCK) {
+                       dp = fl->c.flc_owner;
                        if (dp->dl_recall.cb_clp == *(rqstp->rq_lease_breaker)) {
                                spin_unlock(&ctx->flc_lock);
                                return 0;
                        }
 break_lease:
                        nfsd_stats_wdeleg_getattr_inc(nn);
-                       dp = fl->fl_owner;
+                       dp = fl->c.flc_owner;
                        ncf = &dp->dl_cb_fattr;
                        nfs4_cb_getattr(&dp->dl_cb_fattr);
                        spin_unlock(&ctx->flc_lock);