2019-05-27 09:55:05 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2005-04-17 02:20:36 +04:00
/*
* Copyright ( C ) International Business Machines Corp . , 2000 - 2004
*/
# include <linux/fs.h>
# include <linux/quotaops.h>
# include "jfs_incore.h"
2005-05-05 00:29:35 +04:00
# include "jfs_inode.h"
2005-04-17 02:20:36 +04:00
# include "jfs_filsys.h"
# include "jfs_imap.h"
# include "jfs_dinode.h"
# include "jfs_debug.h"
2006-02-09 18:09:16 +03:00
void jfs_set_inode_flags ( struct inode * inode )
{
unsigned int flags = JFS_IP ( inode ) - > mode2 ;
2014-04-14 11:39:01 +04:00
unsigned int new_fl = 0 ;
2006-02-09 18:09:16 +03:00
if ( flags & JFS_IMMUTABLE_FL )
2014-04-14 11:39:01 +04:00
new_fl | = S_IMMUTABLE ;
2006-02-09 18:09:16 +03:00
if ( flags & JFS_APPEND_FL )
2014-04-14 11:39:01 +04:00
new_fl | = S_APPEND ;
2006-02-09 18:09:16 +03:00
if ( flags & JFS_NOATIME_FL )
2014-04-14 11:39:01 +04:00
new_fl | = S_NOATIME ;
2006-02-09 18:09:16 +03:00
if ( flags & JFS_DIRSYNC_FL )
2014-04-14 11:39:01 +04:00
new_fl | = S_DIRSYNC ;
2006-02-09 18:09:16 +03:00
if ( flags & JFS_SYNC_FL )
2014-04-14 11:39:01 +04:00
new_fl | = S_SYNC ;
inode_set_flags ( inode , new_fl , S_IMMUTABLE | S_APPEND | S_NOATIME |
S_DIRSYNC | S_SYNC ) ;
2006-02-09 18:09:16 +03:00
}
2005-04-17 02:20:36 +04:00
/*
* NAME : ialloc ( )
*
* FUNCTION : Allocate a new inode
*
*/
struct inode * ialloc ( struct inode * parent , umode_t mode )
{
struct super_block * sb = parent - > i_sb ;
struct inode * inode ;
struct jfs_inode_info * jfs_inode ;
int rc ;
inode = new_inode ( sb ) ;
if ( ! inode ) {
jfs_warn ( " ialloc: new_inode returned NULL! " ) ;
2018-06-29 18:59:37 +03:00
return ERR_PTR ( - ENOMEM ) ;
2005-04-17 02:20:36 +04:00
}
jfs_inode = JFS_IP ( inode ) ;
rc = diAlloc ( parent , S_ISDIR ( mode ) , inode ) ;
if ( rc ) {
jfs_warn ( " ialloc: diAlloc returned %d! " , rc ) ;
2008-12-31 07:08:37 +03:00
goto fail_put ;
}
if ( insert_inode_locked ( inode ) < 0 ) {
rc = - EINVAL ;
2013-09-07 06:49:56 +04:00
goto fail_put ;
2005-04-17 02:20:36 +04:00
}
2010-03-04 17:30:58 +03:00
inode_init_owner ( inode , parent , mode ) ;
2006-03-09 22:59:30 +03:00
/*
* New inodes need to save sane values on disk when
* uid & gid mount options are used
*/
jfs_inode - > saved_uid = inode - > i_uid ;
jfs_inode - > saved_gid = inode - > i_gid ;
2005-04-17 02:20:36 +04:00
/*
* Allocate inode to quota .
*/
2015-07-15 21:53:19 +03:00
rc = dquot_initialize ( inode ) ;
if ( rc )
goto fail_drop ;
2010-03-03 17:05:01 +03:00
rc = dquot_alloc_inode ( inode ) ;
if ( rc )
2008-12-31 07:08:37 +03:00
goto fail_drop ;
2005-04-17 02:20:36 +04:00
2006-02-09 18:09:16 +03:00
/* inherit flags from parent */
jfs_inode - > mode2 = JFS_IP ( parent ) - > mode2 & JFS_FL_INHERIT ;
if ( S_ISDIR ( mode ) ) {
jfs_inode - > mode2 | = IDIRECTORY ;
jfs_inode - > mode2 & = ~ JFS_DIRSYNC_FL ;
}
2006-02-10 17:11:53 +03:00
else {
2006-02-09 18:09:16 +03:00
jfs_inode - > mode2 | = INLINEEA | ISPARSE ;
2006-02-10 17:11:53 +03:00
if ( S_ISLNK ( mode ) )
jfs_inode - > mode2 & = ~ ( JFS_IMMUTABLE_FL | JFS_APPEND_FL ) ;
}
2010-03-04 17:30:58 +03:00
jfs_inode - > mode2 | = inode - > i_mode ;
2006-02-09 18:09:16 +03:00
2005-04-17 02:20:36 +04:00
inode - > i_blocks = 0 ;
2016-09-14 17:48:04 +03:00
inode - > i_mtime = inode - > i_atime = inode - > i_ctime = current_time ( inode ) ;
2005-04-17 02:20:36 +04:00
jfs_inode - > otime = inode - > i_ctime . tv_sec ;
inode - > i_generation = JFS_SBI ( sb ) - > gengen + + ;
jfs_inode - > cflag = 0 ;
/* Zero remaining fields */
memset ( & jfs_inode - > acl , 0 , sizeof ( dxd_t ) ) ;
memset ( & jfs_inode - > ea , 0 , sizeof ( dxd_t ) ) ;
jfs_inode - > next_index = 0 ;
jfs_inode - > acltype = 0 ;
jfs_inode - > btorder = 0 ;
jfs_inode - > btindex = 0 ;
jfs_inode - > bxflag = 0 ;
jfs_inode - > blid = 0 ;
jfs_inode - > atlhead = 0 ;
jfs_inode - > atltail = 0 ;
jfs_inode - > xtlid = 0 ;
2006-02-09 18:09:16 +03:00
jfs_set_inode_flags ( inode ) ;
2005-04-17 02:20:36 +04:00
2016-03-30 15:23:16 +03:00
jfs_info ( " ialloc returns inode = 0x%p " , inode ) ;
2005-04-17 02:20:36 +04:00
return inode ;
2008-12-31 07:08:37 +03:00
fail_drop :
2010-03-03 17:05:05 +03:00
dquot_drop ( inode ) ;
2008-12-31 07:08:37 +03:00
inode - > i_flags | = S_NOQUOTA ;
2011-10-28 16:13:28 +04:00
clear_nlink ( inode ) ;
2018-06-29 18:59:37 +03:00
discard_new_inode ( inode ) ;
return ERR_PTR ( rc ) ;
2008-12-31 07:08:37 +03:00
fail_put :
iput ( inode ) ;
return ERR_PTR ( rc ) ;
2005-04-17 02:20:36 +04:00
}