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:
Martin Brandenburg 2016-01-30 13:46:11 -05:00 committed by Mike Marshall
parent 2d4cae0d17
commit fe88adc366

View File

@ -355,26 +355,37 @@ 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 +
rounded_up_size = inode_size + (4096 - (inode_size % 4096)); (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 (symname && strlen(symname) != inode->i_size) if (mask & ORANGEFS_ATTR_SYS_SIZE)
return 0; if (symname && strlen(symname) != inode->i_size)
return 0;
break; break;
default: default:
if (inode->i_size != PAGE_CACHE_SIZE && if (inode->i_size != PAGE_CACHE_SIZE &&
@ -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) {