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 | ||