18642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland/*
28642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * Copyright (C) 2010 The Android Open Source Project
38642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland *
48642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * Licensed under the Apache License, Version 2.0 (the "License");
58642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * you may not use this file except in compliance with the License.
68642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * You may obtain a copy of the License at
78642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland *
88642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland *      http://www.apache.org/licenses/LICENSE-2.0
98642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland *
108642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * Unless required by applicable law or agreed to in writing, software
118642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * distributed under the License is distributed on an "AS IS" BASIS,
128642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * See the License for the specific language governing permissions and
148642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland * limitations under the License.
158642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland */
168642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
178642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland#include <sys/stat.h>
188642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland#include <string.h>
198642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland#include <stdio.h>
208642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
218642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland#include "ext4_utils.h"
228642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland#include "ext4.h"
238642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland#include "make_ext4fs.h"
248642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland#include "allocate.h"
258642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland#include "contents.h"
268642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland#include "extent.h"
278642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland#include "indirect.h"
288642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
298642b7fba54727a38f751516bcdc452fb09ef610Brian Swetlandstatic u32 dentry_size(u32 entries, struct dentry *dentries)
308642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland{
318642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	u32 len = 24;
328642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	unsigned int i;
338642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	unsigned int dentry_len;
348642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
358642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	for (i = 0; i < entries; i++) {
368642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		dentry_len = 8 + ALIGN(strlen(dentries[i].filename), 4);
378642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		if (len % info.block_size + dentry_len > info.block_size)
388642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland			len += info.block_size - (len % info.block_size);
398642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		len += dentry_len;
408642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	}
418642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
428642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	return len;
438642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland}
448642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
458642b7fba54727a38f751516bcdc452fb09ef610Brian Swetlandstatic struct ext4_dir_entry_2 *add_dentry(u8 *data, u32 *offset,
468642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		struct ext4_dir_entry_2 *prev, u32 inode, const char *name,
478642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		u8 file_type)
488642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland{
498642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	u8 name_len = strlen(name);
508642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	u16 rec_len = 8 + ALIGN(name_len, 4);
518642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	struct ext4_dir_entry_2 *dentry;
528642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
538642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	u32 start_block = *offset / info.block_size;
548642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	u32 end_block = (*offset + rec_len) / info.block_size;
558642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	if (start_block != end_block) {
568642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		/* Adding this dentry will cross a block boundary, so pad the previous
578642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		   dentry to the block boundary */
588642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		if (!prev)
598642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland			critical_error("no prev");
608642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		prev->rec_len += end_block * info.block_size - *offset;
618642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		*offset = end_block * info.block_size;
628642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	}
638642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
648642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	dentry = (struct ext4_dir_entry_2 *)(data + *offset);
658642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	dentry->inode = inode;
668642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	dentry->rec_len = rec_len;
678642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	dentry->name_len = name_len;
688642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	dentry->file_type = file_type;
698642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	memcpy(dentry->name, name, name_len);
708642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
718642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	*offset += rec_len;
728642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	return dentry;
738642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland}
748642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
758642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland/* Creates a directory structure for an array of directory entries, dentries,
768642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland   and stores the location of the structure in an inode.  The new inode's
778642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland   .. link is set to dir_inode_num.  Stores the location of the inode number
788642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland   of each directory entry into dentries[i].inode, to be filled in later
798642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland   when the inode for the entry is allocated.  Returns the inode number of the
808642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland   new directory */
818642b7fba54727a38f751516bcdc452fb09ef610Brian Swetlandu32 make_directory(u32 dir_inode_num, u32 entries, struct dentry *dentries,
828642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	u32 dirs)
838642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland{
848642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	struct ext4_inode *inode;
858642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	u32 blocks;
868642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	u32 len;
878642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	u32 offset = 0;
888642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	u32 inode_num;
898642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	u8 *data;
908642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	unsigned int i;
918642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	struct ext4_dir_entry_2 *dentry;
928642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
938642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	blocks = DIV_ROUND_UP(dentry_size(entries, dentries), info.block_size);
948642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	len = blocks * info.block_size;
958642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
968642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	if (dir_inode_num) {
978642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		inode_num = allocate_inode(info);
988642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	} else {
998642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		dir_inode_num = EXT4_ROOT_INO;
1008642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		inode_num = EXT4_ROOT_INO;
1018642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	}
1028642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
1038642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	if (inode_num == EXT4_ALLOCATE_FAILED) {
1048642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		error("failed to allocate inode\n");
1058642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		return EXT4_ALLOCATE_FAILED;
1068642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	}
1078642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
1088642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	add_directory(inode_num);
1098642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
1108642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	inode = get_inode(inode_num);
1118642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	if (inode == NULL) {
1128642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		error("failed to get inode %u", inode_num);
1138642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		return EXT4_ALLOCATE_FAILED;
1148642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	}
1158642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
1168642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	data = inode_allocate_data_extents(inode, len, len);
1178642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	if (data == NULL) {
1188642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		error("failed to allocate %llu extents", len);
1198642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		return EXT4_ALLOCATE_FAILED;
1208642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	}
1218642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
1228642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	inode->i_mode = S_IFDIR;
1238642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	inode->i_links_count = dirs + 2;
1248642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	inode->i_flags |= aux_info.default_i_flags;
1258642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
1268642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	dentry = NULL;
1278642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
1288642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	dentry = add_dentry(data, &offset, NULL, inode_num, ".", EXT4_FT_DIR);
1298642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	if (!dentry) {
1308642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		error("failed to add . directory");
1318642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		return EXT4_ALLOCATE_FAILED;
1328642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	}
1338642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
1348642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	dentry = add_dentry(data, &offset, dentry, dir_inode_num, "..", EXT4_FT_DIR);
1358642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	if (!dentry) {
1368642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		error("failed to add .. directory");
1378642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		return EXT4_ALLOCATE_FAILED;
1388642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	}
1398642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
1408642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	for (i = 0; i < entries; i++) {
1418642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		dentry = add_dentry(data, &offset, dentry, 0,
1428642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland				dentries[i].filename, dentries[i].file_type);
1438642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		if (offset > len || (offset == len && i != entries - 1))
1448642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland			critical_error("internal error: dentry for %s ends at %d, past %d\n",
1458642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland				dentries[i].filename, offset, len);
1468642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		dentries[i].inode = &dentry->inode;
1478642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		if (!dentry) {
1488642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland			error("failed to add directory");
1498642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland			return EXT4_ALLOCATE_FAILED;
1508642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		}
1518642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	}
1528642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
1538642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	dentry = (struct ext4_dir_entry_2 *)(data + offset);
1548642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	dentry->inode = 0;
1558642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	dentry->rec_len = len - offset;
1568642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	dentry->name_len = 0;
1578642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	dentry->file_type = EXT4_FT_UNKNOWN;
1588642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
1598642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	return inode_num;
1608642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland}
1618642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
1628642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland/* Creates a file on disk.  Returns the inode number of the new file */
1638642b7fba54727a38f751516bcdc452fb09ef610Brian Swetlandu32 make_file(const char *filename, u64 len)
1648642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland{
1658642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	struct ext4_inode *inode;
1668642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	u32 inode_num;
1678642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
1688642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	inode_num = allocate_inode(info);
1698642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	if (inode_num == EXT4_ALLOCATE_FAILED) {
1708642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		error("failed to allocate inode\n");
1718642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		return EXT4_ALLOCATE_FAILED;
1728642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	}
1738642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
1748642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	inode = get_inode(inode_num);
1758642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	if (inode == NULL) {
1768642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		error("failed to get inode %u", inode_num);
1778642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		return EXT4_ALLOCATE_FAILED;
1788642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	}
1798642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
1808642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	if (len > 0)
1818642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		inode_allocate_file_extents(inode, len, filename);
1828642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
1838642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	inode->i_mode = S_IFREG;
1848642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	inode->i_links_count = 1;
1858642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	inode->i_flags |= aux_info.default_i_flags;
1868642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
1878642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	return inode_num;
1888642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland}
1898642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
1908642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland/* Creates a file on disk.  Returns the inode number of the new file */
1918642b7fba54727a38f751516bcdc452fb09ef610Brian Swetlandu32 make_link(const char *filename, const char *link)
1928642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland{
1938642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	struct ext4_inode *inode;
1948642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	u32 inode_num;
1958642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	u32 len = strlen(link);
1968642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
1978642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	inode_num = allocate_inode(info);
1988642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	if (inode_num == EXT4_ALLOCATE_FAILED) {
1998642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		error("failed to allocate inode\n");
2008642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		return EXT4_ALLOCATE_FAILED;
2018642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	}
2028642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
2038642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	inode = get_inode(inode_num);
2048642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	if (inode == NULL) {
2058642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		error("failed to get inode %u", inode_num);
2068642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		return EXT4_ALLOCATE_FAILED;
2078642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	}
2088642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
2098642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	inode->i_mode = S_IFLNK;
2108642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	inode->i_links_count = 1;
2118642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	inode->i_flags |= aux_info.default_i_flags;
2128642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	inode->i_size_lo = len;
2138642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
2148642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	if (len + 1 <= sizeof(inode->i_block)) {
2158642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		/* Fast symlink */
2168642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		memcpy((char*)inode->i_block, link, len);
2178642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	} else {
2188642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		u8 *data = inode_allocate_data_indirect(inode, info.block_size, info.block_size);
2198642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		memcpy(data, link, len);
2208642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		inode->i_blocks_lo = info.block_size / 512;
2218642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	}
2228642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
2238642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	return inode_num;
2248642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland}
2258642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
2268642b7fba54727a38f751516bcdc452fb09ef610Brian Swetlandint inode_set_permissions(u32 inode_num, u16 mode, u16 uid, u16 gid, u32 mtime)
2278642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland{
2288642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	struct ext4_inode *inode = get_inode(inode_num);
2298642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
2308642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	if (!inode)
2318642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland		return -1;
2328642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
2338642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	inode->i_mode |= mode;
2348642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	inode->i_uid = uid;
2358642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	inode->i_gid = gid;
2368642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	inode->i_mtime = mtime;
2378642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	inode->i_atime = mtime;
2388642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	inode->i_ctime = mtime;
2398642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland
2408642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland	return 0;
2418642b7fba54727a38f751516bcdc452fb09ef610Brian Swetland}
242