wengang wang wrote: > > sometimes HPUX nfs client sends a create request to linux nfs server(v2/v3). > the dump of the request is like: > obj_attributes > mode: value follows > set_it: value follows (1) > mode: 00 > uid: no value > set_it: no value (0) > gid: value follows > set_it: value follows (1) > gid: 8030 > size: value follows > set_it: value follows (1) > size: 0 > atime: don't change > set_it: don't change (0) > mtime: don't change > set_it: don't change (0) > > note that mode is 00(havs no rwx privilege even for the owner) and it requires > to set size to 0. What's the Create Mode in this case? EXCLUSIVE or UNCHECKED? What's the error the server is returning without this patch - ERR_NOTSUPP? I tested this on 2.6.27.7 with a small program which does this: fd = open("file", O_CREAT, 0000); The file creation succeeded with file size set to 0 and the subsequent chmod too. May be this could break EXCLUSIVE create mode semantics? > the patch is based on 2.6.27.10. > > Signed-off-by: Wengang Wang <wen.gang.wang@xxxxxxxxxx> > -- > vfs.c | 20 ++++++++++++++++++++ > 1 file changed, 20 insertions(+) > diff -up ./fs/nfsd/vfs.c.orig ./fs/nfsd/vfs.c > --- ./fs/nfsd/vfs.c.orig 2008-12-23 14:11:14.000000000 +0800 > +++ ./fs/nfsd/vfs.c 2008-12-23 14:54:16.000000000 +0800 > @@ -1268,6 +1268,16 @@ nfsd_create(struct svc_rqst *rqstp, stru > switch (type) { > case S_IFREG: > host_err = vfs_create(dirp, dchild, iap->ia_mode, NULL); > + /* HPUX client sometimes creates a file in mode 000, and set > + * size to 0. setting size to 0 may fail for some spcific > + * file systems by the permission checking which requires > + * WRITE privilege but the mode is 000. > + * we ignore setting size to 0 for the creation, since it's > + * just 0 after created. > + * */ > + if ((iap->ia_valid & ATTR_SIZE) && (iap->ia_size == 0)) > + iap->ia_valid &= ~ATTR_SIZE; > + > break; > case S_IFDIR: > host_err = vfs_mkdir(dirp, dchild, iap->ia_mode); > @@ -1421,6 +1431,16 @@ nfsd_create_v3(struct svc_rqst *rqstp, s > /* setattr will sync the child (or not) */ > } > > + /* HPUX client sometimes creates a file in mode 000, and set size to 0. > + * setting size to 0 may fail for some spcific file systems by the > + * permission checking which requires WRITE privilege but the mode is > + * 000. > + * we ignore setting size to 0 for the creation, since it's just 0 > + * after created. > + * */ > + if ((iap->ia_valid & ATTR_SIZE) && (iap->ia_size == 0)) > + iap->ia_valid &= ~ATTR_SIZE; > + > if (createmode == NFS3_CREATE_EXCLUSIVE) { > /* Cram the verifier into atime/mtime */ > iap->ia_valid = ATTR_MTIME|ATTR_ATIME -- Suresh Jayaraman -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html