]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - fs/nfs/pnfs.c
Merge tag 'mvebu-fixes-4.14-3' of git://git.infradead.org/linux-mvebu into fixes
[mirror_ubuntu-bionic-kernel.git] / fs / nfs / pnfs.c
index c383d0913b54c90fb96020a62faaf989a5d946b3..3bcd669a315237158dea7505bde6fd9f9dcfcec6 100644 (file)
@@ -529,47 +529,6 @@ pnfs_put_lseg(struct pnfs_layout_segment *lseg)
 }
 EXPORT_SYMBOL_GPL(pnfs_put_lseg);
 
-static void pnfs_free_lseg_async_work(struct work_struct *work)
-{
-       struct pnfs_layout_segment *lseg;
-       struct pnfs_layout_hdr *lo;
-
-       lseg = container_of(work, struct pnfs_layout_segment, pls_work);
-       lo = lseg->pls_layout;
-
-       pnfs_free_lseg(lseg);
-       pnfs_put_layout_hdr(lo);
-}
-
-static void pnfs_free_lseg_async(struct pnfs_layout_segment *lseg)
-{
-       INIT_WORK(&lseg->pls_work, pnfs_free_lseg_async_work);
-       schedule_work(&lseg->pls_work);
-}
-
-void
-pnfs_put_lseg_locked(struct pnfs_layout_segment *lseg)
-{
-       if (!lseg)
-               return;
-
-       assert_spin_locked(&lseg->pls_layout->plh_inode->i_lock);
-
-       dprintk("%s: lseg %p ref %d valid %d\n", __func__, lseg,
-               atomic_read(&lseg->pls_refcount),
-               test_bit(NFS_LSEG_VALID, &lseg->pls_flags));
-       if (atomic_dec_and_test(&lseg->pls_refcount)) {
-               struct pnfs_layout_hdr *lo = lseg->pls_layout;
-               if (test_bit(NFS_LSEG_VALID, &lseg->pls_flags))
-                       return;
-               pnfs_layout_remove_lseg(lo, lseg);
-               if (!pnfs_cache_lseg_for_layoutreturn(lo, lseg)) {
-                       pnfs_get_layout_hdr(lo);
-                       pnfs_free_lseg_async(lseg);
-               }
-       }
-}
-
 /*
  * is l2 fully contained in l1?
  *   start1                             end1
@@ -1705,7 +1664,7 @@ pnfs_update_layout(struct inode *ino,
                .offset = pos,
                .length = count,
        };
-       unsigned pg_offset, seq;
+       unsigned pg_offset;
        struct nfs_server *server = NFS_SERVER(ino);
        struct nfs_client *clp = server->nfs_client;
        struct pnfs_layout_hdr *lo = NULL;
@@ -1795,10 +1754,14 @@ lookup_again:
                }
 
                first = true;
-               do {
-                       seq = read_seqbegin(&ctx->state->seqlock);
-                       nfs4_stateid_copy(&stateid, &ctx->state->stateid);
-               } while (read_seqretry(&ctx->state->seqlock, seq));
+               if (nfs4_select_rw_stateid(ctx->state,
+                                       iomode == IOMODE_RW ? FMODE_WRITE : FMODE_READ,
+                                       NULL, &stateid, NULL) != 0) {
+                       trace_pnfs_update_layout(ino, pos, count,
+                                       iomode, lo, lseg,
+                                       PNFS_UPDATE_LAYOUT_INVALID_OPEN);
+                       goto out_unlock;
+               }
        } else {
                nfs4_stateid_copy(&stateid, &lo->plh_stateid);
        }
@@ -2274,7 +2237,6 @@ pnfs_write_through_mds(struct nfs_pageio_descriptor *desc,
                nfs_pageio_reset_write_mds(desc);
                mirror->pg_recoalesce = 1;
        }
-       nfs_pgio_data_destroy(hdr);
        hdr->release(hdr);
 }
 
@@ -2398,7 +2360,6 @@ pnfs_read_through_mds(struct nfs_pageio_descriptor *desc,
                nfs_pageio_reset_read_mds(desc);
                mirror->pg_recoalesce = 1;
        }
-       nfs_pgio_data_destroy(hdr);
        hdr->release(hdr);
 }