diff --git a/lustre/ChangeLog b/lustre/ChangeLog index 08d2243a20ca264faf5228557c224f90ed600a06..7907f6e55f64cad56dfd463f3b9270b127c3e06e 100644 --- a/lustre/ChangeLog +++ b/lustre/ChangeLog @@ -22,6 +22,7 @@ tbd Cluster File Systems, Inc. <info@clusterfs.com> - better error messages when a client is rejected during recovery (1505) - avoid cancelling locks which were never granted, after failure (2330) - fix i_sem/journal inversion in mds_client_add (2333) + - fix truncate/getattr lock cycle deadlock (2334) * miscellania - allow configurable automake binary, for testing new versions - small update to the lfs documentation diff --git a/lustre/llite/dcache.c b/lustre/llite/dcache.c index 9dba881179a43b4ea5592bff647f8ba7862d745c..d82b47bfa8edf3b2cd7c448a8c5487cc271bb035 100644 --- a/lustre/llite/dcache.c +++ b/lustre/llite/dcache.c @@ -157,8 +157,8 @@ void ll_lookup_finish_locks(struct lookup_intent *it, struct dentry *dentry) mdc_set_lock_data(&it->d.lustre.it_lock_handle, inode); } - /* drop IT_LOOKUP locks */ - if (it->it_op == IT_LOOKUP) + /* drop lookup or getattr locks immediately */ + if (it->it_op == IT_LOOKUP || it->it_op == IT_GETATTR) ll_intent_release(it); } diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c index d093a9316973c7692bd45bd0fd974e3e5522cde2..bba3a0cb75dd1f2cfbee0142d1006479fa84081d 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -1076,21 +1076,21 @@ void ll_read_inode2(struct inode *inode, void *opaque) } else { inode->i_op = &ll_special_inode_operations; #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) - init_special_inode(inode, inode->i_mode, + init_special_inode(inode, inode->i_mode, kdev_t_to_nr(inode->i_rdev)); #else init_special_inode(inode, inode->i_mode, inode->i_rdev); - + lli->ll_save_ifop = inode->i_fop; if (S_ISCHR(inode->i_mode)) { - inode->i_fop = &ll_special_chr_inode_fops; - }else if (S_ISBLK(inode->i_mode)) { - inode->i_fop = &ll_special_blk_inode_fops; - }else if (S_ISFIFO(inode->i_mode)){ + inode->i_fop = &ll_special_chr_inode_fops; + } else if (S_ISBLK(inode->i_mode)) { + inode->i_fop = &ll_special_blk_inode_fops; + } else if (S_ISFIFO(inode->i_mode)) { inode->i_fop = &ll_special_fifo_inode_fops; - }else if (S_ISSOCK(inode->i_mode)){ + } else if (S_ISSOCK(inode->i_mode)) { inode->i_fop = &ll_special_sock_inode_fops; - } + } inode->i_fop->owner = lli->ll_save_ifop->owner; #endif EXIT; @@ -1098,7 +1098,7 @@ void ll_read_inode2(struct inode *inode, void *opaque) } int ll_iocontrol(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) + unsigned int cmd, unsigned long arg) { struct ll_sb_info *sbi = ll_i2sbi(inode); struct ptlrpc_request *req = NULL;