- Fix indentation in VarFind()
[dragonfly.git] / sys / vfs / gnu / ext2fs / ext2_inode_cnv.c
1 /*
2  * Copyright (c) 1995 The University of Utah and
3  * the Computer Systems Laboratory at the University of Utah (CSL).
4  * All rights reserved.
5  *
6  * Permission to use, copy, modify and distribute this software is hereby
7  * granted provided that (1) source code retains these copyright, permission,
8  * and disclaimer notices, and (2) redistributions including binaries
9  * reproduce the notices in supporting documentation, and (3) all advertising
10  * materials mentioning features or use of this software display the following
11  * acknowledgement: ``This product includes software developed by the
12  * Computer Systems Laboratory at the University of Utah.''
13  *
14  * THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS
15  * IS" CONDITION.  THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF
16  * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
17  *
18  * CSL requests users of this software to return to csl-dist@cs.utah.edu any
19  * improvements that they make and grant CSL redistribution rights.
20  *
21  *      Utah $Hdr$
22  * $FreeBSD: src/sys/gnu/ext2fs/ext2_inode_cnv.c,v 1.11 2000/01/01 17:39:21 bde Exp $
23  * $DragonFly: src/sys/vfs/gnu/ext2fs/ext2_inode_cnv.c,v 1.4 2004/04/08 20:57:52 cpressey Exp $
24  */
25
26 /*
27  * routines to convert on disk ext2 inodes in dinodes and back
28  */
29 #include <sys/param.h>
30 #include <sys/systm.h>
31 #include <sys/lock.h>
32 #include <sys/stat.h>
33 #include <sys/vnode.h>
34
35 #include <vfs/ufs/quota.h>
36 #include <vfs/ufs/inode.h>
37
38 /*
39  * Undo the definitions in <ufs/ufs/inode.h> that would destroy the include
40  * of <gnu/ext2fs/ext2_fs.h>.
41  */
42 #undef i_atime
43 #undef i_blocks
44 #undef i_ctime
45 #undef i_db
46 #undef i_flags
47 #undef i_gen
48 #undef i_gid
49 #undef i_ib
50 #undef i_mode
51 #undef i_mtime
52 #undef i_nlink
53 #undef i_rdev
54 #undef i_shortlink
55 #undef i_size
56 #undef i_uid
57
58 #include "ext2_fs.h"
59 #include "ext2_extern.h"
60
61 void
62 ext2_print_dinode(struct dinode *di)
63 {
64         int i;
65         printf( /* "Inode: %5d" */
66                 " Type: %10s Mode: 0x%o Flags: 0x%x  Version: %d\n",
67                 "n/a", di->di_mode, di->di_flags, di->di_gen);
68         printf( "User: %5lu Group: %5lu  Size: %lu\n",
69                 (unsigned long)di->di_uid, (unsigned long)di->di_gid,
70                 (unsigned long)di->di_size);
71         printf( "Links: %3d Blockcount: %d\n",
72                 di->di_nlink, di->di_blocks);
73         printf( "ctime: 0x%x", di->di_ctime); 
74         printf( "atime: 0x%x", di->di_atime); 
75         printf( "mtime: 0x%x", di->di_mtime); 
76         printf( "BLOCKS: ");
77         for(i=0; i < (di->di_blocks <= 24 ? ((di->di_blocks+1)/2): 12); i++)
78                 printf("%d ", di->di_db[i]);
79         printf("\n");
80 }
81
82 void
83 ext2_print_inode(struct inode *in)
84 {
85         printf( "Inode: %5d", in->i_number);
86         ext2_print_dinode(&in->i_din);
87 }
88
89 /*
90  *      raw ext2 inode to dinode
91  */
92 void
93 ext2_ei2di(struct ext2_inode *ei, struct dinode *di)
94 {
95         int     i;
96
97         di->di_nlink    = ei->i_links_count;
98         /* Godmar thinks - if the link count is zero, then the inode is
99            unused - according to ext2 standards. Ufs marks this fact
100            by setting i_mode to zero - why ?
101            I can see that this might lead to problems in an undelete.
102         */
103         di->di_mode     = ei->i_links_count ? ei->i_mode : 0;
104         di->di_size     = ei->i_size;
105         di->di_atime    = ei->i_atime;
106         di->di_mtime    = ei->i_mtime;
107         di->di_ctime    = ei->i_ctime;
108         di->di_flags    = 0;
109         di->di_flags    |= (ei->i_flags & EXT2_APPEND_FL) ? APPEND : 0;
110         di->di_flags    |= (ei->i_flags & EXT2_IMMUTABLE_FL) ? IMMUTABLE : 0;
111         di->di_blocks   = ei->i_blocks;
112         di->di_gen      = ei->i_generation;
113         di->di_uid      = ei->i_uid;
114         di->di_gid      = ei->i_gid;
115         /* XXX use memcpy */
116         for(i = 0; i < NDADDR; i++)
117                 di->di_db[i] = ei->i_block[i];
118         for(i = 0; i < NIADDR; i++)
119                 di->di_ib[i] = ei->i_block[EXT2_NDIR_BLOCKS + i];
120 }
121
122 /*
123  *      dinode to raw ext2 inode
124  */
125 void
126 ext2_di2ei(struct dinode *di, struct ext2_inode *ei)
127 {
128         int     i;
129
130         ei->i_mode              = di->di_mode;
131         ei->i_links_count       = di->di_nlink;
132         /* 
133            Godmar thinks: if dtime is nonzero, ext2 says this inode
134            has been deleted, this would correspond to a zero link count
135          */
136         ei->i_dtime             = ei->i_links_count ? 0 : di->di_mtime;
137         ei->i_size              = di->di_size;
138         ei->i_atime             = di->di_atime;
139         ei->i_mtime             = di->di_mtime;
140         ei->i_ctime             = di->di_ctime;
141         ei->i_flags             = di->di_flags;
142         ei->i_flags             = 0;
143         ei->i_flags             |= (di->di_flags & APPEND) ? EXT2_APPEND_FL: 0;
144         ei->i_flags             |= (di->di_flags & IMMUTABLE) 
145                                                         ? EXT2_IMMUTABLE_FL: 0;
146         ei->i_blocks            = di->di_blocks;
147         ei->i_generation        = di->di_gen;
148         ei->i_uid               = di->di_uid;
149         ei->i_gid               = di->di_gid;
150         /* XXX use memcpy */
151         for(i = 0; i < NDADDR; i++)
152                 ei->i_block[i] = di->di_db[i];
153         for(i = 0; i < NIADDR; i++)
154                 ei->i_block[EXT2_NDIR_BLOCKS + i] = di->di_ib[i];
155 }