char *pbuf1;
};
-
-
+static inline int obd_check_conn(struct obd_conn *conn)
+{
+ struct obd_device *obd;
+ if (!conn) {
+ printk("obd_check_conn: NULL conn\n");
+ return -ENOTCONN;
+ }
+ obd = conn->oc_dev;
+ if (!obd) {
+ printk("obd_check_conn: NULL obd\n");
+ return -ENODEV;
+ }
+
+ if (!obd->obd_flags & OBD_ATTACHED ) {
+ printk("obd_check_conn: obd %d not attached\n", obd->obd_minor);
+ return -ENODEV;
+ }
+
+ if (!obd->obd_flags & OBD_SET_UP) {
+ printk("obd_check_conn: obd %d not setup\n", obd->obd_minor);
+ return -ENODEV;
+ }
+
+ if (!obd->obd_type) {
+ printk("obd_check_conn: obd %d not typed\n", obd->obd_minor);
+ return -ENODEV;
+ }
+
+ if (!obd->obd_type->typ_ops) {
+ printk("obd_check_conn: obd %d no operations\n", obd->obd_minor);
+ return -EOPNOTSUPP;
+ }
+ return 0;
+}
#define OBT(dev) dev->obd_type->typ_ops
#define OBP(dev,op) dev->obd_type->typ_ops->o_ ## op
+#define OBD_CHECK_OP(conn,op) do { \
+ int rc = obd_check_conn(conn);\
+ if (rc) { printk("obd: error in operation: " #op "\n"); return rc; }\
+ if (!OBP(conn->oc_dev,op)) { printk("obd_" #op ": dev %d no operation\n", conn->oc_dev->obd_minor); \
+ return -EOPNOTSUPP;\
+ }\
+} while (0)
+
+static inline int obd_get_info(struct obd_conn *conn, obd_count keylen, void *key,
+ obd_count *vallen, void **val)
+{
+ int rc;
+ OBD_CHECK_OP(conn,get_info);
+
+ rc = OBP(conn->oc_dev, get_info)(conn, keylen, key, vallen, val);
+ EXIT;
+ return rc;
+}
+
+static inline int obd_set_info(struct obd_conn *conn, obd_count keylen, void *key,
+ obd_count vallen, void *val)
+{
+ int rc;
+ OBD_CHECK_OP(conn,set_info);
+
+ rc = OBP(conn->oc_dev, set_info)(conn, keylen, key, vallen, val);
+ EXIT;
+ return rc;
+}
+
+static inline int obd_cleanup(struct obd_device *obd)
+{
+ struct obd_conn conn;
+ int rc;
+ conn.oc_dev = obd;
+
+ OBD_CHECK_OP((&conn),cleanup);
+
+ rc = OBP(conn.oc_dev, cleanup)(obd);
+ EXIT;
+ return rc;
+}
+
+static inline int obd_create(struct obd_conn *conn, struct obdo *obdo)
+{
+ int rc;
+ OBD_CHECK_OP(conn,create);
+
+ rc = OBP(conn->oc_dev, create)(conn, obdo);
+ EXIT;
+ return rc;
+}
+
+static inline int obd_destroy(struct obd_conn *conn, struct obdo *obdo)
+{
+ int rc;
+ OBD_CHECK_OP(conn,destroy);
+
+ rc = OBP(conn->oc_dev, destroy)(conn, obdo);
+ EXIT;
+ return rc;
+}
+
+static inline int obd_getattr(struct obd_conn *conn, struct obdo *obdo)
+{
+ int rc;
+ OBD_CHECK_OP(conn,getattr);
+
+ rc = OBP(conn->oc_dev, getattr)(conn, obdo);
+ EXIT;
+ return rc;
+}
+
+static inline int obd_setattr(struct obd_conn *conn, struct obdo *obdo)
+{
+ int rc;
+ OBD_CHECK_OP(conn,setattr);
+
+ rc = OBP(conn->oc_dev, setattr)(conn, obdo);
+ EXIT;
+ return rc;
+}
+
+static inline int obd_connect(struct obd_conn *conn)
+{
+ int rc;
+ OBD_CHECK_OP(conn,connect);
+
+ rc = OBP(conn->oc_dev, connect)(conn);
+ EXIT;
+ return rc;
+}
+
+static inline int obd_disconnect(struct obd_conn *conn)
+{
+ int rc;
+ OBD_CHECK_OP(conn,disconnect);
+
+ rc = OBP(conn->oc_dev, disconnect)(conn);
+ EXIT;
+ return rc;
+}
+
+static inline int obd_statfs(struct obd_conn *conn, struct statfs *buf)
+{
+ int rc;
+ OBD_CHECK_OP(conn,statfs);
+
+ rc = OBP(conn->oc_dev, statfs)(conn, buf);
+ EXIT;
+ return rc;
+}
+
+static inline int obd_punch(struct obd_conn *conn, struct obdo *tgt, obd_size count, obd_off offset)
+{
+ int rc;
+ OBD_CHECK_OP(conn,punch);
+
+ rc = OBP(conn->oc_dev, punch)(conn, tgt, count, offset);
+ EXIT;
+ return rc;
+}
+
+static inline int obd_brw(int rw, struct obd_conn *conn, obd_count num_oa,
+ struct obdo **oa, obd_count *oa_bufs, struct page **buf,
+ obd_size *count, obd_off *offset, obd_flag *flags)
+{
+ int rc;
+ OBD_CHECK_OP(conn,brw);
+
+ rc = OBP(conn->oc_dev, brw)(rw, conn, num_oa, oa, oa_bufs, buf,
+ count, offset, flags);
+ EXIT;
+ return rc;
+}
+
+
#endif
/* This value is not arbitrarily chosen. KIO_STATIC_PAGES from linux/iobuf.h */
kmem_cache_free(obdo_cachep, oa);
}
-
-
static __inline__ struct obdo *obdo_fromid(struct obd_conn *conn, obd_id id,
obd_mode mode, obd_flag valid)
{