+ * Lustre OST Proxy Device (OSP) is the agent on the local MDT for the OST
+ * or remote MDT.
+ *
+ * OSP object attributes cache
+ * ---------------------------
+ * OSP object is the stub of the remote OST-object or MDT-object. Both the
+ * attribute and the extended attributes are stored on the peer side remotely.
+ * It is inefficient to send RPC to peer to fetch those attributes when every
+ * get_attr()/get_xattr() called. For a large system, the LFSCK synchronous
+ * mode scanning is prohibitively inefficient.
+ *
+ * So the OSP maintains the OSP object attributes cache to cache some
+ * attributes on the local MDT. The cache is organized against the OSP
+ * object as follows:
+ *
+ * struct osp_xattr_entry {
+ * struct list_head oxe_list;
+ * atomic_t oxe_ref;
+ * void *oxe_value;
+ * int oxe_buflen;
+ * int oxe_namelen;
+ * int oxe_vallen;
+ * unsigned int oxe_exist:1,
+ * oxe_ready:1;
+ * char oxe_buf[0];
+ * };
+ *
+ * struct osp_object_attr {
+ * struct lu_attr ooa_attr;
+ * struct list_head ooa_xattr_list;
+ * };
+ *
+ * struct osp_object {
+ * ...
+ * struct osp_object_attr *opo_ooa;
+ * spinlock_t opo_lock;
+ * ...
+ * };
+ *
+ * The basic attributes, such as owner/mode/flags, are stored in the
+ * osp_object_attr::ooa_attr. The extended attributes will be stored
+ * as osp_xattr_entry. Every extended attribute has an independent
+ * osp_xattr_entry, and all the osp_xattr_entry are linked into the
+ * osp_object_attr::ooa_xattr_list. The OSP object attributes cache
+ * is protected by the osp_object::opo_lock.
+ *
+ * Not all OSP objects have an attributes cache because maintaining
+ * the cache requires some resources. Currently, the OSP object
+ * attributes cache will be initialized when the attributes or the
+ * extended attributes are pre-fetched via osp_declare_attr_get()
+ * or osp_declare_xattr_get(). That is usually for LFSCK purpose,
+ * but it also can be shared by others.