@ -94,6 +94,32 @@ static int unixmode2p9mode(struct v9fs_session_info *v9ses, int mode)
return res ;
}
/**
* p9mode2perm - convert plan9 mode bits to unix permission bits
* @ v9ses : v9fs session information
* @ stat : p9_wstat from which mode need to be derived
*
*/
static int p9mode2perm ( struct v9fs_session_info * v9ses ,
struct p9_wstat * stat )
{
int res ;
int mode = stat - > mode ;
res = mode & S_IALLUGO ;
if ( v9fs_proto_dotu ( v9ses ) ) {
if ( ( mode & P9_DMSETUID ) = = P9_DMSETUID )
res | = S_ISUID ;
if ( ( mode & P9_DMSETGID ) = = P9_DMSETGID )
res | = S_ISGID ;
if ( ( mode & P9_DMSETVTX ) = = P9_DMSETVTX )
res | = S_ISVTX ;
}
return res ;
}
/**
* p9mode2unixmode - convert plan9 mode bits to unix mode bits
* @ v9ses : v9fs session information
@ -107,8 +133,8 @@ static int p9mode2unixmode(struct v9fs_session_info *v9ses,
int res ;
int mode = stat - > mode ;
res = mode & S_IALLUGO ;
* rdev = 0 ;
res = p9mode2perm ( v9ses , stat ) ;
if ( ( mode & P9_DMDIR ) = = P9_DMDIR )
res | = S_IFDIR ;
@ -142,16 +168,6 @@ static int p9mode2unixmode(struct v9fs_session_info *v9ses,
} else
res | = S_IFREG ;
if ( v9fs_proto_dotu ( v9ses ) ) {
if ( ( mode & P9_DMSETUID ) = = P9_DMSETUID )
res | = S_ISUID ;
if ( ( mode & P9_DMSETGID ) = = P9_DMSETGID )
res | = S_ISGID ;
if ( ( mode & P9_DMSETVTX ) = = P9_DMSETVTX )
res | = S_ISVTX ;
}
return res ;
}
@ -1168,7 +1184,7 @@ v9fs_stat2inode(struct p9_wstat *stat, struct inode *inode,
set_nlink ( inode , i_nlink ) ;
}
}
mode = stat - > mode & S_IALLUGO ;
mode = p9mode2perm ( v9ses , stat ) ;
mode | = inode - > i_mode & ~ S_IALLUGO ;
inode - > i_mode = mode ;
i_size_write ( inode , stat - > length ) ;