From: Jinshan Xiong Date: Wed, 25 Jan 2012 07:13:26 +0000 (-0800) Subject: LU-981 llite: fix loop back device writeback X-Git-Tag: 2.2.51~53 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=56e56ed49fc5392048872e4b9502a4ea66be2d90 LU-981 llite: fix loop back device writeback 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 Change-Id: I4409e460b77576e07e279200ccc69f62cc48ad0f Reviewed-on: http://review.whamcloud.com/2010 Tested-by: Hudson Tested-by: Maloo Reviewed-by: Mike Pershin Reviewed-by: Johann Lombardi Reviewed-by: Oleg Drokin --- diff --git a/lustre/llite/lloop.c b/lustre/llite/lloop.c index df95d71..7e06f3b 100644 --- a/lustre/llite/lloop.c +++ b/lustre/llite/lloop.c @@ -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; - 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; -#endif int err = 0; +#endif 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; + 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 diff --git a/lustre/llite/vvp_io.c b/lustre/llite/vvp_io.c index f0bd1b6..253d13a 100644 --- a/lustre/llite/vvp_io.c +++ b/lustre/llite/vvp_io.c @@ -146,6 +146,9 @@ static int vvp_mmap_locks(const struct lu_env *env, 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];