pnfs-obj: report errors and .encode_layoutreturn Implementation.
[pandora-kernel.git] / fs / nfs / objlayout / objlayout.h
index 0814271..b0bb975 100644 (file)
 #include <linux/pnfs_osd_xdr.h>
 #include "../pnfs.h"
 
+/*
+ * per-inode layout
+ */
+struct objlayout {
+       struct pnfs_layout_hdr pnfs_layout;
+
+        /* for layout_return */
+       spinlock_t lock;
+       struct list_head err_list;
+};
+
+static inline struct objlayout *
+OBJLAYOUT(struct pnfs_layout_hdr *lo)
+{
+       return container_of(lo, struct objlayout, pnfs_layout);
+}
+
+/*
+ * per-I/O operation state
+ * embedded in objects provider io_state data structure
+ */
+struct objlayout_io_state {
+       struct pnfs_layout_segment *lseg;
+
+       struct page **pages;
+       unsigned pgbase;
+       unsigned nr_pages;
+       unsigned long count;
+       loff_t offset;
+       bool sync;
+
+       void *rpcdata;
+       int status;             /* res */
+       int eof;                /* res */
+       int committed;          /* res */
+
+       /* Error reporting (layout_return) */
+       struct list_head err_list;
+       unsigned num_comps;
+       /* Pointer to array of error descriptors of size num_comps.
+        * It should contain as many entries as devices in the osd_layout
+        * that participate in the I/O. It is up to the io_engine to allocate
+        * needed space and set num_comps.
+        */
+       struct pnfs_osd_ioerr *ioerrs;
+};
+
 /*
  * Raid engine I/O API
  */
@@ -55,9 +102,28 @@ extern int objio_alloc_lseg(struct pnfs_layout_segment **outp,
        gfp_t gfp_flags);
 extern void objio_free_lseg(struct pnfs_layout_segment *lseg);
 
+extern int objio_alloc_io_state(
+       struct pnfs_layout_segment *lseg,
+       struct objlayout_io_state **outp,
+       gfp_t gfp_flags);
+extern void objio_free_io_state(struct objlayout_io_state *state);
+
+extern ssize_t objio_read_pagelist(struct objlayout_io_state *ol_state);
+extern ssize_t objio_write_pagelist(struct objlayout_io_state *ol_state,
+                                   bool stable);
+
 /*
  * callback API
  */
+extern void objlayout_io_set_result(struct objlayout_io_state *state,
+                       unsigned index, struct pnfs_osd_objid *pooid,
+                       int osd_error, u64 offset, u64 length, bool is_write);
+
+extern void objlayout_read_done(struct objlayout_io_state *state,
+                               ssize_t status, bool sync);
+extern void objlayout_write_done(struct objlayout_io_state *state,
+                                ssize_t status, bool sync);
+
 extern int objlayout_get_deviceinfo(struct pnfs_layout_hdr *pnfslay,
        struct nfs4_deviceid *d_id, struct pnfs_osd_deviceaddr **deviceaddr,
        gfp_t gfp_flags);
@@ -66,10 +132,26 @@ extern void objlayout_put_deviceinfo(struct pnfs_osd_deviceaddr *deviceaddr);
 /*
  * exported generic objects function vectors
  */
+
+extern struct pnfs_layout_hdr *objlayout_alloc_layout_hdr(struct inode *, gfp_t gfp_flags);
+extern void objlayout_free_layout_hdr(struct pnfs_layout_hdr *);
+
 extern struct pnfs_layout_segment *objlayout_alloc_lseg(
        struct pnfs_layout_hdr *,
        struct nfs4_layoutget_res *,
        gfp_t gfp_flags);
 extern void objlayout_free_lseg(struct pnfs_layout_segment *);
 
+extern enum pnfs_try_status objlayout_read_pagelist(
+       struct nfs_read_data *);
+
+extern enum pnfs_try_status objlayout_write_pagelist(
+       struct nfs_write_data *,
+       int how);
+
+extern void objlayout_encode_layoutreturn(
+       struct pnfs_layout_hdr *,
+       struct xdr_stream *,
+       const struct nfs4_layoutreturn_args *);
+
 #endif /* _OBJLAYOUT_H */