#ifndef OBD_H
#define OBD_H
+/*
+ * Copyright (C) 2001 Cluster File Systems, Inc.
+ *
+ * This code is issued under the GNU General Public License.
+ * See the file COPYING in this distribution
+ */
struct obdfs_inode_info {
int oi_flags;
struct obd_conn osi_conn;
struct super_block *osi_super;
struct obd_device *osi_obd;
- struct obd_ops *osi_ops;
ino_t osi_rootino; /* number of root inode */
int osi_minor; /* minor of /dev/obdX */
struct list_head osi_inodes; /* list of dirty inodes */
CDEBUG(D_INFO, "src inode %ld, dst obdo %ld valid 0x%08x\n",
inode->i_ino, (long)oa->o_id, oa->o_valid);
obdo_from_inode(oa, inode);
- if (obdfs_has_inline(inode)) {
+ if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
+ CDEBUG(D_INODE, "copying device %x from inode to obdo\n",
+ inode->i_rdev);
+ *((obd_rdev *)oa->o_inline) = kdev_t_to_nr(inode->i_rdev);
+ oa->o_obdflags |= OBD_FL_INLINEDATA;
+ oa->o_valid |= OBD_MD_FLINLINE;
+ } else if (obdfs_has_inline(inode)) {
CDEBUG(D_INODE, "copying inline data from inode to obdo\n");
memcpy(oa->o_inline, oinfo->oi_inline, OBD_INLINESZ);
oa->o_obdflags |= OBD_FL_INLINEDATA;
obdo_to_inode(inode, oa);
if (obdo_has_inline(oa)) {
- CDEBUG(D_INODE, "copying inline data from obdo to inode\n");
- memcpy(oinfo->oi_inline, oa->o_inline, OBD_INLINESZ);
+ if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) ||
+ S_ISFIFO(inode->i_mode)) {
+ obd_rdev rdev = *((obd_rdev *)oa->o_inline);
+ CDEBUG(D_INODE,
+ "copying device %x from obdo to inode\n", rdev);
+ init_special_inode(inode, inode->i_mode, rdev);
+ } else {
+ CDEBUG(D_INFO, "copying inline from obdo to inode\n");
+ memcpy(oinfo->oi_inline, oa->o_inline, OBD_INLINESZ);
+ }
oinfo->oi_flags |= OBD_FL_INLINEDATA;
}
} /* obdfs_to_inode */
#ifdef OPS
#warning "*** WARNING redefining OPS"
#else
-#define OPS(sb,op) ((struct obdfs_sb_info *)(& ## sb ## ->u.generic_sbp))->osi_ops->o_ ## op
-#define IOPS(inode,op) ((struct obdfs_sb_info *)(& ## inode->i_sb ## ->u.generic_sbp))->osi_ops->o_ ## op
+#define OPS(sb,op) ((struct obdfs_sb_info *)(& (sb)->u.generic_sbp))->osi_ops->o_ ## op
+#define IOPS(inode,op) ((struct obdfs_sb_info *)(&(inode)->i_sb->u.generic_sbp))->osi_ops->o_ ## op
#endif
#ifdef ID
#warning "*** WARNING redefining ID"
#else
-#define ID(sb) (&((struct obdfs_sb_info *)( & ## sb ## ->u.generic_sbp))->osi_conn)
-#define IID(inode) (&((struct obdfs_sb_info *)( & ## inode->i_sb ## ->u.generic_sbp))->osi_conn)
+#define ID(sb) (&((struct obdfs_sb_info *)( &(sb)->u.generic_sbp))->osi_conn)
+#define IID(inode) (&((struct obdfs_sb_info *)( &(inode)->i_sb->u.generic_sbp))->osi_conn)
#endif
#define OBDFS_SUPER_MAGIC 0x4711