Whamcloud - gitweb
LU-3066 llite: fix crash in fdatasync(directory)
authorDmitry Eremin <dmitry.eremin@intel.com>
Fri, 29 Mar 2013 11:22:21 +0000 (15:22 +0400)
committerOleg Drokin <oleg.drokin@intel.com>
Sun, 31 Mar 2013 20:52:29 +0000 (16:52 -0400)
kernel NULL pointer dereference for fdatasync(directory)

fd = open("/mnt/lustre", O_RDONLY|O_NONBLOCK|O_DIRECTORY);
fdatasync(fd);
close(fd);

Signed-off-by: Dmitry Eremin <dmitry.eremin@intel.com>
Change-Id: Ib14b25d1694131e1a65373654008b7f337ce959e
Reviewed-on: http://review.whamcloud.com/5886
Tested-by: Hudson
Reviewed-by: Faccini Bruno <bruno.faccini@intel.com>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/llite/file.c
lustre/tests/sanity.sh

index bd0e91f..fe4f03c 100644 (file)
@@ -2417,15 +2417,15 @@ int cl_sync_file_range(struct inode *inode, loff_t start, loff_t end,
  */
 
 #ifdef HAVE_FILE_FSYNC_4ARGS
  */
 
 #ifdef HAVE_FILE_FSYNC_4ARGS
-int ll_fsync(struct file *file, loff_t start, loff_t end, int data)
+int ll_fsync(struct file *file, loff_t start, loff_t end, int datasync)
 {
        struct dentry *dentry = file->f_dentry;
 #elif defined(HAVE_FILE_FSYNC_2ARGS)
 {
        struct dentry *dentry = file->f_dentry;
 #elif defined(HAVE_FILE_FSYNC_2ARGS)
-int ll_fsync(struct file *file, int data)
+int ll_fsync(struct file *file, int datasync)
 {
        struct dentry *dentry = file->f_dentry;
 #else
 {
        struct dentry *dentry = file->f_dentry;
 #else
-int ll_fsync(struct file *file, struct dentry *dentry, int data)
+int ll_fsync(struct file *file, struct dentry *dentry, int datasync)
 {
 #endif
         struct inode *inode = dentry->d_inode;
 {
 #endif
         struct inode *inode = dentry->d_inode;
@@ -2469,7 +2469,7 @@ int ll_fsync(struct file *file, struct dentry *dentry, int data)
         if (!err)
                 ptlrpc_req_finished(req);
 
         if (!err)
                 ptlrpc_req_finished(req);
 
-       if (data) {
+       if (datasync && S_ISREG(inode->i_mode)) {
                struct ll_file_data *fd = LUSTRE_FPRIVATE(file);
 
                err = cl_sync_file_range(inode, 0, OBD_OBJECT_EOF,
                struct ll_file_data *fd = LUSTRE_FPRIVATE(file);
 
                err = cl_sync_file_range(inode, 0, OBD_OBJECT_EOF,
index ae3151f..7685c77 100644 (file)
@@ -6982,6 +6982,15 @@ test_118l()
 }
 run_test 118l "fsync dir ========="
 
 }
 run_test 118l "fsync dir ========="
 
+test_118m() # LU-3066
+{
+       [ $PARALLEL == "yes" ] && skip "skip parallel run" && return
+       test_mkdir -p $DIR/$tdir
+       $MULTIOP $DIR/$tdir DY || error "fdatasync dir failed"
+       rm -rf $DIR/$tdir
+}
+run_test 118m "fdatasync dir ========="
+
 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
 
 test_119a() # bug 11737
 [ "$SLOW" = "no" ] && [ -n "$OLD_RESENDCOUNT" ] && set_resend_count $OLD_RESENDCOUNT
 
 test_119a() # bug 11737