@@ -878,6 +878,10 @@ void smb2_deferred_work_close(struct work_struct *work)
878878 struct cifsFileInfo , deferred .work );
879879
880880 spin_lock (& CIFS_I (d_inode (cfile -> dentry ))-> deferred_lock );
881+ if (!cfile -> deferred_scheduled ) {
882+ spin_unlock (& CIFS_I (d_inode (cfile -> dentry ))-> deferred_lock );
883+ return ;
884+ }
881885 cifs_del_deferred_close (cfile );
882886 cfile -> deferred_scheduled = false;
883887 spin_unlock (& CIFS_I (d_inode (cfile -> dentry ))-> deferred_lock );
@@ -1987,8 +1991,10 @@ cifs_write(struct cifsFileInfo *open_file, __u32 pid, const char *write_data,
19871991
19881992 if (total_written > 0 ) {
19891993 spin_lock (& d_inode (dentry )-> i_lock );
1990- if (* offset > d_inode (dentry )-> i_size )
1994+ if (* offset > d_inode (dentry )-> i_size ) {
19911995 i_size_write (d_inode (dentry ), * offset );
1996+ d_inode (dentry )-> i_blocks = (512 - 1 + * offset ) >> 9 ;
1997+ }
19921998 spin_unlock (& d_inode (dentry )-> i_lock );
19931999 }
19942000 mark_inode_dirty_sync (d_inode (dentry ));
@@ -2647,8 +2653,10 @@ static int cifs_write_end(struct file *file, struct address_space *mapping,
26472653
26482654 if (rc > 0 ) {
26492655 spin_lock (& inode -> i_lock );
2650- if (pos > inode -> i_size )
2656+ if (pos > inode -> i_size ) {
26512657 i_size_write (inode , pos );
2658+ inode -> i_blocks = (512 - 1 + pos ) >> 9 ;
2659+ }
26522660 spin_unlock (& inode -> i_lock );
26532661 }
26542662
@@ -4864,19 +4872,19 @@ void cifs_oplock_break(struct work_struct *work)
48644872 cinode );
48654873 cifs_dbg (FYI , "Oplock release rc = %d\n" , rc );
48664874 }
4867- _cifsFileInfo_put (cfile , false /* do not wait for ourself */ , false);
48684875 /*
48694876 * When oplock break is received and there are no active
48704877 * file handles but cached, then set the flag oplock_break_received.
48714878 * So, new open will not use cached handle.
48724879 */
48734880 spin_lock (& CIFS_I (inode )-> deferred_lock );
48744881 is_deferred = cifs_is_deferred_close (cfile , & dclose );
4875- if (is_deferred ) {
4882+ if (is_deferred && cfile -> deferred_scheduled ) {
48764883 cfile -> oplock_break_received = true;
48774884 mod_delayed_work (deferredclose_wq , & cfile -> deferred , 0 );
48784885 }
48794886 spin_unlock (& CIFS_I (inode )-> deferred_lock );
4887+ _cifsFileInfo_put (cfile , false /* do not wait for ourself */ , false);
48804888 cifs_done_oplock_break (cinode );
48814889}
48824890
0 commit comments