aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/nfs_prot.h1
-rw-r--r--plpnfsd/mp_pfs_ops.c5
2 files changed, 4 insertions, 2 deletions
diff --git a/include/nfs_prot.h b/include/nfs_prot.h
index 8bc490f..acba688 100644
--- a/include/nfs_prot.h
+++ b/include/nfs_prot.h
@@ -40,6 +40,7 @@
#define NFSMODE_LNK 0120000
#define NFSMODE_SOCK 0140000
#define NFSMODE_FIFO 0010000
+#define NFSMODE_MASK 07770000
#if !defined(hpux) && !defined(__sgi)
enum nfsstat {
diff --git a/plpnfsd/mp_pfs_ops.c b/plpnfsd/mp_pfs_ops.c
index e90b7a5..03b0811 100644
--- a/plpnfsd/mp_pfs_ops.c
+++ b/plpnfsd/mp_pfs_ops.c
@@ -1001,7 +1001,7 @@ nfsproc_setattr_2(sattrargs *sa)
if (rfsv_isalive())
add_cache(&attrcache, inode->inode, fp);
}
- if ((sa->attributes.mode != fp->mode) &&
+ if ((sa->attributes.mode != (fp->mode & ~NFSMODE_MASK)) &&
(sa->attributes.mode != -1)) {
long psisattr, psidattr;
attr2pattr(sa->attributes.mode, fp->mode, &psisattr, &psidattr);
@@ -1017,7 +1017,8 @@ nfsproc_setattr_2(sattrargs *sa)
return &res;
}
}
- fp->mode = sa->attributes.mode;
+ debuglog("changing mode from %o to %o\n", fp->mode, (fp->mode & NFSMODE_MASK) | sa->attributes.mode);
+ fp->mode = (fp->mode & NFSMODE_MASK) | sa->attributes.mode;
rem_cache(&attrcache, inode->inode);
if (rfsv_isalive() && !builtin)
add_cache(&attrcache, inode->inode, fp);