Whamcloud - gitweb
LU-981 llite: fix loop back device writeback
authorJinshan Xiong <jinshan.xiong@whamcloud.com>
Wed, 25 Jan 2012 07:13:26 +0000 (23:13 -0800)
committerOleg Drokin <green@whamcloud.com>
Fri, 16 Mar 2012 22:06:17 +0000 (18:06 -0400)
In vvp_mmap_locks(), we should distinguish if the write is from
loopback device, and to not try to find mmap region in this case.

Signed-off-by: Jinshan Xiong <jinshan.xiong@whamcloud.com>
Change-Id: I4409e460b77576e07e279200ccc69f62cc48ad0f
Reviewed-on: http://review.whamcloud.com/2010
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Mike Pershin <tappro@whamcloud.com>
Reviewed-by: Johann Lombardi <johann@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/llite/lloop.c
lustre/llite/vvp_io.c

index df95d71..7e06f3b 100644 (file)
@@ -647,15 +647,16 @@ static int lo_ioctl(struct block_device *bdev, fmode_t mode,
                     unsigned int cmd, unsigned long arg)
 {
         struct lloop_device *lo = bdev->bd_disk->private_data;
                     unsigned int cmd, unsigned long arg)
 {
         struct lloop_device *lo = bdev->bd_disk->private_data;
-        struct inode *inode = lo->lo_backing_file->f_dentry->d_inode;
+        struct inode *inode = NULL;
+        int err = 0;
 #else
 static int lo_ioctl(struct inode *inode, struct file *unused,
                     unsigned int cmd, unsigned long arg)
 {
         struct lloop_device *lo = inode->i_bdev->bd_disk->private_data;
         struct block_device *bdev = inode->i_bdev;
 #else
 static int lo_ioctl(struct inode *inode, struct file *unused,
                     unsigned int cmd, unsigned long arg)
 {
         struct lloop_device *lo = inode->i_bdev->bd_disk->private_data;
         struct block_device *bdev = inode->i_bdev;
-#endif
         int err = 0;
         int err = 0;
+#endif
 
         cfs_down(&lloop_mutex);
         switch (cmd) {
 
         cfs_down(&lloop_mutex);
         switch (cmd) {
@@ -669,6 +670,9 @@ static int lo_ioctl(struct inode *inode, struct file *unused,
         case LL_IOC_LLOOP_INFO: {
                 struct lu_fid fid;
 
         case LL_IOC_LLOOP_INFO: {
                 struct lu_fid fid;
 
+                LASSERT(lo->lo_backing_file != NULL);
+                if (inode == NULL)
+                        inode = lo->lo_backing_file->f_dentry->d_inode;
                 if (lo->lo_state == LLOOP_BOUND)
                         fid = ll_i2info(inode)->lli_fid;
                 else
                 if (lo->lo_state == LLOOP_BOUND)
                         fid = ll_i2info(inode)->lli_fid;
                 else
index f0bd1b6..253d13a 100644 (file)
@@ -146,6 +146,9 @@ static int vvp_mmap_locks(const struct lu_env *env,
         if (!cl_is_normalio(env, io))
                 RETURN(0);
 
         if (!cl_is_normalio(env, io))
                 RETURN(0);
 
+        if (vio->cui_iov == NULL) /* nfs or loop back device write */
+                RETURN(0);
+
         for (seg = 0; seg < vio->cui_nrsegs; seg++) {
                 const struct iovec *iv = &vio->cui_iov[seg];
 
         for (seg = 0; seg < vio->cui_nrsegs; seg++) {
                 const struct iovec *iv = &vio->cui_iov[seg];