Merge tag 'nfs-for-5.20-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
[linux-2.6-microblaze.git] / fs / nfs / direct.c
index c275c83..1707f46 100644 (file)
 #include "iostat.h"
 #include "pnfs.h"
 #include "fscache.h"
+#include "nfstrace.h"
 
 #define NFSDBG_FACILITY                NFSDBG_VFS
 
 static struct kmem_cache *nfs_direct_cachep;
 
-struct nfs_direct_req {
-       struct kref             kref;           /* release manager */
-
-       /* I/O parameters */
-       struct nfs_open_context *ctx;           /* file open context info */
-       struct nfs_lock_context *l_ctx;         /* Lock context info */
-       struct kiocb *          iocb;           /* controlling i/o request */
-       struct inode *          inode;          /* target file of i/o */
-
-       /* completion state */
-       atomic_t                io_count;       /* i/os we're waiting for */
-       spinlock_t              lock;           /* protect completion state */
-
-       loff_t                  io_start;       /* Start offset for I/O */
-       ssize_t                 count,          /* bytes actually processed */
-                               max_count,      /* max expected count */
-                               bytes_left,     /* bytes left to be sent */
-                               error;          /* any reported error */
-       struct completion       completion;     /* wait for i/o completion */
-
-       /* commit state */
-       struct nfs_mds_commit_info mds_cinfo;   /* Storage for cinfo */
-       struct pnfs_ds_commit_info ds_cinfo;    /* Storage for cinfo */
-       struct work_struct      work;
-       int                     flags;
-       /* for write */
-#define NFS_ODIRECT_DO_COMMIT          (1)     /* an unstable reply was received */
-#define NFS_ODIRECT_RESCHED_WRITES     (2)     /* write verification failed */
-       /* for read */
-#define NFS_ODIRECT_SHOULD_DIRTY       (3)     /* dirty user-space page after read */
-#define NFS_ODIRECT_DONE               INT_MAX /* write verification failed */
-};
-
 static const struct nfs_pgio_completion_ops nfs_direct_write_completion_ops;
 static const struct nfs_commit_completion_ops nfs_direct_commit_completion_ops;
 static void nfs_direct_write_complete(struct nfs_direct_req *dreq);
@@ -594,14 +562,17 @@ static void nfs_direct_commit_complete(struct nfs_commit_data *data)
        struct nfs_page *req;
        int status = data->task.tk_status;
 
+       trace_nfs_direct_commit_complete(dreq);
+
        if (status < 0) {
                /* Errors in commit are fatal */
                dreq->error = status;
                dreq->max_count = 0;
                dreq->count = 0;
                dreq->flags = NFS_ODIRECT_DONE;
-       } else if (dreq->flags == NFS_ODIRECT_DONE)
+       } else {
                status = dreq->error;
+       }
 
        nfs_init_cinfo_from_dreq(&cinfo, dreq);
 
@@ -630,6 +601,8 @@ static void nfs_direct_resched_write(struct nfs_commit_info *cinfo,
 {
        struct nfs_direct_req *dreq = cinfo->dreq;
 
+       trace_nfs_direct_resched_write(dreq);
+
        spin_lock(&dreq->lock);
        if (dreq->flags != NFS_ODIRECT_DONE)
                dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
@@ -694,6 +667,7 @@ static void nfs_direct_write_schedule_work(struct work_struct *work)
 
 static void nfs_direct_write_complete(struct nfs_direct_req *dreq)
 {
+       trace_nfs_direct_write_complete(dreq);
        queue_work(nfsiod_workqueue, &dreq->work); /* Calls nfs_direct_write_schedule_work */
 }
 
@@ -704,6 +678,8 @@ static void nfs_direct_write_completion(struct nfs_pgio_header *hdr)
        struct nfs_page *req = nfs_list_entry(hdr->pages.next);
        int flags = NFS_ODIRECT_DONE;
 
+       trace_nfs_direct_write_completion(dreq);
+
        nfs_init_cinfo_from_dreq(&cinfo, dreq);
 
        spin_lock(&dreq->lock);
@@ -713,7 +689,7 @@ static void nfs_direct_write_completion(struct nfs_pgio_header *hdr)
        }
 
        nfs_direct_count_bytes(dreq, hdr);
-       if (hdr->good_bytes != 0 && nfs_write_need_commit(hdr)) {
+       if (test_bit(NFS_IOHDR_UNSTABLE_WRITES, &hdr->flags)) {
                if (!dreq->flags)
                        dreq->flags = NFS_ODIRECT_DO_COMMIT;
                flags = dreq->flags;
@@ -758,6 +734,8 @@ static void nfs_direct_write_reschedule_io(struct nfs_pgio_header *hdr)
 {
        struct nfs_direct_req *dreq = hdr->dreq;
 
+       trace_nfs_direct_write_reschedule_io(dreq);
+
        spin_lock(&dreq->lock);
        if (dreq->error == 0) {
                dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
@@ -798,6 +776,8 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
        size_t requested_bytes = 0;
        size_t wsize = max_t(size_t, NFS_SERVER(inode)->wsize, PAGE_SIZE);
 
+       trace_nfs_direct_write_schedule_iovec(dreq);
+
        nfs_pageio_init_write(&desc, inode, ioflags, false,
                              &nfs_direct_write_completion_ops);
        desc.pg_dreq = dreq;