Whamcloud - gitweb
Fix o_valid and o_size for truncate through osc/ost/filterobd (on HEAD).
[fs/lustre-release.git] / lustre / include / linux / obdo.h
index 41df013..4255482 100644 (file)
@@ -1,5 +1,11 @@
 #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;
@@ -13,7 +19,6 @@ struct obdfs_sb_info {
         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 */
@@ -39,7 +44,13 @@ static void inline obdfs_from_inode(struct obdo *oa, struct inode *inode)
         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;
@@ -57,8 +68,16 @@ static void inline obdfs_to_inode(struct inode *inode, struct obdo *oa)
         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 */
@@ -69,15 +88,15 @@ static void inline obdfs_to_inode(struct inode *inode, struct obdo *oa)
 #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