Fix build problem for older kernels which don't have i_alloc_sem.
Use MDS_{UP,DOWN}_{READ,WRITE}_ORPHAN_SEM() to lock the MDS orphan
information to avoid a confusing name conflict.
b=5700
#endif
#ifdef HAVE_I_ALLOC_SEM
-#define UP_WRITE_I_ALLOC_SEM(i) do { up_write(&(i)->i_alloc_sem); } while (0)
+#define UP_WRITE_I_ALLOC_SEM(i) do { up_write(&(i)->i_alloc_sem); } while (0)
#define DOWN_WRITE_I_ALLOC_SEM(i) do { down_write(&(i)->i_alloc_sem); } while(0)
-#define LASSERT_MDS_ORPHAN_WRITE_LOCKED(i) LASSERT(down_read_trylock(&(i)->i_alloc_sem) == 0)
+#define LASSERT_I_ALLOC_SEM_WRITE_LOCKED(i) LASSERT(down_read_trylock(&(i)->i_alloc_sem) == 0)
-#define UP_READ_I_ALLOC_SEM(i) do { up_read(&(i)->i_alloc_sem); } while (0)
-#define DOWN_READ_I_ALLOC_SEM(i) do { down_read(&(i)->i_alloc_sem); } while (0)
-#define LASSERT_MDS_ORPHAN_READ_LOCKED(i) LASSERT(down_write_trylock(&(i)->i_alloc_sem) == 0)
-#define MDS_PACK_MD_LOCK 1
+#define UP_READ_I_ALLOC_SEM(i) do { up_read(&(i)->i_alloc_sem); } while (0)
+#define DOWN_READ_I_ALLOC_SEM(i) do { down_read(&(i)->i_alloc_sem); } while (0)
+#define LASSERT_I_ALLOC_SEM_READ_LOCKED(i) LASSERT(down_write_trylock(&(i)->i_alloc_sem) == 0)
#else
-#define UP_READ_I_ALLOC_SEM(i) do { up(&(i)->i_sem); } while (0)
-#define DOWN_READ_I_ALLOC_SEM(i) do { down(&(i)->i_sem); } while (0)
-#define LASSERT_MDS_ORPHAN_READ_LOCKED(i) LASSERT(down_trylock(&(i)->i_sem) != 0)
-
-#define UP_WRITE_I_ALLOC_SEM(i) do { up(&(i)->i_sem); } while (0)
-#define DOWN_WRITE_I_ALLOC_SEM(i) do { down(&(i)->i_sem); } while (0)
-#define LASSERT_MDS_ORPHAN_WRITE_LOCKED(i) LASSERT(down_trylock(&(i)->i_sem) != 0)
-#define MDS_PACK_MD_LOCK 0
+#define UP_READ_I_ALLOC_SEM(i) do { } while (0)
+#define DOWN_READ_I_ALLOC_SEM(i) do { } while (0)
+#define LASSERT_I_ALLOC_SEM_READ_LOCKED(i) do { } while (0)
+
+#define UP_WRITE_I_ALLOC_SEM(i) do { } while (0)
+#define DOWN_WRITE_I_ALLOC_SEM(i) do { } while (0)
+#define LASSERT_I_ALLOC_SEM_WRITE_LOCKED(i) do { } while (0)
#endif
#ifndef HAVE_GRAB_CACHE_PAGE_NOWAIT_GFP
/* bug 1639: avoid write/truncate i_sem/DLM deadlock */
LASSERT(atomic_read(&inode->i_sem.count) <= 0);
up(&inode->i_sem);
- up_write(&inode->i_alloc_sem);
+ UP_WRITE_I_ALLOC_SEM(inode);
rc = ll_extent_lock(NULL, inode, lsm, LCK_PW, &policy, &lockh,
ast_flags);
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
- down_write(&inode->i_alloc_sem);
+ DOWN_WRITE_I_ALLOC_SEM(inode);
down(&inode->i_sem);
#else
down(&inode->i_sem);
- down_write(&inode->i_alloc_sem);
+ DOWN_WRITE_I_ALLOC_SEM(inode);
#endif
if (rc != 0)
RETURN(rc);
/* We need to drop the semaphore here, because this unlock may
* result in a cancellation, which will need the i_sem */
up(&inode->i_sem);
- up_write(&inode->i_alloc_sem);
+ UP_WRITE_I_ALLOC_SEM(inode);
/* unlock now as we don't mind others file lockers racing with
* the mds updates below? */
err = ll_extent_unlock(NULL, inode, lsm, LCK_PW, &lockh);
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
- down_write(&inode->i_alloc_sem);
+ DOWN_WRITE_I_ALLOC_SEM(inode);
down(&inode->i_sem);
#else
down(&inode->i_sem);
- down_write(&inode->i_alloc_sem);
+ DOWN_WRITE_I_ALLOC_SEM(inode);
#endif
if (err) {
CERROR("ll_extent_unlock failed: %d\n", err);
dentry->d_name.len, dentry->d_name.name,
ll_bdevname(dentry->d_inode->i_sb, btmp),
dentry->d_inode->i_ino);
- /* child inode->i_alloc_sem protects orphan_dec_test and
+ /* child orphan sem protects orphan_dec_test and
* is_orphan race, mds_mfd_close drops it */
- DOWN_WRITE_I_ALLOC_SEM(dentry->d_inode);
+ MDS_DOWN_WRITE_ORPHAN_SEM(dentry->d_inode);
rc = mds_mfd_close(NULL, obd, mfd,
!(export->exp_flags & OBD_OPT_FAILOVER));
# define mds_inode_oatomic(inode) ((inode)->i_attr_flags)
#endif
+#ifdef HAVE_I_ALLOC_SEM
+#define MDS_UP_READ_ORPHAN_SEM(i) UP_READ_I_ALLOC_SEM(i)
+#define MDS_DOWN_READ_ORPHAN_SEM(i) DOWN_READ_I_ALLOC_SEM(i)
+#define LASSERT_MDS_ORPHAN_READ_LOCKED(i) LASSERT_I_ALLOC_SEM_READ_LOCKED(i)
+
+#define MDS_UP_WRITE_ORPHAN_SEM(i) UP_WRITE_I_ALLOC_SEM(i)
+#define MDS_DOWN_WRITE_ORPHAN_SEM(i) DOWN_WRITE_I_ALLOC_SEM(i)
+#define LASSERT_MDS_ORPHAN_WRITE_LOCKED(i) LASSERT_I_ALLOC_SEM_WRITE_LOCKED(i)
+#define MDS_PACK_MD_LOCK 1
+#else
+#define MDS_UP_READ_ORPHAN_SEM(i) do { up(&(i)->i_sem); } while (0)
+#define MDS_DOWN_READ_ORPHAN_SEM(i) do { down(&(i)->i_sem); } while (0)
+#define LASSERT_MDS_ORPHAN_READ_LOCKED(i) LASSERT(down_trylock(&(i)->i_sem)!=0)
+
+#define MDS_UP_WRITE_ORPHAN_SEM(i) do { up(&(i)->i_sem); } while (0)
+#define MDS_DOWN_WRITE_ORPHAN_SEM(i) do { down(&(i)->i_sem); } while (0)
+#define LASSERT_MDS_ORPHAN_WRITE_LOCKED(i) LASSERT(down_trylock(&(i)->i_sem)!=0)
+#define MDS_PACK_MD_LOCK 0
+#endif
+
static inline int mds_orphan_open_count(struct inode *inode)
{
LASSERT_MDS_ORPHAN_READ_LOCKED(inode);
}
#define mds_inode_is_orphan(inode) ((inode)->i_flags & 0x4000000)
-#define mds_inode_set_orphan(inode) \
-do { \
- (inode)->i_flags |= 0x4000000; \
- CDEBUG(D_VFSTRACE, "setting orphan flag on inode %p\n", inode); \
-} while (0)
-#define mds_inode_unset_orphan(inode) \
-do { \
- (inode)->i_flags &= ~(0x4000000); \
- CDEBUG(D_VFSTRACE, "removing orphan flag from inode %p\n", inode); \
-} while (0)
+
+static inline void mds_inode_set_orphan(struct inode *inode)
+{
+ inode->i_flags |= 0x4000000;
+ CDEBUG(D_VFSTRACE, "setting orphan flag on inode %p\n", inode);
+}
+
+static inline void mds_inode_unset_orphan(struct inode *inode)
+{
+ inode->i_flags &= ~(0x4000000);
+ CDEBUG(D_VFSTRACE, "removing orphan flag from inode %p\n", inode);
+}
+
#endif /* __KERNEL__ */
#define MDS_CHECK_RESENT(req, reconstruct) \
dget(dentry);
/* Mark the file as open to handle open-unlink. */
- DOWN_WRITE_I_ALLOC_SEM(dentry->d_inode);
+ MDS_DOWN_WRITE_ORPHAN_SEM(dentry->d_inode);
mds_orphan_open_inc(dentry->d_inode);
- UP_WRITE_I_ALLOC_SEM(dentry->d_inode);
+ MDS_UP_WRITE_ORPHAN_SEM(dentry->d_inode);
mfd->mfd_mode = flags;
mfd->mfd_dentry = dentry;
last_orphan = mds_orphan_open_dec_test(inode) &&
mds_inode_is_orphan(inode);
- UP_WRITE_I_ALLOC_SEM(inode);
+ MDS_UP_WRITE_ORPHAN_SEM(inode);
/* this is half of the actual "close" */
if (mfd->mfd_mode & FMODE_WRITE) {
}
inode = mfd->mfd_dentry->d_inode;
- /* child i_alloc_sem protects orphan_dec_test && is_orphan race */
- DOWN_WRITE_I_ALLOC_SEM(inode); /* mds_mfd_close drops this */
+ /* child orphan sem protects orphan_dec_test && is_orphan race */
+ MDS_DOWN_WRITE_ORPHAN_SEM(inode); /* mds_mfd_close drops this */
if (mds_inode_is_orphan(inode) && mds_orphan_open_count(inode) == 1) {
body = lustre_msg_buf(req->rq_repmsg, 0, sizeof (*body));
LASSERT(body != NULL);
body = lustre_msg_buf(req->rq_repmsg, offset, sizeof (*body));
LASSERT(body != NULL);
- /* child i_alloc_sem protects orphan_dec_test && is_orphan race */
- DOWN_READ_I_ALLOC_SEM(child_inode);
- cleanup_phase = 4; /* up(&child_inode->i_sem) when finished */
+ /* child orphan sem protects orphan_dec_test && is_orphan race */
+ MDS_DOWN_READ_ORPHAN_SEM(child_inode);
+ cleanup_phase = 4; /* MDS_UP_READ_ORPHAN_SEM(new_inode) when finished */
/* If this is potentially the last reference to this inode, get the
* OBD EA data first so the client can destroy OST objects. We
case 5: /* pending_dir semaphore */
up(&mds->mds_pending_dir->d_inode->i_sem);
case 4: /* child inode semaphore */
- UP_READ_I_ALLOC_SEM(child_inode);
+ MDS_UP_READ_ORPHAN_SEM(child_inode);
case 3: /* child ino-reuse lock */
if (rc && body != NULL) {
// Don't unlink the OST objects if the MDS unlink failed
body = lustre_msg_buf(req->rq_repmsg, 0, sizeof (*body));
LASSERT(body != NULL);
- /* child i_alloc_sem protects orphan_dec_test && is_orphan race */
- DOWN_READ_I_ALLOC_SEM(new_inode);
- cleanup_phase = 3; /* up(&new_inode->i_sem) when finished */
+ /* child orphan sem protects orphan_dec_test && is_orphan race */
+ MDS_DOWN_READ_ORPHAN_SEM(new_inode);
+ cleanup_phase = 3; /* MDS_UP_READ_ORPHAN_SEM(new_inode) when finished */
if ((S_ISDIR(new_inode->i_mode) && new_inode->i_nlink == 2) ||
new_inode->i_nlink == 1) {
case 4:
up(&mds->mds_pending_dir->d_inode->i_sem);
case 3:
- UP_READ_I_ALLOC_SEM(new_inode);
+ MDS_UP_READ_ORPHAN_SEM(new_inode);
case 2:
iput(new_inode);
case 1:
}
child_inode = dchild->d_inode;
- DOWN_READ_I_ALLOC_SEM(child_inode);
+ MDS_DOWN_READ_ORPHAN_SEM(child_inode);
if (mds_inode_is_orphan(child_inode) &&
mds_orphan_open_count(child_inode)) {
- UP_READ_I_ALLOC_SEM(child_inode);
+ MDS_UP_READ_ORPHAN_SEM(child_inode);
CWARN("orphan %s re-opened during recovery\n", d_name);
GOTO(next, rc = 0);
}
- UP_READ_I_ALLOC_SEM(child_inode);
+ MDS_UP_READ_ORPHAN_SEM(child_inode);
rc = mds_unlink_orphan(obd, dchild, child_inode, pending_dir);
if (rc == 0) {