orangefs: Only compare attributes specified in orangefs_inode_getattr.
Signed-off-by: Martin Brandenburg <martin@omnibond.com> Signed-off-by: Mike Marshall <hubcap@omnibond.com>
This commit is contained in:
parent
2d4cae0d17
commit
fe88adc366
@ -355,24 +355,35 @@ static inline int copy_attributes_from_inode(struct inode *inode,
|
|||||||
|
|
||||||
static int compare_attributes_to_inode(struct inode *inode,
|
static int compare_attributes_to_inode(struct inode *inode,
|
||||||
struct ORANGEFS_sys_attr_s *attrs,
|
struct ORANGEFS_sys_attr_s *attrs,
|
||||||
char *symname)
|
char *symname,
|
||||||
|
int mask)
|
||||||
{
|
{
|
||||||
struct orangefs_inode_s *orangefs_inode = ORANGEFS_I(inode);
|
struct orangefs_inode_s *orangefs_inode = ORANGEFS_I(inode);
|
||||||
loff_t inode_size, rounded_up_size;
|
loff_t inode_size, rounded_up_size;
|
||||||
|
|
||||||
|
/* Much of what happens below relies on the type being around. */
|
||||||
|
if (!(mask & ORANGEFS_ATTR_SYS_TYPE))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (attrs->objtype == ORANGEFS_TYPE_METAFILE &&
|
||||||
|
inode->i_flags != orangefs_inode_flags(attrs))
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* Compare file size. */
|
/* Compare file size. */
|
||||||
|
|
||||||
switch (attrs->objtype) {
|
switch (attrs->objtype) {
|
||||||
case ORANGEFS_TYPE_METAFILE:
|
case ORANGEFS_TYPE_METAFILE:
|
||||||
if(inode->i_flags != orangefs_inode_flags(attrs))
|
if (mask & ORANGEFS_ATTR_SYS_SIZE) {
|
||||||
return 0;
|
|
||||||
inode_size = attrs->size;
|
inode_size = attrs->size;
|
||||||
rounded_up_size = inode_size + (4096 - (inode_size % 4096));
|
rounded_up_size = inode_size +
|
||||||
|
(4096 - (inode_size % 4096));
|
||||||
if (inode->i_bytes != inode_size ||
|
if (inode->i_bytes != inode_size ||
|
||||||
inode->i_blocks != rounded_up_size/512)
|
inode->i_blocks != rounded_up_size/512)
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case ORANGEFS_TYPE_SYMLINK:
|
case ORANGEFS_TYPE_SYMLINK:
|
||||||
|
if (mask & ORANGEFS_ATTR_SYS_SIZE)
|
||||||
if (symname && strlen(symname) != inode->i_size)
|
if (symname && strlen(symname) != inode->i_size)
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
break;
|
||||||
@ -384,17 +395,28 @@ static int compare_attributes_to_inode(struct inode *inode,
|
|||||||
|
|
||||||
/* Compare general attributes. */
|
/* Compare general attributes. */
|
||||||
|
|
||||||
if (!uid_eq(inode->i_uid, make_kuid(&init_user_ns, attrs->owner)) ||
|
if (mask & ORANGEFS_ATTR_SYS_UID &&
|
||||||
!gid_eq(inode->i_gid, make_kgid(&init_user_ns, attrs->group)) ||
|
!uid_eq(inode->i_uid, make_kuid(&init_user_ns, attrs->owner)))
|
||||||
inode->i_atime.tv_sec != attrs->atime ||
|
return 0;
|
||||||
inode->i_mtime.tv_sec != attrs->mtime ||
|
if (mask & ORANGEFS_ATTR_SYS_GID &&
|
||||||
inode->i_ctime.tv_sec != attrs->ctime ||
|
!gid_eq(inode->i_gid, make_kgid(&init_user_ns, attrs->group)))
|
||||||
inode->i_atime.tv_nsec != 0 ||
|
return 0;
|
||||||
|
if (mask & ORANGEFS_ATTR_SYS_ATIME &&
|
||||||
|
inode->i_atime.tv_sec != attrs->atime)
|
||||||
|
return 0;
|
||||||
|
if (mask & ORANGEFS_ATTR_SYS_MTIME &&
|
||||||
|
inode->i_atime.tv_sec != attrs->mtime)
|
||||||
|
return 0;
|
||||||
|
if (mask & ORANGEFS_ATTR_SYS_CTIME &&
|
||||||
|
inode->i_atime.tv_sec != attrs->ctime)
|
||||||
|
return 0;
|
||||||
|
if (inode->i_atime.tv_nsec != 0 ||
|
||||||
inode->i_mtime.tv_nsec != 0 ||
|
inode->i_mtime.tv_nsec != 0 ||
|
||||||
inode->i_ctime.tv_nsec != 0)
|
inode->i_ctime.tv_nsec != 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if ((inode->i_mode & ~(S_ISVTX|S_IFREG|S_IFDIR|S_IFLNK)) !=
|
if (mask & ORANGEFS_ATTR_SYS_PERM &&
|
||||||
|
(inode->i_mode & ~(S_ISVTX|S_IFREG|S_IFDIR|S_IFLNK)) !=
|
||||||
orangefs_inode_perms(attrs))
|
orangefs_inode_perms(attrs))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -418,7 +440,8 @@ static int compare_attributes_to_inode(struct inode *inode,
|
|||||||
case ORANGEFS_TYPE_SYMLINK:
|
case ORANGEFS_TYPE_SYMLINK:
|
||||||
if (!(inode->i_mode & S_IFLNK))
|
if (!(inode->i_mode & S_IFLNK))
|
||||||
return 0;
|
return 0;
|
||||||
if (orangefs_inode && symname)
|
if (orangefs_inode && symname &&
|
||||||
|
mask & ORANGEFS_ATTR_SYS_LNK_TARGET)
|
||||||
if (strcmp(orangefs_inode->link_target, symname))
|
if (strcmp(orangefs_inode->link_target, symname))
|
||||||
return 0;
|
return 0;
|
||||||
break;
|
break;
|
||||||
@ -462,7 +485,8 @@ int orangefs_inode_getattr(struct inode *inode, __u32 getattr_mask, int check)
|
|||||||
if (check) {
|
if (check) {
|
||||||
ret = compare_attributes_to_inode(inode,
|
ret = compare_attributes_to_inode(inode,
|
||||||
&new_op->downcall.resp.getattr.attributes,
|
&new_op->downcall.resp.getattr.attributes,
|
||||||
new_op->downcall.resp.getattr.link_target);
|
new_op->downcall.resp.getattr.link_target,
|
||||||
|
getattr_mask);
|
||||||
|
|
||||||
if (new_op->downcall.resp.getattr.attributes.objtype ==
|
if (new_op->downcall.resp.getattr.attributes.objtype ==
|
||||||
ORANGEFS_TYPE_METAFILE) {
|
ORANGEFS_TYPE_METAFILE) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user