Whamcloud - gitweb
Add missing files, cleanup .cvsignore's
[fs/lustre-release.git] / lustre / include / linux / obd_class.h
index d7b3a10..6abae82 100644 (file)
@@ -146,12 +146,181 @@ struct obd_request {
        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 */
@@ -199,8 +368,6 @@ static __inline__ void obdo_free(struct obdo *oa)
         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)
 {