0001
0002
0003
0004
0005
0006 #include <linux/fs.h>
0007 #include <linux/quotaops.h>
0008 #include "jfs_incore.h"
0009 #include "jfs_inode.h"
0010 #include "jfs_filsys.h"
0011 #include "jfs_imap.h"
0012 #include "jfs_dinode.h"
0013 #include "jfs_debug.h"
0014
0015
0016 void jfs_set_inode_flags(struct inode *inode)
0017 {
0018 unsigned int flags = JFS_IP(inode)->mode2;
0019 unsigned int new_fl = 0;
0020
0021 if (flags & JFS_IMMUTABLE_FL)
0022 new_fl |= S_IMMUTABLE;
0023 if (flags & JFS_APPEND_FL)
0024 new_fl |= S_APPEND;
0025 if (flags & JFS_NOATIME_FL)
0026 new_fl |= S_NOATIME;
0027 if (flags & JFS_DIRSYNC_FL)
0028 new_fl |= S_DIRSYNC;
0029 if (flags & JFS_SYNC_FL)
0030 new_fl |= S_SYNC;
0031 inode_set_flags(inode, new_fl, S_IMMUTABLE | S_APPEND | S_NOATIME |
0032 S_DIRSYNC | S_SYNC);
0033 }
0034
0035
0036
0037
0038
0039
0040
0041 struct inode *ialloc(struct inode *parent, umode_t mode)
0042 {
0043 struct super_block *sb = parent->i_sb;
0044 struct inode *inode;
0045 struct jfs_inode_info *jfs_inode;
0046 int rc;
0047
0048 inode = new_inode(sb);
0049 if (!inode) {
0050 jfs_warn("ialloc: new_inode returned NULL!");
0051 return ERR_PTR(-ENOMEM);
0052 }
0053
0054 jfs_inode = JFS_IP(inode);
0055
0056 rc = diAlloc(parent, S_ISDIR(mode), inode);
0057 if (rc) {
0058 jfs_warn("ialloc: diAlloc returned %d!", rc);
0059 goto fail_put;
0060 }
0061
0062 if (insert_inode_locked(inode) < 0) {
0063 rc = -EINVAL;
0064 goto fail_put;
0065 }
0066
0067 inode_init_owner(&init_user_ns, inode, parent, mode);
0068
0069
0070
0071
0072 jfs_inode->saved_uid = inode->i_uid;
0073 jfs_inode->saved_gid = inode->i_gid;
0074
0075
0076
0077
0078 rc = dquot_initialize(inode);
0079 if (rc)
0080 goto fail_drop;
0081 rc = dquot_alloc_inode(inode);
0082 if (rc)
0083 goto fail_drop;
0084
0085
0086 jfs_inode->mode2 = JFS_IP(parent)->mode2 & JFS_FL_INHERIT;
0087
0088 if (S_ISDIR(mode)) {
0089 jfs_inode->mode2 |= IDIRECTORY;
0090 jfs_inode->mode2 &= ~JFS_DIRSYNC_FL;
0091 }
0092 else {
0093 jfs_inode->mode2 |= INLINEEA | ISPARSE;
0094 if (S_ISLNK(mode))
0095 jfs_inode->mode2 &= ~(JFS_IMMUTABLE_FL|JFS_APPEND_FL);
0096 }
0097 jfs_inode->mode2 |= inode->i_mode;
0098
0099 inode->i_blocks = 0;
0100 inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
0101 jfs_inode->otime = inode->i_ctime.tv_sec;
0102 inode->i_generation = JFS_SBI(sb)->gengen++;
0103
0104 jfs_inode->cflag = 0;
0105
0106
0107 memset(&jfs_inode->acl, 0, sizeof(dxd_t));
0108 memset(&jfs_inode->ea, 0, sizeof(dxd_t));
0109 jfs_inode->next_index = 0;
0110 jfs_inode->acltype = 0;
0111 jfs_inode->btorder = 0;
0112 jfs_inode->btindex = 0;
0113 jfs_inode->bxflag = 0;
0114 jfs_inode->blid = 0;
0115 jfs_inode->atlhead = 0;
0116 jfs_inode->atltail = 0;
0117 jfs_inode->xtlid = 0;
0118 jfs_set_inode_flags(inode);
0119
0120 jfs_info("ialloc returns inode = 0x%p", inode);
0121
0122 return inode;
0123
0124 fail_drop:
0125 dquot_drop(inode);
0126 inode->i_flags |= S_NOQUOTA;
0127 clear_nlink(inode);
0128 discard_new_inode(inode);
0129 return ERR_PTR(rc);
0130
0131 fail_put:
0132 iput(inode);
0133 return ERR_PTR(rc);
0134 }