ktime: Get rid of the union
[linux-2.6-block.git] / fs / nfs / flexfilelayout / flexfilelayout.c
index ef4c9d17d4a5a1b292268f051bed1de14757b12a..c98f6db9aa6bdd6ccb89d016a1b744ff92dff595 100644 (file)
@@ -619,12 +619,11 @@ nfs4_ff_layoutstat_start_io(struct nfs4_ff_layout_mirror *mirror,
                            struct nfs4_ff_layoutstat *layoutstat,
                            ktime_t now)
 {
-       static const ktime_t notime = {0};
        s64 report_interval = FF_LAYOUTSTATS_REPORT_INTERVAL;
        struct nfs4_flexfile_layout *ffl = FF_LAYOUT_FROM_HDR(mirror->layout);
 
        nfs4_ff_start_busy_timer(&layoutstat->busy_timer, now);
-       if (ktime_equal(mirror->start_time, notime))
+       if (ktime_equal(mirror->start_time, 0))
                mirror->start_time = now;
        if (mirror->report_interval != 0)
                report_interval = (s64)mirror->report_interval * 1000LL;
@@ -1126,7 +1125,8 @@ static int ff_layout_async_handle_error_v4(struct rpc_task *task,
        case -EPIPE:
                dprintk("%s DS connection error %d\n", __func__,
                        task->tk_status);
-               nfs4_mark_deviceid_unavailable(devid);
+               nfs4_delete_deviceid(devid->ld, devid->nfs_client,
+                               &devid->deviceid);
                rpc_wake_up(&tbl->slot_tbl_waitq);
                /* fall through */
        default:
@@ -1175,7 +1175,8 @@ static int ff_layout_async_handle_error_v3(struct rpc_task *task,
        default:
                dprintk("%s DS connection error %d\n", __func__,
                        task->tk_status);
-               nfs4_mark_deviceid_unavailable(devid);
+               nfs4_delete_deviceid(devid->ld, devid->nfs_client,
+                               &devid->deviceid);
        }
        /* FIXME: Need to prevent infinite looping here. */
        return -NFS4ERR_RESET_TO_PNFS;
@@ -1946,8 +1947,7 @@ ff_layout_free_deviceid_node(struct nfs4_deviceid_node *d)
                                                  id_node));
 }
 
-static int ff_layout_encode_ioerr(struct nfs4_flexfile_layout *flo,
-                                 struct xdr_stream *xdr,
+static int ff_layout_encode_ioerr(struct xdr_stream *xdr,
                                  const struct nfs4_layoutreturn_args *args,
                                  const struct nfs4_flexfile_layoutreturn_args *ff_args)
 {
@@ -2049,18 +2049,29 @@ ff_layout_encode_layoutreturn(struct xdr_stream *xdr,
                const struct nfs4_xdr_opaque_data *ff_opaque)
 {
        const struct nfs4_layoutreturn_args *args = voidargs;
-       struct pnfs_layout_hdr *lo = args->layout;
-       struct nfs4_flexfile_layout *flo = FF_LAYOUT_FROM_HDR(lo);
+       struct nfs4_flexfile_layoutreturn_args *ff_args = ff_opaque->data;
+       struct xdr_buf tmp_buf = {
+               .head = {
+                       [0] = {
+                               .iov_base = page_address(ff_args->pages[0]),
+                       },
+               },
+               .buflen = PAGE_SIZE,
+       };
+       struct xdr_stream tmp_xdr;
        __be32 *start;
 
        dprintk("%s: Begin\n", __func__);
-       start = xdr_reserve_space(xdr, 4);
-       BUG_ON(!start);
 
-       ff_layout_encode_ioerr(flo, xdr, args, ff_opaque->data);
-       ff_layout_encode_iostats_array(xdr, args, ff_opaque->data);
+       xdr_init_encode(&tmp_xdr, &tmp_buf, NULL);
+
+       ff_layout_encode_ioerr(&tmp_xdr, args, ff_args);
+       ff_layout_encode_iostats_array(&tmp_xdr, args, ff_args);
+
+       start = xdr_reserve_space(xdr, 4);
+       *start = cpu_to_be32(tmp_buf.len);
+       xdr_write_pages(xdr, ff_args->pages, 0, tmp_buf.len);
 
-       *start = cpu_to_be32((xdr->p - start - 1) * 4);
        dprintk("%s: Return\n", __func__);
 }
 
@@ -2077,6 +2088,7 @@ ff_layout_free_layoutreturn(struct nfs4_xdr_opaque_data *args)
        ff_layout_free_ds_ioerr(&ff_args->errors);
        ff_layout_free_iostats_array(ff_args->devinfo, ff_args->num_dev);
 
+       put_page(ff_args->pages[0]);
        kfree(ff_args);
 }
 
@@ -2093,7 +2105,10 @@ ff_layout_prepare_layoutreturn(struct nfs4_layoutreturn_args *args)
 
        ff_args = kmalloc(sizeof(*ff_args), GFP_KERNEL);
        if (!ff_args)
-               return -ENOMEM;
+               goto out_nomem;
+       ff_args->pages[0] = alloc_page(GFP_KERNEL);
+       if (!ff_args->pages[0])
+               goto out_nomem_free;
 
        INIT_LIST_HEAD(&ff_args->errors);
        ff_args->num_errors = ff_layout_fetch_ds_ioerr(args->layout,
@@ -2108,6 +2123,10 @@ ff_layout_prepare_layoutreturn(struct nfs4_layoutreturn_args *args)
        args->ld_private->ops = &layoutreturn_ops;
        args->ld_private->data = ff_args;
        return 0;
+out_nomem_free:
+       kfree(ff_args);
+out_nomem:
+       return -ENOMEM;
 }
 
 static int