|
@@ -1032,6 +1032,65 @@ struct inode *iget_locked(struct super_block *sb, unsigned long ino)
|
|
|
|
|
|
EXPORT_SYMBOL(iget_locked);
|
|
EXPORT_SYMBOL(iget_locked);
|
|
|
|
|
|
|
|
+int insert_inode_locked(struct inode *inode)
|
|
|
|
+{
|
|
|
|
+ struct super_block *sb = inode->i_sb;
|
|
|
|
+ ino_t ino = inode->i_ino;
|
|
|
|
+ struct hlist_head *head = inode_hashtable + hash(sb, ino);
|
|
|
|
+ struct inode *old;
|
|
|
|
+
|
|
|
|
+ inode->i_state |= I_LOCK|I_NEW;
|
|
|
|
+ while (1) {
|
|
|
|
+ spin_lock(&inode_lock);
|
|
|
|
+ old = find_inode_fast(sb, head, ino);
|
|
|
|
+ if (likely(!old)) {
|
|
|
|
+ hlist_add_head(&inode->i_hash, head);
|
|
|
|
+ spin_unlock(&inode_lock);
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+ __iget(old);
|
|
|
|
+ spin_unlock(&inode_lock);
|
|
|
|
+ wait_on_inode(old);
|
|
|
|
+ if (unlikely(!hlist_unhashed(&old->i_hash))) {
|
|
|
|
+ iput(old);
|
|
|
|
+ return -EBUSY;
|
|
|
|
+ }
|
|
|
|
+ iput(old);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+EXPORT_SYMBOL(insert_inode_locked);
|
|
|
|
+
|
|
|
|
+int insert_inode_locked4(struct inode *inode, unsigned long hashval,
|
|
|
|
+ int (*test)(struct inode *, void *), void *data)
|
|
|
|
+{
|
|
|
|
+ struct super_block *sb = inode->i_sb;
|
|
|
|
+ struct hlist_head *head = inode_hashtable + hash(sb, hashval);
|
|
|
|
+ struct inode *old;
|
|
|
|
+
|
|
|
|
+ inode->i_state |= I_LOCK|I_NEW;
|
|
|
|
+
|
|
|
|
+ while (1) {
|
|
|
|
+ spin_lock(&inode_lock);
|
|
|
|
+ old = find_inode(sb, head, test, data);
|
|
|
|
+ if (likely(!old)) {
|
|
|
|
+ hlist_add_head(&inode->i_hash, head);
|
|
|
|
+ spin_unlock(&inode_lock);
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+ __iget(old);
|
|
|
|
+ spin_unlock(&inode_lock);
|
|
|
|
+ wait_on_inode(old);
|
|
|
|
+ if (unlikely(!hlist_unhashed(&old->i_hash))) {
|
|
|
|
+ iput(old);
|
|
|
|
+ return -EBUSY;
|
|
|
|
+ }
|
|
|
|
+ iput(old);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+EXPORT_SYMBOL(insert_inode_locked4);
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* __insert_inode_hash - hash an inode
|
|
* __insert_inode_hash - hash an inode
|
|
* @inode: unhashed inode
|
|
* @inode: unhashed inode
|