[DRBD-cvs] svn commit by lars - r2638 - in trunk: drbd drbd/linux
user - * remove bd_claim/bd_release of ourselves (the drbd dev
drbd-cvs at lists.linbit.com
drbd-cvs at lists.linbit.com
Wed Dec 20 15:41:54 CET 2006
Author: lars
Date: 2006-12-20 15:41:51 +0100 (Wed, 20 Dec 2006)
New Revision: 2638
Modified:
trunk/drbd/drbd_compat_wrappers.h
trunk/drbd/drbd_int.h
trunk/drbd/drbd_main.c
trunk/drbd/drbd_nl.c
trunk/drbd/drbd_req.c
trunk/drbd/linux/drbd.h
trunk/user/drbdmeta.c
trunk/user/drbdsetup.c
trunk/user/drbdtool_common.c
trunk/user/drbdtool_common.h
Log:
* remove bd_claim/bd_release of ourselves (the drbd device);
since we now can fail in open(), we no longer need this to
protect against bogus accesses
* changed error return code for unsucessful try to switch to Secondary
from "FailedToClaimMyself" to "DeviceInUse"
* remove "disable_bd_claim" module parameter,
added "allow_oos" (allow open on secondary) instead.
comment stays as "don't use"; I'm tempted to remove this "feature".
* fix cleanup code in drbd_nl_disk_conf
in some error goto branches, it did just "forget" to bd_release the
previously claimed lower lever / meta data devices
* fix v07 style fixed size indexed external meta data
* fix drbd_fail_early disk state check: no good data when < UpToDate
* fix drbdsetup / drbdmeta to use the locking code again to avoid races with
each other; make them properly recognize configured devices again.
* Known issues
still no working storage size limit check,
we might just overflow somewhere...
race: someone might open a device that is about to be switched to Secondary
after the check for "open_cnt == 0", but just before it actually changed state.
we need some flag there to avoid this.
Modified: trunk/drbd/drbd_compat_wrappers.h
===================================================================
--- trunk/drbd/drbd_compat_wrappers.h 2006-12-20 11:49:02 UTC (rev 2637)
+++ trunk/drbd/drbd_compat_wrappers.h 2006-12-20 14:41:51 UTC (rev 2638)
@@ -37,6 +37,7 @@
/* Returns the number of 512 byte sectors of the device */
static inline sector_t drbd_get_capacity(struct block_device *bdev)
{
+ /* return bdev ? get_capacity(bdev->bd_disk) : 0; */
return bdev ? bdev->bd_inode->i_size >> 9 : 0;
}
@@ -44,6 +45,7 @@
static inline void drbd_set_my_capacity(drbd_dev *mdev,
sector_t size)
{
+ /* set_capacity(mdev->this_bdev->bd_disk, size); */
set_capacity(mdev->vdisk,size);
mdev->this_bdev->bd_inode->i_size = (loff_t)size << 9;
}
Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h 2006-12-20 11:49:02 UTC (rev 2637)
+++ trunk/drbd/drbd_int.h 2006-12-20 14:41:51 UTC (rev 2638)
@@ -39,7 +39,7 @@
// module parameter, defined in drbd_main.c
extern int minor_count;
-extern int disable_bd_claim;
+extern int allow_oos;
extern int major_nr;
extern int use_nbd_major;
@@ -1267,7 +1267,7 @@
// drbd_nl.c
-extern char* ppsize(char* buf, size_t size);
+extern char* ppsize(char* buf, unsigned long long size);
extern sector_t drbd_new_dev_size(struct Drbd_Conf*, struct drbd_backing_dev*);
extern int drbd_determin_dev_size(drbd_dev*);
extern void drbd_setup_queue_param(drbd_dev *mdev, unsigned int);
@@ -1305,6 +1305,25 @@
extern void resync_timer_fn(unsigned long data);
+#if 0
+#define BD_CLAIM(bdev,holder) ({ \
+ int r = bd_claim(bdev,holder); \
+ printk(KERN_INFO "drbd: %u = bd_claim(%p,%p); [%p;%u]\n", \
+ r, bdev, holder, bdev->bd_holder, bdev->bd_holders); \
+ r; })
+
+#define BD_RELEASE(bdev) do { \
+ printk(KERN_INFO "drbd: pre: bd_release(%p); [%p;%u]\n", \
+ bdev, bdev->bd_holder, bdev->bd_holders); \
+ bd_release(bdev); \
+ printk(KERN_INFO "drbd: post: bd_release(%p); [%p;%u]\n", \
+ bdev, bdev->bd_holder, bdev->bd_holders); \
+ } while (0)
+#else
+#define BD_CLAIM(bdev,holder) bd_claim(bdev,holder)
+#define BD_RELEASE(bdev) bd_release(bdev)
+#endif
+
// drbd_receiver.c
extern int drbd_release_ee(drbd_dev* mdev,struct list_head* list);
extern struct Tl_epoch_entry* drbd_alloc_ee(drbd_dev *mdev,
Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c 2006-12-20 11:49:02 UTC (rev 2637)
+++ trunk/drbd/drbd_main.c 2006-12-20 14:41:51 UTC (rev 2638)
@@ -85,12 +85,12 @@
MODULE_ALIAS_BLOCKDEV_MAJOR(LANANA_DRBD_MAJOR);
#include <linux/moduleparam.h>
-MODULE_PARM_DESC(disable_bd_claim, "DONT USE! disables block device claiming" );
+/* allow_open_on_secondary */
+MODULE_PARM_DESC(allow_oos, "DONT USE!");
/* thanks to these macros, if compiled into the kernel (not-module),
- * this becomes the boot parameter drbd.minor_count
- */
-module_param(minor_count, int,0);
-module_param(disable_bd_claim,bool,0);
+ * this becomes the boot parameter drbd.minor_count */
+module_param(minor_count, int,0);
+module_param(allow_oos, bool,0);
#ifdef DRBD_ENABLE_FAULTS
int enable_faults = 0;
@@ -105,7 +105,7 @@
int major_nr = LANANA_DRBD_MAJOR;
int minor_count = 32;
-int disable_bd_claim = 0;
+int allow_oos = 0;
#ifdef ENABLE_DYNAMIC_TRACE
int trace_type = 0; // Bitmap of trace types to enable
@@ -1839,16 +1839,21 @@
mdev = minor_to_mdev(MINOR(inode->i_rdev));
if(!mdev) return -ENODEV;
- if( mdev->state.role == Secondary && !disable_bd_claim) {
+ /* we might allow read-only open on non-Primary */
+ if( mdev->state.role != Primary && !allow_oos) {
return -EMEDIUMTYPE;
}
+ /* but we cannot allow writes on non-Primary */
if (file->f_mode & FMODE_WRITE) {
- if( mdev->state.role == Secondary) {
+ if( mdev->state.role != Primary) {
return -EROFS;
}
set_bit(WRITER_PRESENT, &mdev->flags);
}
+ /* FIXME race with Primary -> Secondary
+ * state change */
+
mdev->open_cnt++;
return 0;
@@ -2196,10 +2201,7 @@
if (*q) blk_put_queue(*q);
*q = NULL;
- if (mdev->this_bdev->bd_holder == drbd_sec_holder) {
- mdev->this_bdev->bd_contains = mdev->this_bdev;
- bd_release(mdev->this_bdev);
- }
+ D_ASSERT(mdev->open_cnt == 0);
if (mdev->this_bdev) bdput(mdev->this_bdev);
tl_cleanup(mdev);
@@ -2299,16 +2301,10 @@
sprintf(disk->disk_name, DEVICE_NAME "%d", minor);
disk->private_data = mdev;
add_disk(disk);
-
+
mdev->this_bdev = bdget(MKDEV(MAJOR_NR,minor));
// we have no partitions. we contain only ourselves.
mdev->this_bdev->bd_contains = mdev->this_bdev;
- if (bd_claim(mdev->this_bdev,drbd_sec_holder)) {
- // Initial we are Secondary -> should claim myself.
- WARN("Could not bd_claim() myself.");
- } else if (disable_bd_claim) {
- bd_release(mdev->this_bdev);
- }
blk_queue_make_request(q, drbd_make_request_26);
blk_queue_merge_bvec(q, drbd_merge_bvec);
@@ -2446,6 +2442,7 @@
API_VERSION,PRO_VERSION);
printk(KERN_INFO DEVICE_NAME ": %s\n", drbd_buildtag());
printk(KERN_INFO DEVICE_NAME": registered as block device major %d\n", MAJOR_NR);
+ printk(KERN_INFO DEVICE_NAME": minor_table @ 0x%p\n", minor_table);
return 0; // Success!
@@ -2462,8 +2459,8 @@
{
if(bc == NULL) return;
- bd_release(bc->backing_bdev);
- bd_release(bc->md_bdev);
+ BD_RELEASE(bc->backing_bdev);
+ BD_RELEASE(bc->md_bdev);
fput(bc->lo_file);
fput(bc->md_file);
Modified: trunk/drbd/drbd_nl.c
===================================================================
--- trunk/drbd/drbd_nl.c 2006-12-20 11:49:02 UTC (rev 2637)
+++ trunk/drbd/drbd_nl.c 2006-12-20 14:41:51 UTC (rev 2638)
@@ -40,7 +40,7 @@
#include <linux/drbd_limits.h>
/* see get_sb_bdev and bd_claim */
-char *drbd_sec_holder = "Secondary DRBD cannot be bd_claimed ;)";
+char *drbd_d_holder = "Hands off! this is DRBD's data storage device.";
char *drbd_m_holder = "Hands off! this is DRBD's meta data device.";
@@ -237,20 +237,18 @@
drbd_state_t mask, val;
drbd_disks_t nps;
- if (mdev->this_bdev->bd_contains == 0) {
- // FIXME this masks a bug somewhere else!
- // I think this is a bug outside of DRBD
- mdev->this_bdev->bd_contains = mdev->this_bdev;
- }
-
if ( new_role == Secondary ) {
- /* If I got here, I am Primary. I claim me for myself. If that
- * does not succeed, someone other has claimed me, so I cannot
- * become Secondary. */
- if (bd_claim(mdev->this_bdev,drbd_sec_holder))
- return FailedToClaimMyself;
- if (disable_bd_claim)
- bd_release(mdev->this_bdev);
+ /* If I got here, I am Primary.
+ * I cannot become Secondary as long as someone has an open
+ * file descriptor on me. */
+
+ /* FIXME Race here. we need to lock out openers while we are
+ * deciding whether we can become Secondary or not, so open_cnt
+ * cannot increase while we are still Primary just before we
+ * become Secondary below. */
+
+ if (mdev->open_cnt)
+ return DeviceInUse;
}
if ( new_role == Primary ) {
@@ -323,9 +321,9 @@
dec_net(mdev);
}
set_disk_ro(mdev->vdisk, FALSE );
- D_ASSERT(mdev->this_bdev->bd_holder == drbd_sec_holder);
- bd_release(mdev->this_bdev);
+ /* why?? what for??
mdev->this_bdev->bd_disk = mdev->vdisk;
+ */
if ( ( ( mdev->state.conn < Connected ||
mdev->state.pdsk <= Failed ) &&
@@ -350,11 +348,6 @@
return r;
fail:
- if ( new_role == Secondary ) {
- D_ASSERT(mdev->this_bdev->bd_holder == drbd_sec_holder);
- bd_release(mdev->this_bdev);
- }
-
return r;
}
@@ -391,6 +384,12 @@
sector_t md_size_sect = 0;
switch(bdev->dc.meta_dev_idx) {
default:
+ /* v07 style fixed size indexed meta data */
+ bdev->md.md_size_sect = MD_RESERVED_SECT;
+ bdev->md.md_offset = drbd_md_ss__(mdev,bdev);
+ bdev->md.al_offset = MD_AL_OFFSET;
+ bdev->md.bm_offset = MD_BM_OFFSET;
+ break;
case DRBD_MD_INDEX_FLEX_EXT:
/* just occupy the full device; unit: sectors */
bdev->md.md_size_sect = drbd_get_capacity(bdev->md_bdev);
@@ -421,7 +420,7 @@
}
}
-char* ppsize(char* buf, size_t size)
+char* ppsize(char* buf, unsigned long long size)
{
// Needs 9 bytes at max.
static char units[] = { 'K','M','G','T','P','E' };
@@ -430,7 +429,7 @@
size = size >> 10;
base++;
}
- sprintf(buf,"%ld %cB",(long)size,units[base]);
+ sprintf(buf,"%lu %cB",(long)size,units[base]);
return buf;
}
@@ -458,7 +457,7 @@
size = drbd_new_dev_size(mdev,mdev->bc);
- if( drbd_get_capacity(mdev->this_bdev) != size ||
+ if( drbd_get_capacity(mdev->this_bdev) != size ||
drbd_bm_capacity(mdev) != size ) {
int err;
err = drbd_bm_resize(mdev,size);
@@ -479,8 +478,8 @@
// racy, see comments above.
drbd_set_my_capacity(mdev,size);
mdev->bc->md.la_size_sect = size;
- INFO("size = %s (%lu KB)\n",ppsize(ppb,size>>1),
- (unsigned long)size>>1);
+ INFO("size = %s (%llu KB)\n",ppsize(ppb,size>>1),
+ (unsigned long long)size>>1);
}
if (rv < 0) goto out;
@@ -644,6 +643,8 @@
}
}
+/* does always return 0;
+ * interesting return code is in reply->ret_code */
STATIC int drbd_nl_disk_conf(drbd_dev *mdev, struct drbd_nl_cfg_req *nlp,
struct drbd_nl_cfg_reply *reply)
{
@@ -717,7 +718,7 @@
}
nbc->backing_bdev = inode->i_bdev;
- if (bd_claim(nbc->backing_bdev, mdev)) {
+ if (BD_CLAIM(nbc->backing_bdev, mdev)) {
retcode=LDMounted;
goto fail;
}
@@ -729,7 +730,7 @@
}
nbc->md_bdev = inode2->i_bdev;
- if (bd_claim(nbc->md_bdev,
+ if (BD_CLAIM(nbc->md_bdev,
(nbc->dc.meta_dev_idx==DRBD_MD_INDEX_INTERNAL ||
nbc->dc.meta_dev_idx==DRBD_MD_INDEX_FLEX_INT) ?
(void *)mdev : (void*) drbd_m_holder )) {
@@ -737,7 +738,7 @@
goto release_bdev_fail;
}
- if ( (nbc->backing_bdev==nbc->md_bdev) !=
+ if ( (nbc->backing_bdev==nbc->md_bdev) !=
(nbc->dc.meta_dev_idx==DRBD_MD_INDEX_INTERNAL ||
nbc->dc.meta_dev_idx==DRBD_MD_INDEX_FLEX_INT) ) {
retcode=LDMDInvalid;
@@ -779,7 +780,7 @@
// -- up to here
// Make sure the new disk is big enough
- if (drbd_get_capacity(nbc->backing_bdev) <
+ if (drbd_get_capacity(nbc->backing_bdev) <
drbd_get_capacity(mdev->this_bdev) ) {
retcode = LDDeviceTooSmall;
goto release_bdev2_fail;
@@ -793,39 +794,43 @@
retcode = drbd_md_read(mdev,nbc);
if ( retcode != NoError ) {
- goto release_bdev3_fail;
+ goto force_diskless;
}
// Since we are diskless, fix the AL first...
if (drbd_check_al_size(mdev)) {
retcode = KMallocFailed;
- goto release_bdev3_fail;
+ goto force_diskless;
}
// Prevent shrinking of consistent devices !
if(drbd_md_test_flag(nbc,MDF_Consistent) &&
drbd_new_dev_size(mdev,nbc) < nbc->md.la_size_sect) {
retcode = LDDeviceTooSmall;
- goto release_bdev3_fail;
+ goto force_diskless;
}
if(!drbd_al_read_log(mdev,nbc)) {
retcode = MDIOError;
- goto release_bdev3_fail;
+ goto force_diskless;
}
- // Point of no return reached.
+ /* Point of no return reached.
+ * Devices and memory are no longer released by error cleanup below.
+ * now mdev takes over responsibility, and the state engine should
+ * clean it up somewhere. */
+ D_ASSERT(mdev->bc == NULL);
+ mdev->bc = nbc;
+ mdev->resync = resync_lru;
+ nbc = NULL;
+ resync_lru = NULL;
- if(drbd_md_test_flag(nbc,MDF_PrimaryInd)) {
+ if(drbd_md_test_flag(mdev->bc,MDF_PrimaryInd)) {
set_bit(CRASHED_PRIMARY, &mdev->flags);
- } else {
+ } else {
clear_bit(CRASHED_PRIMARY, &mdev->flags);
}
- D_ASSERT(mdev->bc == NULL);
- mdev->bc = nbc;
- mdev->resync = resync_lru;
-
mdev->send_cnt = 0;
mdev->recv_cnt = 0;
mdev->read_cnt = 0;
@@ -866,13 +871,13 @@
drbd_bm_set_all(mdev);
if (unlikely(drbd_bm_write(mdev) < 0)) {
retcode = MDIOError;
- goto release_bdev3_fail;
+ goto unlock_bm;
}
drbd_md_clear_flag(mdev,MDF_FullSync);
} else {
if (unlikely(drbd_bm_read(mdev) < 0)) {
retcode = MDIOError;
- goto release_bdev3_fail;
+ goto unlock_bm;
}
}
@@ -887,9 +892,9 @@
spin_lock_irq(&mdev->req_lock);
os = mdev->state;
ns.i = os.i;
- /* If MDF_Consistent is not set go into inconsistent state,
+ /* If MDF_Consistent is not set go into inconsistent state,
otherwise investige MDF_WasUpToDate...
- If MDF_WasUpToDate is not set go into Outdated disk state,
+ If MDF_WasUpToDate is not set go into Outdated disk state,
otherwise into Consistent state.
*/
if(drbd_md_test_flag(mdev->bc,MDF_Consistent)) {
@@ -901,18 +906,18 @@
} else {
ns.disk = Inconsistent;
}
-
+
if(drbd_md_test_flag(mdev->bc,MDF_PeerOutDated)) {
ns.pdsk = Outdated;
}
-
- if( ns.disk == Consistent &&
- ( ns.pdsk == Outdated || nbc->dc.fencing == DontCare ) ) {
+
+ if( ns.disk == Consistent &&
+ ( ns.pdsk == Outdated || mdev->bc->dc.fencing == DontCare ) ) {
ns.disk = UpToDate;
}
- /* All tests on MDF_PrimaryInd, MDF_ConnectedInd,
- MDF_Consistent and MDF_WasUpToDate must happen before
+ /* All tests on MDF_PrimaryInd, MDF_ConnectedInd,
+ MDF_Consistent and MDF_WasUpToDate must happen before
this point, because drbd_request_state() modifies these
flags. */
@@ -929,9 +934,8 @@
spin_unlock_irq(&mdev->req_lock);
if (rv==SS_Success) after_state_ch(mdev,os,ns,ChgStateVerbose);
- if(rv < SS_Success ) {
- drbd_bm_unlock(mdev);
- goto release_bdev3_fail;
+ if (rv < SS_Success) {
+ goto unlock_bm;
}
drbd_bm_unlock(mdev);
@@ -940,20 +944,15 @@
reply->ret_code = retcode;
return 0;
- release_bdev3_fail:
+ unlock_bm:
drbd_bm_unlock(mdev);
-
- /* The following will be freed by state change below */
- nbc = NULL;
- resync_lru = NULL;
-
+ force_diskless:
drbd_force_state(mdev,NS(disk,Diskless));
drbd_md_sync(mdev);
- goto fail;
release_bdev2_fail:
- bd_release(nbc->md_bdev);
+ if (nbc) BD_RELEASE(nbc->md_bdev);
release_bdev_fail:
- bd_release(nbc->backing_bdev);
+ if (nbc) BD_RELEASE(nbc->backing_bdev);
fail:
if (nbc) {
if (nbc->lo_file) fput(nbc->lo_file);
Modified: trunk/drbd/drbd_req.c
===================================================================
--- trunk/drbd/drbd_req.c 2006-12-20 11:49:02 UTC (rev 2637)
+++ trunk/drbd/drbd_req.c 2006-12-20 14:41:51 UTC (rev 2638)
@@ -1009,7 +1009,7 @@
return 1;
if (mdev->state.role != Primary &&
- ( !disable_bd_claim || is_write) ) {
+ ( !allow_oos || is_write) ) {
if (DRBD_ratelimit(5*HZ,5)) {
ERR("Process %s[%u] tried to %s; since we are not in Primary state, we cannot allow this\n",
current->comm, current->pid, is_write ? "WRITE" : "READ");
@@ -1026,7 +1026,7 @@
* to serialize state changes, this is racy, since we may lose
* the connection *after* we test for the cstate.
*/
- if ( mdev->state.disk <= Inconsistent &&
+ if ( mdev->state.disk < UpToDate &&
mdev->state.conn < Connected) {
if (DRBD_ratelimit(5*HZ,5)) {
ERR("Sorry, I have no access to good data anymore.\n");
@@ -1037,7 +1037,6 @@
return 1;
}
-
return 0;
}
Modified: trunk/drbd/linux/drbd.h
===================================================================
--- trunk/drbd/linux/drbd.h 2006-12-20 11:49:02 UTC (rev 2637)
+++ trunk/drbd/linux/drbd.h 2006-12-20 14:41:51 UTC (rev 2638)
@@ -105,7 +105,7 @@
PauseFlagAlreadySet,
PauseFlagAlreadyClear,
DiskLowerThanOutdated,
- FailedToClaimMyself,
+ DeviceInUse,
UnknownNetLinkPacket,
HaveNoDiskConfig,
ProtocolCRequired,
@@ -123,7 +123,6 @@
Primary=1, // role
Secondary=2, // role
role_mask=3,
- DontBlameDrbd=4 // flag for set_state
} drbd_role_t;
/* The order of these constants is important.
Modified: trunk/user/drbdmeta.c
===================================================================
--- trunk/user/drbdmeta.c 2006-12-20 11:49:02 UTC (rev 2637)
+++ trunk/user/drbdmeta.c 2006-12-20 14:41:51 UTC (rev 2638)
@@ -260,7 +260,7 @@
char *md_device_name; /* well, in 06 it is file name */
char *drbd_dev_name;
int lock_fd;
- int drbd_fd;
+ int drbd_fd; /* no longer used! */
int ll_fd; /* not yet used here */
int md_fd;
@@ -2503,14 +2503,18 @@
}
ai++;
- cfg->drbd_fd = dt_lock_open_drbd(cfg->drbd_dev_name, &cfg->lock_fd, 1);
- if (cfg->drbd_fd > -1) {
- if (is_attached(dt_minor_of_dev(cfg->drbd_dev_name))) {
- if (!(force && (command->function == meta_dump_md))) {
- fprintf(stderr, "Device '%s' is configured!\n",
- cfg->drbd_dev_name);
- exit(20);
- }
+ /* does exit() unless we aquired the lock.
+ * unlock happens implicitly when the process dies,
+ * but may be requested implicitly
+ */
+ cfg->lock_fd = dt_lock_drbd(cfg->drbd_dev_name);
+
+ /* unconditionally check whether this is in use */
+ if (is_attached(dt_minor_of_dev(cfg->drbd_dev_name))) {
+ if (!(force && (command->function == meta_dump_md))) {
+ fprintf(stderr, "Device '%s' is configured!\n",
+ cfg->drbd_dev_name);
+ exit(20);
}
}
Modified: trunk/user/drbdsetup.c
===================================================================
--- trunk/user/drbdsetup.c 2006-12-20 11:49:02 UTC (rev 2637)
+++ trunk/user/drbdsetup.c 2006-12-20 14:41:51 UTC (rev 2638)
@@ -377,7 +377,7 @@
EM(PauseFlagAlreadySet) = "PauseFlagAlreadySet",
EM(PauseFlagAlreadyClear) = "PauseFlagAlreadyClear",
EM(DiskLowerThanOutdated) = "DiskLowerThanOutdated",
- EM(FailedToClaimMyself) = "FailedToClaimMyself",
+ EM(DeviceInUse) = "DeviceInUse",
EM(HaveNoDiskConfig) = "HaveNoDiskConfig",
EM(ProtocolCRequired) = "ProtocolCRequired"
};
@@ -1614,7 +1614,7 @@
int main(int argc, char** argv)
{
int minor;
- // int drbd_fd,lock_fd;
+ int lock_fd;
struct drbd_cmd *cmd;
int rv=0;
@@ -1640,12 +1640,12 @@
cmd=find_cmd_by_name(argv[2]);
if(cmd) {
- //drbd_fd = dt_lock_open_drbd(argv[1], &lock_fd, 1 );
+ lock_fd = dt_lock_drbd(argv[1]);
minor=dt_minor_of_dev(argv[1]);
- rv = cmd->function(cmd,minor,argc-2,argv+2);
// by passing argc-2, argv+2 the function has the command name
// in argv[0], e.g. "syncer"
- //dt_close_drbd_unlock(drbd_fd,lock_fd);
+ rv = cmd->function(cmd,minor,argc-2,argv+2);
+ dt_unlock_drbd(lock_fd);
} else {
print_usage("invalid command");
}
Modified: trunk/user/drbdtool_common.c
===================================================================
--- trunk/user/drbdtool_common.c 2006-12-20 11:49:02 UTC (rev 2637)
+++ trunk/user/drbdtool_common.c 2006-12-20 14:41:51 UTC (rev 2638)
@@ -218,21 +218,14 @@
}
-int dt_lock_open_drbd(const char* device, int *lock_fd, int open_may_fail)
+int dt_lock_drbd(const char* device)
{
- int drbd_fd, lfd;
+ int lfd;
struct stat drbd_stat;
char lfname[40];
int dev_major,dev_minor;
- drbd_fd=open(device,O_RDONLY);
- if(drbd_fd==-1 && !open_may_fail) {
- PERROR("can not open %s", device);
- exit(20);
- }
-
dev_major = 147; //LANANA_DRBD_MAJOR;
-
if( !stat(device, &drbd_stat) ) {
if(!S_ISBLK(drbd_stat.st_mode)) {
@@ -275,17 +268,13 @@
lfd = get_fd_lockfile_timeout(lfname,1);
if (lfd < 0)
exit(20);
- if (lock_fd) *lock_fd = lfd;
-
- return drbd_fd;
+ return lfd;
}
-int dt_close_drbd_unlock(int drbd_fd, int lock_fd)
+/* ignore errors */
+void dt_unlock_drbd(int lock_fd)
{
- int err = 0;
- if (drbd_fd >= 0) err = close(drbd_fd);
- if (lock_fd >= 0) unlock_fd(lock_fd); /* ignore errors */
- return err;
+ if (lock_fd >= 0) unlock_fd(lock_fd);
}
void dt_print_gc(const __u32* gen_cnt)
Modified: trunk/user/drbdtool_common.h
===================================================================
--- trunk/user/drbdtool_common.h 2006-12-20 11:49:02 UTC (rev 2637)
+++ trunk/user/drbdtool_common.h 2006-12-20 14:41:51 UTC (rev 2638)
@@ -25,8 +25,8 @@
struct option;
-extern int dt_lock_open_drbd(const char* device, int *lock_fd, int open_may_fail);
-extern int dt_close_drbd_unlock(int drbd_fd, int lock_fd);
+extern int dt_lock_drbd(const char* device);
+extern void dt_unlock_drbd(int lock_fd);
extern void dt_release_lockfile(int drbd_fd);
extern int dt_minor_of_dev(const char *device);
extern unsigned long long m_strtoll(const char* s,const char def_unit);
More information about the drbd-cvs
mailing list