Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  *   Copyright (C) International Business Machines Corp., 2000-2004
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  * NAME:    ialloc()
0037  *
0038  * FUNCTION:    Allocate a new inode
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      * New inodes need to save sane values on disk when
0070      * uid & gid mount options are used
0071      */
0072     jfs_inode->saved_uid = inode->i_uid;
0073     jfs_inode->saved_gid = inode->i_gid;
0074 
0075     /*
0076      * Allocate inode to quota.
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     /* inherit flags from parent */
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     /* Zero remaining fields */
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 }