only set FileAttributes if setattr value is non-zero

some fileio tests sends a setattr with basicinfo.fileattributes=0
we used to then send a setattr with zero hidden, system, and archive
attrs. instead in this case, we should be keeping the old values
for these attributes.
This commit is contained in:
Olga Kornievskaia 2012-06-11 12:22:39 -04:00
parent 19d813da6a
commit 64986c8665

View file

@ -63,26 +63,27 @@ static int handle_nfs41_setattr(setattr_upcall_args *args)
stateid_arg stateid; stateid_arg stateid;
nfs41_file_info info = { 0 }, old_info = { 0 }; nfs41_file_info info = { 0 }, old_info = { 0 };
int status = NO_ERROR, getattr_status; int status = NO_ERROR, getattr_status;
if (basic_info->FileAttributes) {
info.hidden = basic_info->FileAttributes & FILE_ATTRIBUTE_HIDDEN ? 1 : 0;
info.system = basic_info->FileAttributes & FILE_ATTRIBUTE_SYSTEM ? 1 : 0;
info.archive = basic_info->FileAttributes & FILE_ATTRIBUTE_ARCHIVE ? 1 : 0;
getattr_status = nfs41_attr_cache_lookup(session_name_cache(state->session),
state->file.fh.fileid, &old_info);
info.hidden = basic_info->FileAttributes & FILE_ATTRIBUTE_HIDDEN ? 1 : 0; if (getattr_status || info.hidden != old_info.hidden) {
info.system = basic_info->FileAttributes & FILE_ATTRIBUTE_SYSTEM ? 1 : 0; info.attrmask.arr[0] = FATTR4_WORD0_HIDDEN;
info.archive = basic_info->FileAttributes & FILE_ATTRIBUTE_ARCHIVE ? 1 : 0; info.attrmask.count = 1;
getattr_status = nfs41_attr_cache_lookup(session_name_cache(state->session), }
state->file.fh.fileid, &old_info); if (getattr_status || info.archive != old_info.archive) {
info.attrmask.arr[0] |= FATTR4_WORD0_ARCHIVE;
if (getattr_status || info.hidden != old_info.hidden) { info.attrmask.count = 1;
info.attrmask.arr[0] = FATTR4_WORD0_HIDDEN; }
info.attrmask.count = 1; if (getattr_status || info.system != old_info.system) {
} info.attrmask.arr[1] = FATTR4_WORD1_SYSTEM;
if (getattr_status || info.archive != old_info.archive) { info.attrmask.count = 2;
info.attrmask.arr[0] |= FATTR4_WORD0_ARCHIVE; }
info.attrmask.count = 1; }
}
if (getattr_status || info.system != old_info.system) {
info.attrmask.arr[1] = FATTR4_WORD1_SYSTEM;
info.attrmask.count = 2;
}
if (old_info.mode == 0444 && if (old_info.mode == 0444 &&
((basic_info->FileAttributes & FILE_ATTRIBUTE_READONLY) == 0)) { ((basic_info->FileAttributes & FILE_ATTRIBUTE_READONLY) == 0)) {
info.mode = 0644; info.mode = 0644;