typedef uint32_t obd_mode;
typedef uint32_t obd_uid;
typedef uint32_t obd_gid;
-typedef uint16_t obd_rdev;
+typedef uint32_t obd_rdev;
typedef uint32_t obd_flag;
typedef uint32_t obd_count;
obd_mode o_mode;
obd_uid o_uid;
obd_gid o_gid;
- obd_rdev o_rdev;
obd_flag o_flags;
obd_flag o_obdflags;
obd_count o_nlink;
#define OBD_MD_FLGENER (0x00002000UL)
#define OBD_MD_FLINLINE (0x00004000UL)
#define OBD_MD_FLOBDMD (0x00008000UL)
-#define OBD_MD_FLRDEV (0x00010000UL)
#define OBD_MD_FLNOTOBD (~(OBD_MD_FLOBDMD | OBD_MD_FLOBDFLG | OBD_MD_FLBLOCKS))
/*
dst->o_gid = src->o_gid;
if ( src->o_valid & OBD_MD_FLFLAGS )
dst->o_flags = src->o_flags;
- if ( src->o_valid & OBD_MD_FLRDEV )
- dst->o_rdev = src->o_rdev;
/*
if ( src->o_valid & OBD_MD_FLOBDFLG )
dst->o_obdflags = src->o_obdflags;
dst->o_uid = src->i_uid;
if ( dst->o_valid & OBD_MD_FLGID )
dst->o_gid = src->i_gid;
- if ( dst->o_valid & OBD_MD_FLRDEV )
- dst->o_rdev = src->i_rdev;
if ( dst->o_valid & OBD_MD_FLFLAGS )
dst->o_flags = src->i_flags;
if ( dst->o_valid & OBD_MD_FLNLINK )
dst->i_uid = src->o_uid;
if ( src->o_valid & OBD_MD_FLGID )
dst->i_gid = src->o_gid;
- if ( src->o_valid & OBD_MD_FLRDEV )
- dst->i_rdev = src->o_rdev;
if ( src->o_valid & OBD_MD_FLFLAGS )
dst->i_flags = src->o_flags;
if ( src->o_valid & OBD_MD_FLNLINK )
res = (res || (dst->o_uid != src->o_uid));
if ( compare & OBD_MD_FLGID )
res = (res || (dst->o_gid != src->o_gid));
- if ( compare & OBD_MD_FLRDEV )
- res = (res || (dst->o_rdev != src->o_rdev));
if ( compare & OBD_MD_FLFLAGS )
res = (res || (dst->o_flags != src->o_flags));
if ( compare & OBD_MD_FLNLINK )
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 */