diff options
Diffstat (limited to 'fs/cifs/inode.c')
| -rw-r--r-- | fs/cifs/inode.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 598eec9778f6..957ddd1571c6 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
| @@ -565,11 +565,14 @@ int cifs_unlink(struct inode *inode, struct dentry *direntry) | |||
| 565 | struct cifsInodeInfo *cifsInode; | 565 | struct cifsInodeInfo *cifsInode; |
| 566 | FILE_BASIC_INFO *pinfo_buf; | 566 | FILE_BASIC_INFO *pinfo_buf; |
| 567 | 567 | ||
| 568 | cFYI(1, ("cifs_unlink, inode = 0x%p with ", inode)); | 568 | cFYI(1, ("cifs_unlink, inode = 0x%p", inode)); |
| 569 | 569 | ||
| 570 | xid = GetXid(); | 570 | xid = GetXid(); |
| 571 | 571 | ||
| 572 | cifs_sb = CIFS_SB(inode->i_sb); | 572 | if(inode) |
| 573 | cifs_sb = CIFS_SB(inode->i_sb); | ||
| 574 | else | ||
| 575 | cifs_sb = CIFS_SB(direntry->d_sb); | ||
| 573 | pTcon = cifs_sb->tcon; | 576 | pTcon = cifs_sb->tcon; |
| 574 | 577 | ||
| 575 | /* Unlink can be called from rename so we can not grab the sem here | 578 | /* Unlink can be called from rename so we can not grab the sem here |
| @@ -609,9 +612,8 @@ int cifs_unlink(struct inode *inode, struct dentry *direntry) | |||
| 609 | } | 612 | } |
| 610 | } else if (rc == -EACCES) { | 613 | } else if (rc == -EACCES) { |
| 611 | /* try only if r/o attribute set in local lookup data? */ | 614 | /* try only if r/o attribute set in local lookup data? */ |
| 612 | pinfo_buf = kmalloc(sizeof(FILE_BASIC_INFO), GFP_KERNEL); | 615 | pinfo_buf = kzalloc(sizeof(FILE_BASIC_INFO), GFP_KERNEL); |
| 613 | if (pinfo_buf) { | 616 | if (pinfo_buf) { |
| 614 | memset(pinfo_buf, 0, sizeof(FILE_BASIC_INFO)); | ||
| 615 | /* ATTRS set to normal clears r/o bit */ | 617 | /* ATTRS set to normal clears r/o bit */ |
| 616 | pinfo_buf->Attributes = cpu_to_le32(ATTR_NORMAL); | 618 | pinfo_buf->Attributes = cpu_to_le32(ATTR_NORMAL); |
| 617 | if (!(pTcon->ses->flags & CIFS_SES_NT4)) | 619 | if (!(pTcon->ses->flags & CIFS_SES_NT4)) |
| @@ -693,9 +695,11 @@ int cifs_unlink(struct inode *inode, struct dentry *direntry) | |||
| 693 | when needed */ | 695 | when needed */ |
| 694 | direntry->d_inode->i_ctime = current_fs_time(inode->i_sb); | 696 | direntry->d_inode->i_ctime = current_fs_time(inode->i_sb); |
| 695 | } | 697 | } |
| 696 | inode->i_ctime = inode->i_mtime = current_fs_time(inode->i_sb); | 698 | if(inode) { |
| 697 | cifsInode = CIFS_I(inode); | 699 | inode->i_ctime = inode->i_mtime = current_fs_time(inode->i_sb); |
| 698 | cifsInode->time = 0; /* force revalidate of dir as well */ | 700 | cifsInode = CIFS_I(inode); |
| 701 | cifsInode->time = 0; /* force revalidate of dir as well */ | ||
| 702 | } | ||
| 699 | 703 | ||
| 700 | kfree(full_path); | 704 | kfree(full_path); |
| 701 | FreeXid(xid); | 705 | FreeXid(xid); |
| @@ -1167,7 +1171,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) | |||
| 1167 | nfid, npid, FALSE); | 1171 | nfid, npid, FALSE); |
| 1168 | atomic_dec(&open_file->wrtPending); | 1172 | atomic_dec(&open_file->wrtPending); |
| 1169 | cFYI(1,("SetFSize for attrs rc = %d", rc)); | 1173 | cFYI(1,("SetFSize for attrs rc = %d", rc)); |
| 1170 | if(rc == -EINVAL) { | 1174 | if((rc == -EINVAL) || (rc == -EOPNOTSUPP)) { |
| 1171 | int bytes_written; | 1175 | int bytes_written; |
| 1172 | rc = CIFSSMBWrite(xid, pTcon, | 1176 | rc = CIFSSMBWrite(xid, pTcon, |
| 1173 | nfid, 0, attrs->ia_size, | 1177 | nfid, 0, attrs->ia_size, |
| @@ -1189,7 +1193,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) | |||
| 1189 | cifs_sb->mnt_cifs_flags & | 1193 | cifs_sb->mnt_cifs_flags & |
| 1190 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 1194 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
| 1191 | cFYI(1, ("SetEOF by path (setattrs) rc = %d", rc)); | 1195 | cFYI(1, ("SetEOF by path (setattrs) rc = %d", rc)); |
| 1192 | if(rc == -EINVAL) { | 1196 | if((rc == -EINVAL) || (rc == -EOPNOTSUPP)) { |
| 1193 | __u16 netfid; | 1197 | __u16 netfid; |
| 1194 | int oplock = FALSE; | 1198 | int oplock = FALSE; |
| 1195 | 1199 | ||
