diff options
Diffstat (limited to 'fs/cifs/inode.c')
-rw-r--r-- | fs/cifs/inode.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index f36b4e40e443..9c869a6dcba1 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
@@ -962,13 +962,21 @@ undo_setattr: | |||
962 | goto out_close; | 962 | goto out_close; |
963 | } | 963 | } |
964 | 964 | ||
965 | |||
966 | /* | ||
967 | * If dentry->d_inode is null (usually meaning the cached dentry | ||
968 | * is a negative dentry) then we would attempt a standard SMB delete, but | ||
969 | * if that fails we can not attempt the fall back mechanisms on EACESS | ||
970 | * but will return the EACESS to the caller. Note that the VFS does not call | ||
971 | * unlink on negative dentries currently. | ||
972 | */ | ||
965 | int cifs_unlink(struct inode *dir, struct dentry *dentry) | 973 | int cifs_unlink(struct inode *dir, struct dentry *dentry) |
966 | { | 974 | { |
967 | int rc = 0; | 975 | int rc = 0; |
968 | int xid; | 976 | int xid; |
969 | char *full_path = NULL; | 977 | char *full_path = NULL; |
970 | struct inode *inode = dentry->d_inode; | 978 | struct inode *inode = dentry->d_inode; |
971 | struct cifsInodeInfo *cifsInode = CIFS_I(inode); | 979 | struct cifsInodeInfo *cifs_inode; |
972 | struct super_block *sb = dir->i_sb; | 980 | struct super_block *sb = dir->i_sb; |
973 | struct cifs_sb_info *cifs_sb = CIFS_SB(sb); | 981 | struct cifs_sb_info *cifs_sb = CIFS_SB(sb); |
974 | struct cifsTconInfo *tcon = cifs_sb->tcon; | 982 | struct cifsTconInfo *tcon = cifs_sb->tcon; |
@@ -1012,7 +1020,7 @@ psx_del_no_retry: | |||
1012 | rc = cifs_rename_pending_delete(full_path, dentry, xid); | 1020 | rc = cifs_rename_pending_delete(full_path, dentry, xid); |
1013 | if (rc == 0) | 1021 | if (rc == 0) |
1014 | drop_nlink(inode); | 1022 | drop_nlink(inode); |
1015 | } else if (rc == -EACCES && dosattr == 0) { | 1023 | } else if ((rc == -EACCES) && (dosattr == 0) && inode) { |
1016 | attrs = kzalloc(sizeof(*attrs), GFP_KERNEL); | 1024 | attrs = kzalloc(sizeof(*attrs), GFP_KERNEL); |
1017 | if (attrs == NULL) { | 1025 | if (attrs == NULL) { |
1018 | rc = -ENOMEM; | 1026 | rc = -ENOMEM; |
@@ -1020,7 +1028,8 @@ psx_del_no_retry: | |||
1020 | } | 1028 | } |
1021 | 1029 | ||
1022 | /* try to reset dos attributes */ | 1030 | /* try to reset dos attributes */ |
1023 | origattr = cifsInode->cifsAttrs; | 1031 | cifs_inode = CIFS_I(inode); |
1032 | origattr = cifs_inode->cifsAttrs; | ||
1024 | if (origattr == 0) | 1033 | if (origattr == 0) |
1025 | origattr |= ATTR_NORMAL; | 1034 | origattr |= ATTR_NORMAL; |
1026 | dosattr = origattr & ~ATTR_READONLY; | 1035 | dosattr = origattr & ~ATTR_READONLY; |
@@ -1041,13 +1050,13 @@ psx_del_no_retry: | |||
1041 | 1050 | ||
1042 | out_reval: | 1051 | out_reval: |
1043 | if (inode) { | 1052 | if (inode) { |
1044 | cifsInode = CIFS_I(inode); | 1053 | cifs_inode = CIFS_I(inode); |
1045 | cifsInode->time = 0; /* will force revalidate to get info | 1054 | cifs_inode->time = 0; /* will force revalidate to get info |
1046 | when needed */ | 1055 | when needed */ |
1047 | inode->i_ctime = current_fs_time(sb); | 1056 | inode->i_ctime = current_fs_time(sb); |
1048 | } | 1057 | } |
1049 | dir->i_ctime = dir->i_mtime = current_fs_time(sb); | 1058 | dir->i_ctime = dir->i_mtime = current_fs_time(sb); |
1050 | cifsInode = CIFS_I(dir); | 1059 | cifs_inode = CIFS_I(dir); |
1051 | CIFS_I(dir)->time = 0; /* force revalidate of dir as well */ | 1060 | CIFS_I(dir)->time = 0; /* force revalidate of dir as well */ |
1052 | 1061 | ||
1053 | kfree(full_path); | 1062 | kfree(full_path); |