diff options
Diffstat (limited to 'fs/nfsd/vfs.c')
-rw-r--r-- | fs/nfsd/vfs.c | 21 |
1 files changed, 5 insertions, 16 deletions
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index ea855629a1c2..4dd49d6e90cd 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c | |||
@@ -1245,7 +1245,6 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, | |||
1245 | __be32 err; | 1245 | __be32 err; |
1246 | int host_err; | 1246 | int host_err; |
1247 | __u32 v_mtime=0, v_atime=0; | 1247 | __u32 v_mtime=0, v_atime=0; |
1248 | int v_mode=0; | ||
1249 | 1248 | ||
1250 | err = nfserr_perm; | 1249 | err = nfserr_perm; |
1251 | if (!flen) | 1250 | if (!flen) |
@@ -1282,16 +1281,11 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, | |||
1282 | goto out; | 1281 | goto out; |
1283 | 1282 | ||
1284 | if (createmode == NFS3_CREATE_EXCLUSIVE) { | 1283 | if (createmode == NFS3_CREATE_EXCLUSIVE) { |
1285 | /* while the verifier would fit in mtime+atime, | 1284 | /* solaris7 gets confused (bugid 4218508) if these have |
1286 | * solaris7 gets confused (bugid 4218508) if these have | 1285 | * the high bit set, so just clear the high bits. |
1287 | * the high bit set, so we use the mode as well | ||
1288 | */ | 1286 | */ |
1289 | v_mtime = verifier[0]&0x7fffffff; | 1287 | v_mtime = verifier[0]&0x7fffffff; |
1290 | v_atime = verifier[1]&0x7fffffff; | 1288 | v_atime = verifier[1]&0x7fffffff; |
1291 | v_mode = S_IFREG | ||
1292 | | ((verifier[0]&0x80000000) >> (32-7)) /* u+x */ | ||
1293 | | ((verifier[1]&0x80000000) >> (32-9)) /* u+r */ | ||
1294 | ; | ||
1295 | } | 1289 | } |
1296 | 1290 | ||
1297 | if (dchild->d_inode) { | 1291 | if (dchild->d_inode) { |
@@ -1319,7 +1313,6 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, | |||
1319 | case NFS3_CREATE_EXCLUSIVE: | 1313 | case NFS3_CREATE_EXCLUSIVE: |
1320 | if ( dchild->d_inode->i_mtime.tv_sec == v_mtime | 1314 | if ( dchild->d_inode->i_mtime.tv_sec == v_mtime |
1321 | && dchild->d_inode->i_atime.tv_sec == v_atime | 1315 | && dchild->d_inode->i_atime.tv_sec == v_atime |
1322 | && dchild->d_inode->i_mode == v_mode | ||
1323 | && dchild->d_inode->i_size == 0 ) | 1316 | && dchild->d_inode->i_size == 0 ) |
1324 | break; | 1317 | break; |
1325 | /* fallthru */ | 1318 | /* fallthru */ |
@@ -1341,26 +1334,22 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp, | |||
1341 | } | 1334 | } |
1342 | 1335 | ||
1343 | if (createmode == NFS3_CREATE_EXCLUSIVE) { | 1336 | if (createmode == NFS3_CREATE_EXCLUSIVE) { |
1344 | /* Cram the verifier into atime/mtime/mode */ | 1337 | /* Cram the verifier into atime/mtime */ |
1345 | iap->ia_valid = ATTR_MTIME|ATTR_ATIME | 1338 | iap->ia_valid = ATTR_MTIME|ATTR_ATIME |
1346 | | ATTR_MTIME_SET|ATTR_ATIME_SET | 1339 | | ATTR_MTIME_SET|ATTR_ATIME_SET; |
1347 | | ATTR_MODE; | ||
1348 | /* XXX someone who knows this better please fix it for nsec */ | 1340 | /* XXX someone who knows this better please fix it for nsec */ |
1349 | iap->ia_mtime.tv_sec = v_mtime; | 1341 | iap->ia_mtime.tv_sec = v_mtime; |
1350 | iap->ia_atime.tv_sec = v_atime; | 1342 | iap->ia_atime.tv_sec = v_atime; |
1351 | iap->ia_mtime.tv_nsec = 0; | 1343 | iap->ia_mtime.tv_nsec = 0; |
1352 | iap->ia_atime.tv_nsec = 0; | 1344 | iap->ia_atime.tv_nsec = 0; |
1353 | iap->ia_mode = v_mode; | ||
1354 | } | 1345 | } |
1355 | 1346 | ||
1356 | /* Set file attributes. | 1347 | /* Set file attributes. |
1357 | * Mode has already been set but we might need to reset it | ||
1358 | * for CREATE_EXCLUSIVE | ||
1359 | * Irix appears to send along the gid when it tries to | 1348 | * Irix appears to send along the gid when it tries to |
1360 | * implement setgid directories via NFS. Clear out all that cruft. | 1349 | * implement setgid directories via NFS. Clear out all that cruft. |
1361 | */ | 1350 | */ |
1362 | set_attr: | 1351 | set_attr: |
1363 | if ((iap->ia_valid &= ~(ATTR_UID|ATTR_GID)) != 0) { | 1352 | if ((iap->ia_valid &= ~(ATTR_UID|ATTR_GID|ATTR_MODE)) != 0) { |
1364 | __be32 err2 = nfsd_setattr(rqstp, resfhp, iap, 0, (time_t)0); | 1353 | __be32 err2 = nfsd_setattr(rqstp, resfhp, iap, 0, (time_t)0); |
1365 | if (err2) | 1354 | if (err2) |
1366 | err = err2; | 1355 | err = err2; |