diff options
Diffstat (limited to 'fs/cifs/inode.c')
-rw-r--r-- | fs/cifs/inode.c | 81 |
1 files changed, 42 insertions, 39 deletions
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index e1031b9e2c55..fcbdbb6ad7bf 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
@@ -281,7 +281,7 @@ static int decode_sfu_inode(struct inode *inode, __u64 size, | |||
281 | struct cifs_sb_info *cifs_sb, int xid) | 281 | struct cifs_sb_info *cifs_sb, int xid) |
282 | { | 282 | { |
283 | int rc; | 283 | int rc; |
284 | int oplock = FALSE; | 284 | int oplock = 0; |
285 | __u16 netfid; | 285 | __u16 netfid; |
286 | struct cifsTconInfo *pTcon = cifs_sb->tcon; | 286 | struct cifsTconInfo *pTcon = cifs_sb->tcon; |
287 | char buf[24]; | 287 | char buf[24]; |
@@ -389,7 +389,7 @@ int cifs_get_inode_info(struct inode **pinode, | |||
389 | struct cifs_sb_info *cifs_sb = CIFS_SB(sb); | 389 | struct cifs_sb_info *cifs_sb = CIFS_SB(sb); |
390 | const unsigned char *full_path = NULL; | 390 | const unsigned char *full_path = NULL; |
391 | char *buf = NULL; | 391 | char *buf = NULL; |
392 | int adjustTZ = FALSE; | 392 | bool adjustTZ = false; |
393 | bool is_dfs_referral = false; | 393 | bool is_dfs_referral = false; |
394 | 394 | ||
395 | pTcon = cifs_sb->tcon; | 395 | pTcon = cifs_sb->tcon; |
@@ -425,7 +425,7 @@ try_again_CIFSSMBQPathInfo: | |||
425 | pfindData, cifs_sb->local_nls, | 425 | pfindData, cifs_sb->local_nls, |
426 | cifs_sb->mnt_cifs_flags & | 426 | cifs_sb->mnt_cifs_flags & |
427 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 427 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
428 | adjustTZ = TRUE; | 428 | adjustTZ = true; |
429 | } | 429 | } |
430 | } | 430 | } |
431 | /* dump_mem("\nQPathInfo return data",&findData, sizeof(findData)); */ | 431 | /* dump_mem("\nQPathInfo return data",&findData, sizeof(findData)); */ |
@@ -703,7 +703,7 @@ psx_del_no_retry: | |||
703 | } else if (rc == -ENOENT) { | 703 | } else if (rc == -ENOENT) { |
704 | d_drop(direntry); | 704 | d_drop(direntry); |
705 | } else if (rc == -ETXTBSY) { | 705 | } else if (rc == -ETXTBSY) { |
706 | int oplock = FALSE; | 706 | int oplock = 0; |
707 | __u16 netfid; | 707 | __u16 netfid; |
708 | 708 | ||
709 | rc = CIFSSMBOpen(xid, pTcon, full_path, FILE_OPEN, DELETE, | 709 | rc = CIFSSMBOpen(xid, pTcon, full_path, FILE_OPEN, DELETE, |
@@ -736,7 +736,7 @@ psx_del_no_retry: | |||
736 | rc = -EOPNOTSUPP; | 736 | rc = -EOPNOTSUPP; |
737 | 737 | ||
738 | if (rc == -EOPNOTSUPP) { | 738 | if (rc == -EOPNOTSUPP) { |
739 | int oplock = FALSE; | 739 | int oplock = 0; |
740 | __u16 netfid; | 740 | __u16 netfid; |
741 | /* rc = CIFSSMBSetAttrLegacy(xid, pTcon, | 741 | /* rc = CIFSSMBSetAttrLegacy(xid, pTcon, |
742 | full_path, | 742 | full_path, |
@@ -774,7 +774,7 @@ psx_del_no_retry: | |||
774 | if (direntry->d_inode) | 774 | if (direntry->d_inode) |
775 | drop_nlink(direntry->d_inode); | 775 | drop_nlink(direntry->d_inode); |
776 | } else if (rc == -ETXTBSY) { | 776 | } else if (rc == -ETXTBSY) { |
777 | int oplock = FALSE; | 777 | int oplock = 0; |
778 | __u16 netfid; | 778 | __u16 netfid; |
779 | 779 | ||
780 | rc = CIFSSMBOpen(xid, pTcon, full_path, | 780 | rc = CIFSSMBOpen(xid, pTcon, full_path, |
@@ -974,8 +974,8 @@ mkdir_get_info: | |||
974 | * failed to get it from the server or was set bogus */ | 974 | * failed to get it from the server or was set bogus */ |
975 | if ((direntry->d_inode) && (direntry->d_inode->i_nlink < 2)) | 975 | if ((direntry->d_inode) && (direntry->d_inode->i_nlink < 2)) |
976 | direntry->d_inode->i_nlink = 2; | 976 | direntry->d_inode->i_nlink = 2; |
977 | mode &= ~current->fs->umask; | ||
977 | if (pTcon->unix_ext) { | 978 | if (pTcon->unix_ext) { |
978 | mode &= ~current->fs->umask; | ||
979 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) { | 979 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) { |
980 | CIFSSMBUnixSetPerms(xid, pTcon, full_path, | 980 | CIFSSMBUnixSetPerms(xid, pTcon, full_path, |
981 | mode, | 981 | mode, |
@@ -994,9 +994,16 @@ mkdir_get_info: | |||
994 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 994 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
995 | } | 995 | } |
996 | } else { | 996 | } else { |
997 | /* BB to be implemented via Windows secrty descriptors | 997 | if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) && |
998 | eg CIFSSMBWinSetPerms(xid, pTcon, full_path, mode, | 998 | (mode & S_IWUGO) == 0) { |
999 | -1, -1, local_nls); */ | 999 | FILE_BASIC_INFO pInfo; |
1000 | memset(&pInfo, 0, sizeof(pInfo)); | ||
1001 | pInfo.Attributes = cpu_to_le32(ATTR_READONLY); | ||
1002 | CIFSSMBSetTimes(xid, pTcon, full_path, | ||
1003 | &pInfo, cifs_sb->local_nls, | ||
1004 | cifs_sb->mnt_cifs_flags & | ||
1005 | CIFS_MOUNT_MAP_SPECIAL_CHR); | ||
1006 | } | ||
1000 | if (direntry->d_inode) { | 1007 | if (direntry->d_inode) { |
1001 | direntry->d_inode->i_mode = mode; | 1008 | direntry->d_inode->i_mode = mode; |
1002 | direntry->d_inode->i_mode |= S_IFDIR; | 1009 | direntry->d_inode->i_mode |= S_IFDIR; |
@@ -1149,7 +1156,7 @@ int cifs_rename(struct inode *source_inode, struct dentry *source_direntry, | |||
1149 | cFYI(1, ("rename rc %d", rc)); | 1156 | cFYI(1, ("rename rc %d", rc)); |
1150 | 1157 | ||
1151 | if ((rc == -EIO) || (rc == -EEXIST)) { | 1158 | if ((rc == -EIO) || (rc == -EEXIST)) { |
1152 | int oplock = FALSE; | 1159 | int oplock = 0; |
1153 | __u16 netfid; | 1160 | __u16 netfid; |
1154 | 1161 | ||
1155 | /* BB FIXME Is Generic Read correct for rename? */ | 1162 | /* BB FIXME Is Generic Read correct for rename? */ |
@@ -1186,7 +1193,7 @@ int cifs_revalidate(struct dentry *direntry) | |||
1186 | struct cifsInodeInfo *cifsInode; | 1193 | struct cifsInodeInfo *cifsInode; |
1187 | loff_t local_size; | 1194 | loff_t local_size; |
1188 | struct timespec local_mtime; | 1195 | struct timespec local_mtime; |
1189 | int invalidate_inode = FALSE; | 1196 | bool invalidate_inode = false; |
1190 | 1197 | ||
1191 | if (direntry->d_inode == NULL) | 1198 | if (direntry->d_inode == NULL) |
1192 | return -ENOENT; | 1199 | return -ENOENT; |
@@ -1268,7 +1275,7 @@ int cifs_revalidate(struct dentry *direntry) | |||
1268 | only ones who could have modified the file and the | 1275 | only ones who could have modified the file and the |
1269 | server copy is staler than ours */ | 1276 | server copy is staler than ours */ |
1270 | } else { | 1277 | } else { |
1271 | invalidate_inode = TRUE; | 1278 | invalidate_inode = true; |
1272 | } | 1279 | } |
1273 | } | 1280 | } |
1274 | 1281 | ||
@@ -1402,24 +1409,25 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) | |||
1402 | int rc = -EACCES; | 1409 | int rc = -EACCES; |
1403 | struct cifsFileInfo *open_file = NULL; | 1410 | struct cifsFileInfo *open_file = NULL; |
1404 | FILE_BASIC_INFO time_buf; | 1411 | FILE_BASIC_INFO time_buf; |
1405 | int set_time = FALSE; | 1412 | bool set_time = false; |
1406 | int set_dosattr = FALSE; | 1413 | bool set_dosattr = false; |
1407 | __u64 mode = 0xFFFFFFFFFFFFFFFFULL; | 1414 | __u64 mode = 0xFFFFFFFFFFFFFFFFULL; |
1408 | __u64 uid = 0xFFFFFFFFFFFFFFFFULL; | 1415 | __u64 uid = 0xFFFFFFFFFFFFFFFFULL; |
1409 | __u64 gid = 0xFFFFFFFFFFFFFFFFULL; | 1416 | __u64 gid = 0xFFFFFFFFFFFFFFFFULL; |
1410 | struct cifsInodeInfo *cifsInode; | 1417 | struct cifsInodeInfo *cifsInode; |
1418 | struct inode *inode = direntry->d_inode; | ||
1411 | 1419 | ||
1412 | xid = GetXid(); | 1420 | xid = GetXid(); |
1413 | 1421 | ||
1414 | cFYI(1, ("setattr on file %s attrs->iavalid 0x%x", | 1422 | cFYI(1, ("setattr on file %s attrs->iavalid 0x%x", |
1415 | direntry->d_name.name, attrs->ia_valid)); | 1423 | direntry->d_name.name, attrs->ia_valid)); |
1416 | 1424 | ||
1417 | cifs_sb = CIFS_SB(direntry->d_inode->i_sb); | 1425 | cifs_sb = CIFS_SB(inode->i_sb); |
1418 | pTcon = cifs_sb->tcon; | 1426 | pTcon = cifs_sb->tcon; |
1419 | 1427 | ||
1420 | if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) == 0) { | 1428 | if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) == 0) { |
1421 | /* check if we have permission to change attrs */ | 1429 | /* check if we have permission to change attrs */ |
1422 | rc = inode_change_ok(direntry->d_inode, attrs); | 1430 | rc = inode_change_ok(inode, attrs); |
1423 | if (rc < 0) { | 1431 | if (rc < 0) { |
1424 | FreeXid(xid); | 1432 | FreeXid(xid); |
1425 | return rc; | 1433 | return rc; |
@@ -1432,7 +1440,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) | |||
1432 | FreeXid(xid); | 1440 | FreeXid(xid); |
1433 | return -ENOMEM; | 1441 | return -ENOMEM; |
1434 | } | 1442 | } |
1435 | cifsInode = CIFS_I(direntry->d_inode); | 1443 | cifsInode = CIFS_I(inode); |
1436 | 1444 | ||
1437 | if ((attrs->ia_valid & ATTR_MTIME) || (attrs->ia_valid & ATTR_SIZE)) { | 1445 | if ((attrs->ia_valid & ATTR_MTIME) || (attrs->ia_valid & ATTR_SIZE)) { |
1438 | /* | 1446 | /* |
@@ -1443,9 +1451,9 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) | |||
1443 | will be truncated anyway? Also, should we error out here if | 1451 | will be truncated anyway? Also, should we error out here if |
1444 | the flush returns error? | 1452 | the flush returns error? |
1445 | */ | 1453 | */ |
1446 | rc = filemap_write_and_wait(direntry->d_inode->i_mapping); | 1454 | rc = filemap_write_and_wait(inode->i_mapping); |
1447 | if (rc != 0) { | 1455 | if (rc != 0) { |
1448 | CIFS_I(direntry->d_inode)->write_behind_rc = rc; | 1456 | cifsInode->write_behind_rc = rc; |
1449 | rc = 0; | 1457 | rc = 0; |
1450 | } | 1458 | } |
1451 | } | 1459 | } |
@@ -1464,7 +1472,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) | |||
1464 | __u16 nfid = open_file->netfid; | 1472 | __u16 nfid = open_file->netfid; |
1465 | __u32 npid = open_file->pid; | 1473 | __u32 npid = open_file->pid; |
1466 | rc = CIFSSMBSetFileSize(xid, pTcon, attrs->ia_size, | 1474 | rc = CIFSSMBSetFileSize(xid, pTcon, attrs->ia_size, |
1467 | nfid, npid, FALSE); | 1475 | nfid, npid, false); |
1468 | atomic_dec(&open_file->wrtPending); | 1476 | atomic_dec(&open_file->wrtPending); |
1469 | cFYI(1, ("SetFSize for attrs rc = %d", rc)); | 1477 | cFYI(1, ("SetFSize for attrs rc = %d", rc)); |
1470 | if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) { | 1478 | if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) { |
@@ -1484,14 +1492,14 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) | |||
1484 | it was found or because there was an error setting | 1492 | it was found or because there was an error setting |
1485 | it by handle */ | 1493 | it by handle */ |
1486 | rc = CIFSSMBSetEOF(xid, pTcon, full_path, | 1494 | rc = CIFSSMBSetEOF(xid, pTcon, full_path, |
1487 | attrs->ia_size, FALSE, | 1495 | attrs->ia_size, false, |
1488 | cifs_sb->local_nls, | 1496 | cifs_sb->local_nls, |
1489 | cifs_sb->mnt_cifs_flags & | 1497 | cifs_sb->mnt_cifs_flags & |
1490 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 1498 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
1491 | cFYI(1, ("SetEOF by path (setattrs) rc = %d", rc)); | 1499 | cFYI(1, ("SetEOF by path (setattrs) rc = %d", rc)); |
1492 | if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) { | 1500 | if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) { |
1493 | __u16 netfid; | 1501 | __u16 netfid; |
1494 | int oplock = FALSE; | 1502 | int oplock = 0; |
1495 | 1503 | ||
1496 | rc = SMBLegacyOpen(xid, pTcon, full_path, | 1504 | rc = SMBLegacyOpen(xid, pTcon, full_path, |
1497 | FILE_OPEN, | 1505 | FILE_OPEN, |
@@ -1516,14 +1524,13 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) | |||
1516 | 1524 | ||
1517 | /* Server is ok setting allocation size implicitly - no need | 1525 | /* Server is ok setting allocation size implicitly - no need |
1518 | to call: | 1526 | to call: |
1519 | CIFSSMBSetEOF(xid, pTcon, full_path, attrs->ia_size, TRUE, | 1527 | CIFSSMBSetEOF(xid, pTcon, full_path, attrs->ia_size, true, |
1520 | cifs_sb->local_nls); | 1528 | cifs_sb->local_nls); |
1521 | */ | 1529 | */ |
1522 | 1530 | ||
1523 | if (rc == 0) { | 1531 | if (rc == 0) { |
1524 | rc = cifs_vmtruncate(direntry->d_inode, attrs->ia_size); | 1532 | rc = cifs_vmtruncate(inode, attrs->ia_size); |
1525 | cifs_truncate_page(direntry->d_inode->i_mapping, | 1533 | cifs_truncate_page(inode->i_mapping, inode->i_size); |
1526 | direntry->d_inode->i_size); | ||
1527 | } else | 1534 | } else |
1528 | goto cifs_setattr_exit; | 1535 | goto cifs_setattr_exit; |
1529 | } | 1536 | } |
@@ -1557,14 +1564,14 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) | |||
1557 | rc = 0; | 1564 | rc = 0; |
1558 | #ifdef CONFIG_CIFS_EXPERIMENTAL | 1565 | #ifdef CONFIG_CIFS_EXPERIMENTAL |
1559 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) | 1566 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) |
1560 | rc = mode_to_acl(direntry->d_inode, full_path, mode); | 1567 | rc = mode_to_acl(inode, full_path, mode); |
1561 | else if ((mode & S_IWUGO) == 0) { | 1568 | else if ((mode & S_IWUGO) == 0) { |
1562 | #else | 1569 | #else |
1563 | if ((mode & S_IWUGO) == 0) { | 1570 | if ((mode & S_IWUGO) == 0) { |
1564 | #endif | 1571 | #endif |
1565 | /* not writeable */ | 1572 | /* not writeable */ |
1566 | if ((cifsInode->cifsAttrs & ATTR_READONLY) == 0) { | 1573 | if ((cifsInode->cifsAttrs & ATTR_READONLY) == 0) { |
1567 | set_dosattr = TRUE; | 1574 | set_dosattr = true; |
1568 | time_buf.Attributes = | 1575 | time_buf.Attributes = |
1569 | cpu_to_le32(cifsInode->cifsAttrs | | 1576 | cpu_to_le32(cifsInode->cifsAttrs | |
1570 | ATTR_READONLY); | 1577 | ATTR_READONLY); |
@@ -1574,28 +1581,24 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) | |||
1574 | not be able to write to it - so if any write | 1581 | not be able to write to it - so if any write |
1575 | bit is enabled for user or group or other we | 1582 | bit is enabled for user or group or other we |
1576 | need to at least try to remove r/o dos attr */ | 1583 | need to at least try to remove r/o dos attr */ |
1577 | set_dosattr = TRUE; | 1584 | set_dosattr = true; |
1578 | time_buf.Attributes = cpu_to_le32(cifsInode->cifsAttrs & | 1585 | time_buf.Attributes = cpu_to_le32(cifsInode->cifsAttrs & |
1579 | (~ATTR_READONLY)); | 1586 | (~ATTR_READONLY)); |
1580 | /* Windows ignores set to zero */ | 1587 | /* Windows ignores set to zero */ |
1581 | if (time_buf.Attributes == 0) | 1588 | if (time_buf.Attributes == 0) |
1582 | time_buf.Attributes |= cpu_to_le32(ATTR_NORMAL); | 1589 | time_buf.Attributes |= cpu_to_le32(ATTR_NORMAL); |
1583 | } | 1590 | } |
1584 | #ifdef CONFIG_CIFS_EXPERIMENTAL | ||
1585 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) | ||
1586 | mode_to_acl(direntry->d_inode, full_path, mode); | ||
1587 | #endif | ||
1588 | } | 1591 | } |
1589 | 1592 | ||
1590 | if (attrs->ia_valid & ATTR_ATIME) { | 1593 | if (attrs->ia_valid & ATTR_ATIME) { |
1591 | set_time = TRUE; | 1594 | set_time = true; |
1592 | time_buf.LastAccessTime = | 1595 | time_buf.LastAccessTime = |
1593 | cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_atime)); | 1596 | cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_atime)); |
1594 | } else | 1597 | } else |
1595 | time_buf.LastAccessTime = 0; | 1598 | time_buf.LastAccessTime = 0; |
1596 | 1599 | ||
1597 | if (attrs->ia_valid & ATTR_MTIME) { | 1600 | if (attrs->ia_valid & ATTR_MTIME) { |
1598 | set_time = TRUE; | 1601 | set_time = true; |
1599 | time_buf.LastWriteTime = | 1602 | time_buf.LastWriteTime = |
1600 | cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_mtime)); | 1603 | cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_mtime)); |
1601 | } else | 1604 | } else |
@@ -1606,7 +1609,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) | |||
1606 | server times */ | 1609 | server times */ |
1607 | 1610 | ||
1608 | if (set_time && (attrs->ia_valid & ATTR_CTIME)) { | 1611 | if (set_time && (attrs->ia_valid & ATTR_CTIME)) { |
1609 | set_time = TRUE; | 1612 | set_time = true; |
1610 | /* Although Samba throws this field away | 1613 | /* Although Samba throws this field away |
1611 | it may be useful to Windows - but we do | 1614 | it may be useful to Windows - but we do |
1612 | not want to set ctime unless some other | 1615 | not want to set ctime unless some other |
@@ -1630,7 +1633,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) | |||
1630 | rc = -EOPNOTSUPP; | 1633 | rc = -EOPNOTSUPP; |
1631 | 1634 | ||
1632 | if (rc == -EOPNOTSUPP) { | 1635 | if (rc == -EOPNOTSUPP) { |
1633 | int oplock = FALSE; | 1636 | int oplock = 0; |
1634 | __u16 netfid; | 1637 | __u16 netfid; |
1635 | 1638 | ||
1636 | cFYI(1, ("calling SetFileInfo since SetPathInfo for " | 1639 | cFYI(1, ("calling SetFileInfo since SetPathInfo for " |
@@ -1669,7 +1672,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) | |||
1669 | /* do not need local check to inode_check_ok since the server does | 1672 | /* do not need local check to inode_check_ok since the server does |
1670 | that */ | 1673 | that */ |
1671 | if (!rc) | 1674 | if (!rc) |
1672 | rc = inode_setattr(direntry->d_inode, attrs); | 1675 | rc = inode_setattr(inode, attrs); |
1673 | cifs_setattr_exit: | 1676 | cifs_setattr_exit: |
1674 | kfree(full_path); | 1677 | kfree(full_path); |
1675 | FreeXid(xid); | 1678 | FreeXid(xid); |